InnoDB 内存结构之缓冲池

这篇具有很好参考价值的文章主要介绍了InnoDB 内存结构之缓冲池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

缓冲池是主存储器中的一个区域,在访问 table 和索引数据时InnoDB会对其进行缓存。缓冲池允许直接从内存中访问频繁使用的数据,从而加快处理速度。在专用服务器上,通常将高达 80% 的物理内存分配给缓冲池。

为了高效处理大量读取操作,缓冲池被划分为可以容纳多行数据的页面。为了有效管理缓存,缓冲池被实现为页面的链接列表;通过 LRU(least recently used)算法的变体将很少使用的数据从缓存中淘汰出去。

了解如何利用缓冲池将频繁访问的数据保留在内存中是MySQL调优的重要方面之一。

缓冲池 LRU 算法

缓冲池使用一种最近最少使用(LRU)算法的变体作为列表进行管理。当需要空间以将新页面添加到缓冲池时,最近最少使用的页面会被移除,并将新页面添加到列表的中间。这种中点插入策略将列表视为两个子列表:

  • 在前面是最近访问过的新("young")页面的子列表;
  • 在尾部是最近较少被访问的旧("old")页面子列表。

缓冲池列表如下图所示:

InnoDB 内存结构之缓冲池

该算法将频繁使用的页面保留在新页面子列表中。旧页面子列表则包含较少被使用的页面,这些页面是可能被淘汰(eviction)的候选页面。

默认情况下,算法运行如下:

  • 缓冲池的 3/8 专门用于旧页面子列表。
  • 列表的中点是新页面子列表的尾部与旧页面子列表的头部相遇的边界位置。
  • InnoDB将一个页面读入缓冲池时,它最初会插入到中点位置(旧页面子列表的头部)。一个页面可以被读取,因为它是用户发起的操作(例如 SQL 查询)所必需的,或者是InnoDB自动执行的预读(read-ahead)操作的一部分。
  • 访问旧页面子列表中的一个页面会使其变为"young",并将其移动到新页面子列表的开头。如果页面由于用户发起的操作而被读取,则将立即进行首次访问,并且页面会被标记为"young"。如果页面是由于预读操作而被读取,则第一次访问不会立即发生,并且在该页面被淘汰之前可能根本不会发生。
  • 随着数据库的运行,缓冲池中未被访问的页面会通过向列表的尾部移动而"老化"。新页面子列表和旧页面子列表中的页面都会随着其他页面的更新而老化。旧页面子列表中的页面也会随着在中点插入页面而老化。最终,一个长时间未被使用的页面会到达旧页面子列表的尾部并被淘汰。

默认情况下,通过查询读取的页面会立即移动到新页面子列表中,这意味着它们在缓冲池中停留的时间更长。例如,对于执行mysqldump操作或不带WHERE子句的SELECT语句进行的表扫描,可能会将大量数据带入缓冲池,并淘汰相同数量的较旧数据,即使新数据永远不会再次使用。同样地,由预读取后台线程加载且仅访问一次的页面会移动到新页面子列表的开头。这些情况会将频繁使用的页面推入旧页面子列表,使其面临淘汰的风险。关于优化这种行为的信息,请参阅"使缓冲池具有扫描抵抗力"和"配置 InnoDB 缓冲池预取(预读)"。

InnoDB标准监视器(Standard Monitor)的输出在BUFFER POOL AND MEMORY部分中包含了几个与缓冲池 LRU 算法操作有关的字段。有关详细信息,请参阅使用 InnoDB 标准监视器监控缓冲池。

缓冲区配置

您可以配置缓冲池的各个方面以提高性能。

  • 理想情况下,您应该将缓冲池的大小设置为尽可能大的值,同时确保为服务器上的其他进程留有足够的内存,以避免过多的页面交换(paging)。缓冲池越大,InnoDB就更像是一个内存数据库,从磁盘读取一次数据,然后在后续读取从内存中访问数据。有关详细信息,请参阅"配置 InnoDB 缓冲池大小"。
  • 在具有足够内存的64位系统上,可以将缓冲池分成多个部分,以最大程度地减少并发操作之间对内存结构的争用。有关详细信息,请参阅"配置多个缓冲池实例"。
  • 您可以将频繁访问的数据保留在内存中,而不受会将大量不经常访问的数据带入缓冲池的操作突然活动的影响。有关详细信息,请参阅"使缓冲池具有扫描抵抗力"。
  • 您可以控制何时以及如何执行预读请求,以异步方式将页面预取到缓冲池中,从而期望这些页面很快会被使用。有关详细信息,请参阅"配置 InnoDB 缓冲池预取(预读)"。
  • 您可以控制何时进行后台刷新,以及是否根据工作负载动态调整刷新速率。有关详细信息,请参阅"配置缓冲池刷新"。
  • 您可以配置InnoDB保存当前的缓冲池状态的方式,以避免服务器重新启动后的漫长预热时间。有关详细信息,请参阅"保存和恢复缓冲池状态"。

使用 InnoDB 标准监视器监控缓冲池

可以使用SHOW ENGINE INNODB STATUS访问InnoDB标准监视器输出提供的有关缓冲池操作的指标。缓冲池指标位于InnoDB标准监视器输出的BUFFER POOL AND MEMORY部分:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 2198863872
Dictionary memory allocated 776332
Buffer pool size   131072
Free buffers       124908
Database pages     5720
Old database pages 2071
Modified db pages  910
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 4, not young 0
0.10 youngs/s, 0.00 non-youngs/s
Pages read 197, created 5523, written 5060
0.00 reads/s, 190.89 creates/s, 244.94 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not
0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read
ahead 0.00/s
LRU len: 5720, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

下表描述了InnoDB标准监视器报告的缓冲池指标。

注:InnoDB标准监视器输出中提供的每秒平均值是基于自上次打印InnoDB标准监视器输出以来经过的时间计算的。

InnoDB 缓冲池指标如下表所示:

Name Description
Total memory allocated 为缓冲池分配的总内存(以字节为单位)。
Dictionary memory allocated InnoDB数据字典分配的总内存(以字节为单位)。
Buffer pool size 分配给缓冲池的页面总大小。
Free buffers 缓冲池空闲列表的页面总大小。
Database pages 缓冲池 LRU 列表的页面总大小。
Old Database pages 缓冲池旧 LRU 子列表的页面总大小。
Modified db pages 当前在缓冲池中修改的页面数。
Pending reads 等待读入缓冲池的缓冲池页面数。
Pending writes LRU 从 LRU 列表底部等待写入缓冲池中旧脏页的数量。
Pending writes flush list 检查点期间要刷新的缓冲池页面数。
Pending writes single page 缓冲池中暂挂的独立页面写入数。
Pages made young 缓冲池 LRU 列表中变年轻的页面总数(移至“新”页面的子列表的开头)。
Pages made not young 缓冲池 LRU 列表中没有变年轻的页面总数(保留在“旧”页面子列表中没有年轻的页面)。
youngs/s 在缓冲池 LRU 列表中,平均每秒访问旧页面并使其变为年轻页面的次数。有关更多信息,请参阅此表格后面的注释。
non-youngs/s 在缓冲池 LRU 列表中,平均每秒访问旧页面并未导致页面变为年轻页面的次数。有关更多信息,请参阅此表格后面的注释。
Pages read 从缓冲池读取的页面总数。
Pages created 在缓冲池中创建的页面总数。
Pages written 从缓冲池写入的页面总数。
reads/s 平均每秒读取的缓冲池页面数。
creates/s 平均每秒创建的缓冲池页面数。
writes/s 平均每秒缓冲池页面写入数。
Buffer pool hit rate 从缓冲池读取的页面与从磁盘存储读取的页面之间的缓冲池页面命中率。
young-making rate 页面访问导致页面变为年轻页面的平均命中率。有关更多信息,请参阅此表格后面的注释。
not (young-making rate) 页面访问未使页面变年轻的平均命中率。有关更多信息,请参见此表格后面的注释。
Pages read ahead 平均每秒的预读操作次数。
Pages evicted without access 平均每秒从缓冲池中淘汰而被访问的页面数量。
Random read ahead 平均每秒随机预读操作次数。
LRU len 缓冲池 LRU 列表的页面总大小。
unzip_LRU len 缓冲池 unzip_LRU 列表的长度(以页面为单位)。
I/O sum 访问的缓冲池 LRU 列表页面总数。
I/O cur 当前间隔内访问的缓冲池 LRU 列表页面总数。
I/O unzip sum 已访问的缓冲池 unzip_LRU 列表页面的总数。
I/O unzip cur 当前时间间隔内已访问的缓冲池 unzip_LRU 列表页面的总数。

Notes

  • 年轻页面生成速率youngs/s指标仅适用于旧页面。它基于页面的访问次数而不是页面数计算。对于给定页面,可能会有多次访问,所有访问都会被计算在内。如果在没有进行大规模扫描的情况下youngs/s非常低,则可能需要减少延迟时间或增加用于旧子列表的缓冲池百分比。增加百分比会使旧子列表变大,因此需要更长的时间才能将该子列表中的页面移动到尾部,从而增加这些页面再次被访问并成为年轻页面的可能性。请参阅“使缓冲池抗扫描”。

  • 非年轻页面生成速率non-youngs/s指标仅适用于旧页面,它基于页面的访问次数而不是页面数计算。对于给定页面,可能会有多次访问,所有访问都会被计算在内。如果在执行大型表扫描(以及较高的youngs/s)时没有看到更高的非年轻页面生成速率值non-youngs/s,请增加延迟值。请参阅“使缓冲池抗扫描”。

  • 年轻页面生成率young-making考虑了所有缓冲池页面的访问,而不仅仅是旧子列表中页面的访问。年轻页面生成率young-making和非年轻页面生成率non-youngs/s通常不会累加到整体缓冲池命中率上。在旧子列表中的页面命中会导致页面移动到新子列表,但是新子列表中的页面命中只有当它们距离列表头部一定距离时才会移动到列表头部。

  • 非(年轻页面生成率)not (young-making rate)是指由于未达到由innodb_old_blocks_time定义的延迟时间,或由于新子列表中的页面命中未导致页面移动到头部,而导致页面访问未使页面变为年轻页面的平均命中率。此率考虑了所有缓冲池页面的访问,而不仅仅是旧子列表中页面的访问。

缓冲池服务器状态变量和INNODB_BUFFER_POOL_STATS表提供了许多与InnoDB Standard Monitor 输出中相同的缓冲池指标。有关更多信息,请参阅示例“查询INNODB_BUFFER_POOL_STATS table”。

注:原文来自 MySQL 5.7 官方文档,阅读 MySQL 中文文档时有些语句理解不顺畅,便结合中文文档使用 ChatGPT 进行了翻译,如有不正请指出。文章来源地址https://www.toymoban.com/news/detail-491578.html

到了这里,关于InnoDB 内存结构之缓冲池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROM、RAM、内存、内存条、外存、内部存储器、外部存储器、FLASH等之间的关系

    ​   各位看到这一系列的名词,是否也曾感受到一头雾水?研究了一上午终于理清了它们之间的关系,直接上图说明,相信你看完也能恍然大悟!若有错误麻烦在评论区指出。 这里有几点需要明确: 存BOIS的ROM也属于内存(因为CPU也可以对其直接寻址),但我们生活中常说

    2023年04月26日
    浏览(53)
  • 内存管理:存储器管理

    内存管理的主要功能: 内存空间的分配与回收 。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储器分配的麻烦,提高编程效率 地址转换 。在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,存储器必须系统地址变换功能 内存空间的扩充

    2023年04月09日
    浏览(48)
  • STM32微机系统框架、内存、存储器、寄存器

    大家好,我是 杰哥嵌入式开发 最近在出定时器系列, 但是线下班有一些学生在学习完C语言之后, 在51接触各种寄存器和对软件代码各种操作是如何在单片机系统中起到作用的感到非常的不解, 经过我的初步分析,是对嵌入式微机系统的大概雏形系统框架不熟悉导致。 所以

    2024年02月06日
    浏览(55)
  • 存储器的结构

    存储的基本结构如下: 控制逻辑会给出读写操作信号: 读操作时,控制逻辑会给出信号,读出相应的存储器单元的数据,然后交给数据寄存器。 写操作时,数据寄存器会先寄存数据,然后通知控制逻辑给出写信号,写入到相应的存储器元。 如下图所示,一个存储体是由很多

    2023年04月19日
    浏览(36)
  • 【FLASH存储器系列三】FLASH存储阵列结构及存储原理

    👉个人主页: highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 目录 1 Flash存储阵列结构及存储原理 1.1 NOR flash 1.2 NAND flash         我们有了基本存储单元后,就要通过某种方式将基本存储单元连接到字线和位线上,通过选中字线和

    2024年02月09日
    浏览(42)
  • 计算机中存储器的层次结构

    现代的存储器体系结构是这样的: 越往上访问速度越快,更小,成本也越高。越往下访问速度越慢,更大,成本也越低。 在最高层(L0)是少量快速的CPU寄存器,CPU可以在一个时钟周期内访问他们。接下来是一个或多个小型到中型的基于SRAM高速缓存存储器。可以在几个CPU时

    2024年02月14日
    浏览(52)
  • 【单片机】单片机存储器结构

    单片机内部存储结构分析    我们来思考一个问题,当我们在编程器中把一条指令写进单片要内部,然后取下单片机,单片机就可以执行这条指令,那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢

    2024年04月12日
    浏览(47)
  • 深入理解计算机系统(13)_存储器层次结构

    第一章 计算机的基本组成 1. 内容概述 2. 计算机基本组成 第二章 计算机的指令和运算 3. 计算机指令 4. 程序的机器级表示 5. 计算机运算 6. 信息表示与处理 第三章 处理器设计 7. CPU 8. 处理器体系结构 9. 优化程序性能 10. 其他处理器 第四章 存储器和IO系统 11. 存储器的层次结构

    2024年02月16日
    浏览(32)
  • 计算机组成与体系结构第二次试验:存储器实验

    为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正! 本实验的主要内容是了解 RAM(Random Access Memory,静态随机存储器)和ROM(Read Only Memory,只读存储器)

    2024年02月08日
    浏览(47)
  • Verilog实现FPGA可编程电路中的RAM存储器

    Verilog实现FPGA可编程电路中的RAM存储器 在FPGA可编程电路的设计中,RAM存储器通常被广泛使用。而手写RAM存储器则可以提供更加灵活、高效的设计方案。本文将介绍如何使用Verilog语言来手写FPGA中的RAM存储器。 首先,我们需要确定RAM存储器的大小和宽度。假设我们需要实现一个

    2024年02月04日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包