MySQL 調優可分為兩大層面:MySQL 內部層(SQL 改寫、索引優化、參數調整)與作業系統/硬體層(CPU、記憶體、磁碟、網路瓶頸定位)。真正的調優要求對硬體架構、OS 核心機制、MySQL 內部原理三者有深入理解。
所有 CPU 共享單一記憶體總線訪問所有記憶體。優點是資源共享簡單,缺點是 CPU 數量增加時總線爭用劇烈,擴展性受限。
引入 Node 與 Distance 概念:每個 Node 包含多顆 CPU 與綁定的本地記憶體。CPU 訪問本 Node 記憶體為 Local Access(最快),跨 Node 訪問為 Remote Access(經由 Interconnect,較慢)。

cpunodebind(指定 Node)、physcpubind(指定核心)localalloc:僅從當前 Node 分配(預設,易導致 Swap)preferred:優先指定 Node,不足則嘗試其他membind:限定可用 Node 範圍interleave:推薦,Round-Robin 向所有 Node 請求,將 NUMA 記憶體虛擬為共享池,避免 Swap 且保留 Interconnect 優勢關鍵點:預設localalloc會導致本地記憶體不足時觸發 Swap,嚴重拖垮效能。生產環境必須將策略設為interleave。
fork() 建立子進程 → exec() 載入程式碼 → exit() 進入殭屍態 → 父進程 wait() 回收資源nice 值範圍 -20 ~ 19,值越小優先級越高,預設 0。調高 nice 可降低排程頻率| 狀態 | 含義 |
|---|---|
TASK_RUNNING | 正在 CPU 執行或在 Run Queue 等待 |
TASK_INTERRUPTIBLE | 可中斷睡眠(等待條件,可被訊號喚醒) |
TASK_UNINTERRUPTIBLE | 不可中斷睡眠(如等待磁碟 I/O),計入 Load Average |
TASK_STOPPED | 被訊號暫停(SIGSTOP 等) |
TASK_ZOMBIE | 已退出等待父進程回收 |
Load Average = TASK_RUNNING + TASK_UNINTERRUPTIBLE 進程數的 1/5/15 分鐘平均值。

%us(用戶態)、%sy(核心態)、%ni(nice)、%id(閒置)、%wa(I/O 等待)、%hi/%si(硬/軟中斷)、%st(虛擬機偷佔)PID、USER、PR(優先級)、NI(nice)、VIRT/RES/SHR(虛擬/常駐/共享記憶體)、S(狀態)、%CPU、%MEM、TIME+、COMMAND使用 top -H 可切換至執行緒檢視,觀察 mysqld 多執行緒行為。
vmstat 2:重點觀察 r(可運行進程)、b(不可中斷睡眠)、si/so(swap in/out)、in(中斷)、cs(上下文切換)、CPU 佔用分布iostat -x -d -m 2 3:磁碟 I/O 延遲 await、佇列長度 avgqu-sz、裝置忙碌度 %utilmpstat:多核心 CPU 逐核使用率ps -mp <PID> -o THREAD,pmem,rss,vsz,tid,pid:針對特定進程(如 mysqld)查看各執行緒 CPU 佔用strace -aef -p <PID> -o trace.log
分析輸出可定位阻塞點、頻繁系統呼叫等問題。
SHOW PROCESSLIST 找出問題 SQL → 改寫/加索引/移至 Slave 執行renice -n 10 -p <PID> 降低優先級,配合 cron 錯峰執行