某些硬件和操作系统架构支持大于默认值(通常为 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 个大页面。我们将此值称为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