8.0 預設值
OFF
8.4 預設值
ON
Dynamic
No
需特別關注
需特別關注
簡介
是否啟用 NUMA interleave memory policy 來分配 Innodb buffer pool。
說明
當開啟 innodb_numa_interleave 時,innodb buffer pool 會將 NUMA memory policy 設置為 MPOL_INTERLEAVE 分配完後再設置回 MPOL_DEFAULT ( OS 默認)。
如果 Linux 系統支持 NUMA 則預設為 ON,否則會是 OFF。
建議
常常聽到前輩說 MySQL 上的 OS 需要關閉 NUMA,因為 NUMA 會導致性能下降,根據 PolarDB (阿里雲數據庫) 官方以及阿里巴巴內核月報上的整理可以得知:
为什么行业内默认都把NUMA关掉了呢?
原来是10年前几乎所有的运维都会多多少少被NUMA坑害过:
最有名的是这篇 MySQL – The MySQL “swap insanity” problem and the effects of the NUMA architecture(以下简称为2010年的文章)
我总结下这篇2010年的文章的核心观点是:
- 如果本NUMA内存不够的时候,Linux会优先回收PageCache内存,即使其它NUMA还有内存
- 回收PageCache经常会造成系统卡顿,这个卡顿不能接受
所以2010年的文章给出的解决方案就是(三选一):
- 关掉NUMA
- 或者启动MySQL的时候指定不分NUMA
- 或者启动MySQL的时候先回收所有PageCache
这就是这么多人在上面栽了跟头,所以干脆一不做二不休干脆关了NUMA 一了百了。
但是作者發現從 2014 年之前,只要開啟 NUMA 則 Linux 參數 zone_reclaim_mode 會被強制設置為 1,導致觸發回收 PageCache,在 2014 之後這個 bug 就被修改掉了:
因此其實不用這麼必須一定要關閉 NUMA,只要確認 Linux 內核版本是修復這個 bug 之後的即可。
回到該參數的建議,開啟 innodb_numa_interleave 就是為了關閉 zone_reclaim_mode的kernel bug,所以該 bug 修復後可能也意義不大,但是保險起見維持預設值即可。
參考
‣
‣
‣