暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

[ACDU 翻译] MySQL 15.8.3.1 配置 InnoDB 缓冲池大小

原创 由迪 2022-03-15
980

您可以InnoDB离线或在服务器运行时配置缓冲池大小。本节中描述的行为适用于这两种方法。有关在线配置缓冲池大小的其他信息,请参阅在线 配置 InnoDB 缓冲池大小

当增加或减少 innodb_buffer_pool_size时,操作是分块执行的。块大小由 innodb_buffer_pool_chunk_size 配置选项定义,默认值为 128M. 有关更多信息,请参阅 配置 InnoDB 缓冲池块大小

缓冲池大小必须始终等于或倍数 innodb_buffer_pool_chunk_size* innodb_buffer_pool_instances。如果配置 innodb_buffer_pool_size为不等于或倍数 innodb_buffer_pool_chunk_size* innodb_buffer_pool_instances的值,缓冲池大小会自动调整为等于或倍数 innodb_buffer_pool_chunk_size* 的值innodb_buffer_pool_instances

在以下示例中, innodb_buffer_pool_size设置为8G,并且 innodb_buffer_pool_instances设置为16innodb_buffer_pool_chunk_size128M,这是默认值。

8G`是一个有效值 ,[`innodb_buffer_pool_size`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size)因为它是 * `8G` 的倍数 ,即. [`innodb_buffer_pool_instances=16`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_instances)[`innodb_buffer_pool_chunk_size=128M`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_chunk_size)`2G
$> mysqld --innodb-buffer-pool-size=8G --innodb-buffer-pool-instances=16
mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
|                           8.000000000000 |
+------------------------------------------+

在此示例中, innodb_buffer_pool_size设置为9G,并且 innodb_buffer_pool_instances设置为16innodb_buffer_pool_chunk_size128M,这是默认值。在这种情况下,9G不是 innodb_buffer_pool_instances=16 * 的倍数innodb_buffer_pool_chunk_size=128M,所以innodb_buffer_pool_size调整为10G,它是 innodb_buffer_pool_chunk_size* 的倍数innodb_buffer_pool_instances

$> mysqld --innodb-buffer-pool-size=9G --innodb-buffer-pool-instances=16
mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
|                          10.000000000000 |
+------------------------------------------+
配置 InnoDB 缓冲池块大小

innodb_buffer_pool_chunk_size 可以以 1MB(1048576 字节)为单位增加或减少,但只能在启动时、命令行字符串或 MySQL 配置文件中修改。

命令行:

$> mysqld --innodb-buffer-pool-chunk-size=134217728

配置文件:

[mysqld] innodb_buffer_pool_chunk_size=134217728

更改时适用以下条件 innodb_buffer_pool_chunk_size

  • 如果在初始化缓冲池时新innodb_buffer_pool_chunk_size值 * innodb_buffer_pool_instances 大于当前缓冲池大小, innodb_buffer_pool_chunk_size 则截断为 innodb_buffer_pool_size/ innodb_buffer_pool_instances

    例如,如果缓冲池的大小为2GB(2147483648 字节), 4缓冲池实例和块大小为1GB(1073741824 字节),则块大小被截断为等于 innodb_buffer_pool_size/ 的值innodb_buffer_pool_instances,如下所示:

    $> mysqld --innodb-buffer-pool-size=2147483648 --innodb-buffer-pool-instances=4
    --innodb-buffer-pool-chunk-size=1073741824;
    
    mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 2147483648 | +---------------------------+ mysql> SELECT @@innodb_buffer_pool_instances; +--------------------------------+ | @@innodb_buffer_pool_instances | +--------------------------------+ | 4 | +--------------------------------+ # Chunk size was set to 1GB (1073741824 bytes) on startup but was # truncated to innodb_buffer_pool_size / innodb_buffer_pool_instances mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 536870912 | +---------------------------------+
  • 缓冲池大小必须始终等于或倍数 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances。如果更改 innodb_buffer_pool_chunk_size, innodb_buffer_pool_size 会自动调整为等于或倍数 innodb_buffer_pool_chunk_size * 的值innodb_buffer_pool_instances。调整发生在缓冲池初始化时。以下示例演示了此行为:

    # The buffer pool has a default size of 128MB (134217728 bytes) mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 134217728 | +---------------------------+ # The chunk size is also 128MB (134217728 bytes) mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 134217728 | +---------------------------------+ # There is a single buffer pool instance mysql> SELECT @@innodb_buffer_pool_instances; +--------------------------------+ | @@innodb_buffer_pool_instances | +--------------------------------+ | 1 | +--------------------------------+ # Chunk size is decreased by 1MB (1048576 bytes) at startup # (134217728 - 1048576 = 133169152): $> mysqld --innodb-buffer-pool-chunk-size=133169152 mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 133169152 | +---------------------------------+ # Buffer pool size increases from 134217728 to 266338304 # Buffer pool size is automatically adjusted to a value that is equal to # or a multiple of innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 266338304 | +---------------------------+

    此示例演示了相同的行为,但具有多个缓冲池实例:

    # The buffer pool has a default size of 2GB (2147483648 bytes) mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 2147483648 | +---------------------------+ # The chunk size is .5 GB (536870912 bytes) mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 536870912 | +---------------------------------+ # There are 4 buffer pool instances mysql> SELECT @@innodb_buffer_pool_instances; +--------------------------------+ | @@innodb_buffer_pool_instances | +--------------------------------+ | 4 | +--------------------------------+ # Chunk size is decreased by 1MB (1048576 bytes) at startup # (536870912 - 1048576 = 535822336): $> mysqld --innodb-buffer-pool-chunk-size=535822336 mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 535822336 | +---------------------------------+ # Buffer pool size increases from 2147483648 to 4286578688 # Buffer pool size is automatically adjusted to a value that is equal to # or a multiple of innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 4286578688 | +---------------------------+

    更改时应小心 innodb_buffer_pool_chunk_size,因为更改此值会增加缓冲池的大小,如上面的示例所示。在更改之前 innodb_buffer_pool_chunk_size,请计算影响 innodb_buffer_pool_size 以确保生成的缓冲池大小是可以接受的。

笔记

为避免潜在的性能问题,块 ( innodb_buffer_pool_size/ innodb_buffer_pool_chunk_size) 的数量不应超过 1000。

在线配置 InnoDB 缓冲池大小

innodb_buffer_pool_size 配置选项可以使用语句动态设置 ,SET允许您在不重新启动服务器的情况下调整缓冲池的大小。例如:

mysql> SET GLOBAL innodb_buffer_pool_size=402653184;

笔记

缓冲池大小必须等于或倍数 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances。更改这些变量设置需要重新启动服务器。

通过执行的活动事务和操作 InnoDB应在调整缓冲池大小之前完成 API。启动调整大小操作时,直到所有活动事务都完成后操作才会开始。一旦调整大小操作正在进行,需要访问缓冲池的新事务和操作必须等到调整大小操作完成。该规则的例外是允许对缓冲池进行并发访问,同时对缓冲池进行碎片整理,并在缓冲池大小减小时撤回页面。允许并发访问的一个缺点是它可能导致在页面被撤回时可用页面暂时短缺。

笔记

如果在缓冲池大小调整操作开始后启动嵌套事务,则可能会失败。

监控在线缓冲池大小调整进度

报告 Innodb_buffer_pool_resize_status 缓冲池大小调整进度。例如:

mysql> SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status'; +----------------------------------+----------------------------------+ | Variable_name | Value | +----------------------------------+----------------------------------+ | Innodb_buffer_pool_resize_status | Resizing also other hash tables. | +----------------------------------+----------------------------------+

缓冲池大小调整进度也记录在服务器错误日志中。此示例显示了增加缓冲池大小时记录的注释:

[Note] InnoDB: Resizing buffer pool from 134217728 to 4294967296. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was added.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 134217728 to 4294967296.
[Note] InnoDB: re-enabled adaptive hash index.

此示例显示减小缓冲池大小时记录的注释:

[Note] InnoDB: Resizing buffer pool from 4294967296 to 134217728. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : start to withdraw the last 253952 blocks.
[Note] InnoDB: buffer pool 0 : withdrew 253952 blocks from free list. tried to relocate 0 pages.
(253952/253952)
[Note] InnoDB: buffer pool 0 : withdrawn target 253952 blocks.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was freed.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 4294967296 to 134217728.
[Note] InnoDB: re-enabled adaptive hash index.
在线缓冲池大小调整内部结构

调整大小操作由后台线程执行。增加缓冲池大小时,调整大小操作:

  • 添加页面chunks(块大小由 定义 innodb_buffer_pool_chunk_size
  • 转换哈希表、列表和指针以使用内存中的新地址
  • 将新页面添加到空闲列表

当这些操作正在进行时,其他线程被阻止访问缓冲池。

减小缓冲池大小时,调整大小操作:

  • 对缓冲池进行碎片整理并撤回(释放)页面
  • 删除页面chunks(块大小由 定义 innodb_buffer_pool_chunk_size
  • 转换哈希表、列表和指针以使用内存中的新地址

在这些操作中,只有对缓冲池进行碎片整理和撤回页面允许其他线程同时访问缓冲池。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论