Mysql 5.7.35-:使用HugePage:配置关键点、配置过程

发布时间 2023-09-21 15:47:02作者: jinzhenshui

在Linux中,让应用程序——尤其是mysqld这类的数据库应用——使用HugePage,最大的好处在于:

1:内存不会被回收,不会被交换到swap分区

2:因为是HugePage,大页,2M起步,如此,就能大大减轻相应应用程序所分配内存的linux内核管理负担!

 

#---------------------------------------------------------------------------

让Mysqld使用HugePage的关键点:

1:修改linux的内核参数:/etc/sysctl.cfg

  /proc/sys/vm/hugetlb_shm_group  :配置允许使用HugePage的linux用户组id

  /proc/sys/vm/nr_hugepages  :配置Huage的内存页数量(就是分配多少内存)  

  /proc/sys/kernel/shmmax :配置可以【单个】共享内存段的最大大小,单位字节

  /proc/sys/kernel/shmall:配置可以使用的共享内存的常规页面(4k)的页面【总数】(就是【总计】可以分配多少常规内存用于创建1个或n个共享段内存) 

  个人理解:一个共享内存段的最大大小是由shmmax决定;而这个linux内核可以创建多个共享内存段,这多个共享内存段的总计大小是有限制的,即由shmall决定

 

2:修改运行mysql的用户——通常就是mysql:mysql——的资源限制:/etc/security/limits.conf

  上面“1”中是内核空间的事情; 而用户空间的事情则是基于用户或用户组进行单独的控制。

  

  # based user
  mysql hard memlock unlimited
  mysql sort memlock unlimited

  # based group
  @mysql hard memlock unlimited
  @mysql sort memlock unlimited

 

3:修改mysqld的系统变量,可通过修改 : /etc/my.cnf

  innodb_numa_interleave = 1 : 建议没事就开了它吧,相信我!

  large_pages = 1

  特别注意的事情:因为mysql的整体“innodb_buffer_pool_size”=“innodb_buffer_pool_instances”*128M,所以,mysqld在启动时

会自动均匀的向128M对齐。所以,你配置的“innodb_buffer_pool_size”最终值会是:

  《个人理解1》

  ceil(ceil(innodb_buffer_pool_size /innodb_buffer_pool_instances)/128M)  * innodb_buffer_pool_instances * 128M

  意思是:buffer pool 先根据 instance数 计算每个instance大概分配多少内存;随后根据每个instance的内存根据128M粒度向上计算最终每个instance要分配的(颗粒数);最后按颗粒数分配内存。所以最终结果就是:最大的内存分配差异会是“innodb_buffer_pool_instances * 128M - 1”。

  

  《个人理解2》

  除了最后一个instance外,其他instance的实际内存大小为:

  ( ceil(innodb_buffer_pool_size /128M)*128M    {取模} innodb_buffer_pool_instances ) * 128M

  而,最后一个instance的实际内存大小为:

  ( ceil(innodb_buffer_pool_size /128M)*128M    {取余} innodb_buffer_pool_instances ) * 128M

 

  意思是:buffer pool 先根据 128M 的粒度 计算总体的内存颗粒数,不足128M的向上取整;随后根据instance数为除了最后一个以外的instance分配{取模}数量的内存颗粒;最后的instance则分配{取余}的内存颗粒。所以,最终结果就是:最终的内存差异会是“128M-1”。