天天看點

資料庫核心月報 - 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了!