在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”。
标签:5.7,buffer,35,instance,innodb,内存,Mysql,128M,pool From: https://www.cnblogs.com/jinzhenshui/p/17720117.html