MySQL5.7關閉NUMA方法

chenfeng發表於2017-07-28
非一致儲存訪問結構 (NUMA : Non-Uniform Memory Access) 也是最新的記憶體管理技術。它和對稱多處理器結構 (SMP : Symmetric Multi-Processor) 是對應的。

MySQL在NUMA架構上會出現的問題:
1).CPU規模因摩爾定律指數級發展,而匯流排發展緩慢,導致多核CPU透過一條匯流排共享記憶體成為瓶頸
2).於是NUMA出現了,CPU平均劃分為若干個Chip(不多於4個),每個Chip有自己的記憶體控制器及記憶體插槽
3).CPU訪問自己Chip上所插的記憶體時速度快,而訪問其他CPU所關聯的記憶體(下文稱Remote Access)的速度相較慢三倍左右
4).於是Linux核心預設使用CPU親和的記憶體分配策略,使記憶體頁儘可能的和呼叫執行緒處在同一個Core/Chip中
5).由於記憶體頁沒有動態調整策略,使得大部分記憶體頁都集中在CPU 0上
6).又因為Reclaim預設策略優先淘汰/Swap本Chip上的記憶體,使得大量有用記憶體被換出
7).當被換出頁被訪問時問題就以資料庫響應時間飆高甚至阻塞的形式出現了


因此MySQL單機單例項,建議關閉NUMA,關閉的方法有三種:
1.硬體層,在BIOS中設定關閉;
2.OS核心,啟動時設定numa=off;
3.可以用numactl命令將記憶體分配策略修改為interleave(交叉)

登入Linux系統,修改/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服務.
#service mysqld restart

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2142705/,如需轉載,請註明出處,否則將追究法律責任。

相關文章