首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 調優基礎(一):CPU 與進程深度解析

     編輯:MySQL 綜合教學

MySQL 調優基礎(一):CPU 與進程深度解析

MySQL 調優可分為兩大層面:MySQL 內部層(SQL 改寫、索引優化、參數調整)與作業系統/硬體層(CPU、記憶體、磁碟、網路瓶頸定位)。真正的調優要求對硬體架構、OS 核心機制、MySQL 內部原理三者有深入理解。

1. CPU 架構:SMP vs NUMA

SMP(對稱多處理器)

所有 CPU 共享單一記憶體總線訪問所有記憶體。優點是資源共享簡單,缺點是 CPU 數量增加時總線爭用劇烈,擴展性受限。

NUMA(非一致性記憶體訪問)

引入 Node 與 Distance 概念:每個 Node 包含多顆 CPU 與綁定的本地記憶體。CPU 訪問本 Node 記憶體為 Local Access(最快),跨 Node 訪問為 Remote Access(經由 Interconnect,較慢)。

NUMA 架構示意圖

NUMA 記憶體分配策略

  • CPU 綁定: cpunodebind(指定 Node)、physcpubind(指定核心)
  • 記憶體分配:
    • localalloc:僅從當前 Node 分配(預設,易導致 Swap)
    • preferred:優先指定 Node,不足則嘗試其他
    • membind:限定可用 Node 範圍
    • interleave:推薦,Round-Robin 向所有 Node 請求,將 NUMA 記憶體虛擬為共享池,避免 Swap 且保留 Interconnect 優勢
關鍵點:預設 localalloc 會導致本地記憶體不足時觸發 Swap,嚴重拖垮效能。生產環境必須將策略設為 interleave。

2. Linux 進程核心觀念

  • 生命週期: fork() 建立子進程 → exec() 載入程式碼 → exit() 進入殭屍態 → 父進程 wait() 回收資源
  • 執行緒: 輕量級進程(LWP),共享進程資源,可視為特殊進程處理
  • 優先級: nice 值範圍 -20 ~ 19,值越小優先級越高,預設 0。調高 nice 可降低排程頻率
  • Context Switch: 進程上下文切換開銷極大,頻繁切換嚴重影響效能
  • 中斷處理: Hard/Soft Interrupt 優先級極高,過多中斷導致頻繁 Context Switch

進程狀態與 Load Average

狀態含義
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 分鐘平均值。

3. CPU 效能監控工具實戰

top 指令詳解

top 輸出範例

  • 第 1 行: 系統時間、運行時間、登入用戶數、Load Average
  • 第 2 行: 進程總數、Running/Sleeping/Stopped/Zombie 統計
  • 第 3 行(關鍵): %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、iostat、mpstat、ps

  • vmstat 2:重點觀察 r(可運行進程)、b(不可中斷睡眠)、si/so(swap in/out)、in(中斷)、cs(上下文切換)、CPU 佔用分布
  • iostat -x -d -m 2 3:磁碟 I/O 延遲 await、佇列長度 avgqu-sz、裝置忙碌度 %util
  • mpstat:多核心 CPU 逐核使用率
  • ps -mp <PID> -o THREAD,pmem,rss,vsz,tid,pid:針對特定進程(如 mysqld)查看各執行緒 CPU 佔用

strace 追蹤進程系統呼叫

strace -aef -p <PID> -o trace.log

分析輸出可定位阻塞點、頻繁系統呼叫等問題。

4. CPU 瓶頸調優策略

  1. 確認瓶頸來源: 用上述工具判斷是 User/System/Wait/Context Switch 哪項過高,定位佔用 CPU 最高的進程
  2. MySQL 層面: SHOW PROCESSLIST 找出問題 SQL → 改寫/加索引/移至 Slave 執行
  3. 非必要進程: Kill 或用 renice -n 10 -p <PID> 降低優先級,配合 cron 錯峰執行
  4. 硬體升級: 更換更高效能 CPU
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved