MySQL5.7關(guān)閉NUMA方法
非一致存儲(chǔ)訪問(wèn)結(jié)構(gòu) (NUMA : Non-Uniform Memory Access) 也是最新的內(nèi)存管理技術(shù)。它和對(duì)稱多處理器結(jié)構(gòu) (SMP : Symmetric Multi-Processor) 是對(duì)應(yīng)的。
MySQL在NUMA架構(gòu)上會(huì)出現(xiàn)的問(wèn)題:
1).CPU規(guī)模因摩爾定律指數(shù)級(jí)發(fā)展,而總線發(fā)展緩慢,導(dǎo)致多核CPU通過(guò)一條總線共享內(nèi)存成為瓶頸
2).于是NUMA出現(xiàn)了,CPU平均劃分為若干個(gè)Chip(不多于4個(gè)),每個(gè)Chip有自己的內(nèi)存控制器及內(nèi)存插槽
3).CPU訪問(wèn)自己Chip上所插的內(nèi)存時(shí)速度快,而訪問(wèn)其他CPU所關(guān)聯(lián)的內(nèi)存(下文稱Remote Access)的速度相較慢三倍左右
4).于是Linux內(nèi)核默認(rèn)使用CPU親和的內(nèi)存分配策略,使內(nèi)存頁(yè)盡可能的和調(diào)用線程處在同一個(gè)Core/Chip中
5).由于內(nèi)存頁(yè)沒(méi)有動(dòng)態(tài)調(diào)整策略,使得大部分內(nèi)存頁(yè)都集中在CPU 0上
6).又因?yàn)镽eclaim默認(rèn)策略優(yōu)先淘汰/Swap本Chip上的內(nèi)存,使得大量有用內(nèi)存被換出
7).當(dāng)被換出頁(yè)被訪問(wèn)時(shí)問(wèn)題就以數(shù)據(jù)庫(kù)響應(yīng)時(shí)間飆高甚至阻塞的形式出現(xiàn)了
因此MySQL單機(jī)單實(shí)例,建議關(guān)閉NUMA,關(guān)閉的方法有三種:
1.硬件層,在BIOS中設(shè)置關(guān)閉;
2.OS內(nèi)核,啟動(dòng)時(shí)設(shè)置numa=off;
3.可以用numactl命令將內(nèi)存分配策略修改為interleave(交叉)
登錄Linux系統(tǒng),修改/etc/init.d/mysqld文件,加上numactl --interleave all
vi /etc/init.d/mysqld
找到如下行
# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
將$bindir/mysqld_safe --datadir="$datadir"這一行修改為:
/usr/bin/numactl --interleave all $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
然后重啟MySQL服務(wù).
#service mysqld restart