关闭NUMA

今天朋友告知他的库因为numa的原因导致OOM了,趁着这个话题就来操作一把测试库的numa。


关于swap(摘自网络)

swap是如何产生的

swap指的是一个交换分区或文件,主要是在内存使用存在压力时,触发内存回收,这时可能会将部分内存的数据交换到swap空间

内存回收的机制

①Linux内核使用cache对部分文件进行缓存,提升文件读写效率。所以 引入了kswapd进程进行周期性检查,保证剩余内存空间

②当内存分配没有足够的空间时,直接内存回收

内存回收如何实现

这部分实现非常复杂,简单来说,内存回收操作主要针对内存的文件页和匿名页,这些页都通过LRU链表来管理。

其中anon的匿名页内存主要回收手段是swap,文件页释放方式是写回和清空


关于swappiness(摘自网络)

swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60

简单地说这个参数定义了系统对swap的使用倾向,默认值为60,值越大表示越倾向于使用swap。可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性


关于numa(摘自网络)

numa主要是和swap有关

numactl --hardware


当发现numa_miss数值比较高时,说明需要对分配策略进行调整。例如将指定进程关联绑定到指定的CPU上,从而提高内存命中率


操作部分

关闭numa

在操作系统中关闭,可以直接在/etc/grub.conf的kernel行最后添加numa=off,如下所示:

  kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM  numa=off

此外在mysql版本5.6.27/5.7.8以后,可以在cnf里配置innodb_numa_interleave参数,将其设置为ON


查询当前swappiness的设置值

[root@zjk ~]# cat /proc/sys/vm/swappiness

60

查询当前swap使用情况

清空swap(执行swapoff -a;swapon -a)

重新设置swappiness值

vim /etc/sysctl.conf;  设置vm.swappiness=0

使该设置生效

sysctl -p


来看一下更改前后vmstat中swap的变化

改完swappiness之后

注意:在CentOS7中最好不要把swappiness设置成0,会有问题,设置成5-10即可