某些硬件和操作系统体系结构支持大于默认值(通常为 4KB)的内存页面。这种支持的实际实现取决于底层硬件和操作系统。由于减少了转换后备缓冲区 (TLB) 未命中,执行大量内存访问的应用程序可以通过使用大页面来获得性能提升。
在 MySQL 中,InnoDB
可以使用大页面为其缓冲池和附加内存池分配内存。
MySQL 中大页面的标准使用尝试使用支持的最大大小,最大为 4MB。在 Solaris 下,“超级大页面”功能允许使用最大 256MB 的页面。此功能适用于最新的 SPARC 平台。可以使用 --super-large-pages
或 --skip-super-large-pages
选项启用或禁用此功能。
MySQL 还支持大页面支持的 Linux 实现(在 Linux 中称为 HugeTLB)。
在 Linux 上可以使用大页面之前,必须启用内核以支持它们,并且需要配置 HugeTLB 内存池。作为参考,HugeTBL API 在 Linux 源代码的 Documentation/vm/hugetlbpage.txt
文件中进行了说明。
某些最新系统的内核(例如 Red Hat Enterprise Linux)可能默认启用了大页面功能。要检查您的内核是否属于这种情况,请使用以下命令并查找包含 “huge” 的输出行
$> grep -i huge /proc/meminfo
AnonHugePages: 2658304 kB
ShmemHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
非空命令输出表示存在大页面支持,但零值表示未配置任何页面以供使用。
如果您的内核需要重新配置以支持大页面,请参阅 hugetlbpage.txt
文件以获取说明。
假设您的 Linux 内核已启用大页面支持,请使用以下步骤将其配置为供 MySQL 使用
确定所需的大页面数量。这是 InnoDB 缓冲池的大小除以大页面大小,我们可以将其计算为
innodb_buffer_pool_size
/Hugepagesize
。假设innodb_buffer_pool_size
的默认值为 128MB,并且使用从/proc/meminfo
获取的Hugepagesize
值(2MB),则为 128MB / 2MB,即 64 个 Huge Pages。我们将此值称为P
。以系统 root 身份,在文本编辑器中打开文件
/etc/sysctl.conf
,并添加此处显示的行,其中P
是在上一步中获得的大页面数量vm.nr_hugepages=P
使用之前获得的实际值,添加的行应如下所示
vm.nr_hugepages=66
保存更新后的文件。
以系统 root 身份,运行以下命令
$> sudo sysctl -p
注意在某些系统上,大页面文件的名称可能略有不同;例如,某些发行版将其称为
nr_hugepages
。如果 sysctl 返回与文件名相关的错误,请检查/proc/sys/vm
中相应文件的名称并改用该名称。要验证大页面配置,请再次检查
/proc/meminfo
,如前所述。现在您应该在输出中看到一些其他非零值,类似于以下内容$> grep -i huge /proc/meminfo AnonHugePages: 2686976 kB ShmemHugePages: 0 kB HugePages_Total: 233 HugePages_Free: 233 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 477184 kB
(可选)您可能希望压缩 Linux VM。您可以使用一系列命令来完成此操作,这些命令可能位于脚本文件中,类似于此处所示的内容
sync sync sync echo 3 > /proc/sys/vm/drop_caches echo 1 > /proc/sys/vm/compact_memory
有关如何执行此操作的更多信息,请参阅您的操作系统平台文档。
检查服务器使用的任何配置文件(例如
my.cnf
),并确保innodb_buffer_pool_chunk_size
设置为大于大页面大小。此变量的默认值为 128M。默认情况下,MySQL 服务器中的大页面支持处于禁用状态。要启用它,请使用
--large-pages
启动服务器。您也可以通过将以下行添加到服务器my.cnf
文件的[mysqld]
部分来实现此目的large-pages=ON
如果启用此选项,
InnoDB
会自动为其缓冲池和附加内存池使用大页面。如果InnoDB
无法执行此操作,它将回退到使用传统内存,并在错误日志中写入警告:警告:使用传统内存池。
您可以通过在重新启动 mysqld 后检查 /proc/meminfo
来验证 MySQL 现在是否正在使用大页面,如下所示
$> grep -i huge /proc/meminfo
AnonHugePages: 2516992 kB
ShmemHugePages: 0 kB
HugePages_Total: 233
HugePages_Free: 222
HugePages_Rsvd: 55
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 477184 kB