8.12.4.2 启用大页面支持

某些硬件/os 体系结构支持的内存页大于默认值(通常为 4KB)。此支持的实际实现取决于底层硬件和 os。由于减少了转换后备缓冲区(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”的输出行:

shell> cat /proc/meminfo | grep -i huge
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       4096 kB

nonempty 命令输出 table 明存在大页面支持,但是零值 table 明未配置任何页面供使用。

如果需要将内核重新配置为支持大页面,请查阅hugetlbpage.txt文件以获得说明。

假设您的 Linux 内核启用了大页面支持,请使用以下命令将其配置为供 MySQL 使用。通常,将它们放在系统引导过程中执行的rc文件或等效的启动文件中,以便命令在每次系统启动时执行。这些命令应在 MySQL 服务器启动之前的引导 Sequences 中早执行。确保根据您的系统更改分配号和组号。

# Set the number of pages to be used.
# Each page is normally 2MB, so a value of 20 = 40MB.
# This command actually allocates memory, so this much
# memory must be available.
echo 20 > /proc/sys/vm/nr_hugepages

# Set the group number that is permitted to access this
# memory (102 in this case). The mysql user must be a
# member of this group.
echo 102 > /proc/sys/vm/hugetlb_shm_group

# Increase the amount of shmem permitted per segment
# (12G in this case).
echo 1560281088 > /proc/sys/kernel/shmmax

# Increase total amount of shared memory.  The value
# is the number of pages. At 4KB/page, 4194304 = 16GB.
echo 4194304 > /proc/sys/kernel/shmall

对于 MySQL 使用,通常希望shmmax的值接近shmall的值。

要验证大页面配置,请按照前面所述再次检查/proc/meminfo。现在您应该看到一些非零值:

shell> cat /proc/meminfo | grep -i huge
HugePages_Total:      20
HugePages_Free:       20
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       4096 kB

使用hugetlb_shm_group的最后一步是为mysql用户提供“无限”的内存锁限制值。可以通过编辑/etc/security/limits.conf或将以下命令添加到mysqld_safe脚本中来完成:

ulimit -l unlimited

mysqld_safe上添加 ulimit 命令会导致root用户在切换到mysql用户之前将内存锁限制设置为unlimited。 (这假定mysqld_saferoot开始。)

默认情况下,MySQL 中的大页面支持处于禁用状态。要启用它,请使用--large-pages选项启动服务器。例如,您可以在服务器my.cnf文件中使用以下几行:

[mysqld]
large-pages

使用此选项,InnoDB会自动将大页用于其缓冲池和其他内存池。如果InnoDB无法做到这一点,它将退回到传统内存的使用,并向错误日志中写入警告:警告:使用常规内存池

要验证是否正在使用大页面,请再次检查/proc/meminfo

shell> cat /proc/meminfo | grep -i huge
HugePages_Total:      20
HugePages_Free:       20
HugePages_Rsvd:        2
HugePages_Surp:        0
Hugepagesize:       4096 kB