天天看点

数据库内核月报 - 2015 / 07-MySQL · 社区动态 · MySQL内存分配支持NUMA

如果你没空看的话,这里简单描述一下,就是当你把主机大部分内存分配给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了!