如果你没空看的话,这里简单描述一下,就是当你把主机大部分内存分配给innodb时,你会发现明明操作系统还有很多内存,但是却有很多内存被交换到了swap分区。
有两个方式可以解决这个问题:
1. 在linux kernel启动参数中加上numa=off(这样也会影响到其他进程使用numa);
2. 在mysqld_safe脚本中加上“numactl –interleave all”来启动mysqld。
如果在代码层面彻底解决numa问题,那么我们需要解决两个问题:
1. 全局内存应该采用interleave的分配方式分散在不同的numa node上;
2. 线程内存应该采用local的分配方式分配在线程运行的numa node上。
因此对于mysql server和innodb引擎都需要做修改:
1. 在<code>mysqld_main()</code>入口设置 <code>set_mempolicy(mpol_interleave, null, 0)</code> 启用全局分配方式;
2. 在mysql启动完成之后设置<code>set_mempolicy(mpol_default, null, 0)</code> 启用本地分配方式;
3. 在innodb入口时设置 <code>set_mempolicy(mpol_interleave, null, 0)</code> 启用全局分配方式;
4. 在buffer pool分配完成时设置 <code>set_mempolicy(mpol_default, null, 0)</code> 启用本地分配方式。
mysql 5.6.27, 5.7.9 发布之后,将会增加一个 <code>innodb_numa_interleave</code> 参数来控制这个策略。<code>innodb_numa_interleave</code> 如果打开,那么将会按上面的策略来设置内存分配方式,如果关闭或者主机不支持numa,那么还是按原来的方式分配。
我们一起期待新版本的发布吧,妈妈再也不用担心我的numa了!