某些硬件/操作系统体系结构支持的内存页大于默认值(通常为4KB)。此支持的实际实现取决于底层硬件和操作系统。由于减少了转换后备缓冲区(TLB)丢失,因此执行大量内存访问的应用程序可以通过使用大页面来提高性能。
在MySQL中,InnoDB可以使用大页为其缓冲池和其他内存池分配内存。
MySQL中大页面的标准用法尝试使用所支持的最大大小,最大为4MB。在Solaris下, “ 超大页面 ”功能允许使用最大256MB的页面。此功能可用于最新的SPARC平台。可以使用--super-large-pages或 --skip-super-large-pages 选项启用或禁用它 。
MySQL还支持大页面支持的Linux实现(在Linux中称为HugeTLB)。
在Linux上使用大页面之前,必须启用内核以支持大页面,并且有必要配置HugeTLB内存池。作为参考,HugeTBL API记录在 Documentation/vm/hugetlbpage.txtLinux源文件中。
默认情况下,某些最新系统(如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命令输出表明存在大页面支持,但零值表明未配置任何页面供使用。
如果需要将内核重新配置为支持大页面,请查阅该hugetlbpage.txt文件以获取指示。
假设您的Linux内核启用了大页面支持,请使用以下命令将其配置为供MySQL使用。通常,将它们放在rc系统引导序列中执行的 文件或等效启动文件中,以便命令在每次系统启动时执行。这些命令应在MySQL服务器启动之前的引导顺序中早执行。确保根据您的系统更改分配号和组号。
# 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命令 会导致 用户在切换到用户之前 将memlock限制设置为 。(这假定 mysqld_safe由启动 。) rootunlimitedmysqlroot
默认情况下,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