二 方案概述
在MySQL中,Innodb存储引擎可以使用大页为buffer pool和其他内存池分配内存空间。对于执行大量内存访问的应用程序可以通过使用大页降低Translation Lookaside Buffer (TLB) miss,从而使数据库性能得到改进。本方案旨在演示mysql中如何开启大页的使用。mysql默认是不启用大页的。
MySQL中大页面的标准使用尝试使用支持的最大大小,最多4MB。在Linux上使用大页面之前,必须启用内核来支持,并且有必要配置HugeTLB内存池
mysql> show variables like '%large_page%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| large_page_size | 0 |
| large_pages | OFF |
+-----------------+-------+
2 rows in set (0.00 sec)
三 实施步骤
3.1 大页数量配置
Innodb存储引擎可以使用大页为buffer pool和其他内存池分配内存空间,根据mysql的体系架构,我们可以在innodb_buffer_pool_size、innodb_log_buffer_size总和基础上增加10%冗余量来大致计算需要设置的大页数量。
mysql> select CEILING((@@innodb_buffer_pool_size++@@innodb_log_buffer_size )/(2*1024*1024)*1.1) pages;
+-------+
| pages |
+-------+
| 2825 |
+-------+
1 row in set (0.00 sec)
设置可用的大页的数量,每个大页默认是2m,此命令会真实的分配内存。
[root@mysqlhost /]# free -m
total used free shared buff/cache available
Mem: 7821 536 6962 8 322 7010
Swap: 2999 0 2999
[root@mysqlhost /]# echo 2825 > /proc/sys/vm/nr_hugepages
[root@mysqlhost ~]# free -m
total used free shared buff/cache available
Mem: 7821 6439 1031 8 350 1104
Swap: 2999 0 2999
3.2 用户组指定
设置指定组成员允许使用这些大页内存。
[root@mysqlhost /]# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)
[root@mysqlhost /]# echo 27 > /proc/sys/vm/hugetlb_shm_group
3.3 设置最大共享内存段的大小
kernel.shmmax用于定义单个共享内存段的最大值,shmmax设置应足够大,但也不能占用全部内存,因为可能存在导致其他程序无内存空间可用的风险。大于为大页指定的内存即可。
[root@mysqlhost /]# echo 7516192768 > /proc/sys/kernel/shmmax
[root@mysqlhost /]# cat /proc/sys/kernel/shmmax
7516192768
3.4 设置共享内存总大小
kernel.shmall 参数是控制共享内存页数从而控制共享内存的大小 。Linux共享内存页默认大小为4KB,对于MySQL使用,通常设置shmmax的值接近于shmall的值。
[root@mysqlhost /]# echo 1835008 > /proc/sys/kernel/shmall
3.5 修改/etc/security/limits.conf配置
[root@mysqlhost ~]# vi /etc/security/limits.conf
mysql hard memlock unlimited
mysql soft memlock unlimited
3.6 重启MySQL实例
修改mysql参数文件指定large-pages参数使用大页。
[root@mysqlhost ~]# vi /etc/my.cnf
large-pages
重启mysql实例确认开始使用大页。
mysql> show variables like '%large_page%';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| large_page_size | 2097152 |
| large_pages | ON |
+-----------------+---------+
2 rows in set (0.01 sec)
mysql>
[root@mysqlhost ~]# cat /proc/meminfo | grep -i huge
AnonHugePages: 632832 kB
HugePages_Total: 2825
HugePages_Free: 2756
HugePages_Rsvd: 2551
HugePages_Surp: 0
Hugepagesize: 2048 kB
[root@mysqlhost ~]#
四 参考文档
【1】https://dev.mysql.com/doc/refman/8.0/en/large-page-support.html