MySQL 調優非單一維度,需具備「硬體 → 作業系統 → 資料庫」全棧認知。本文聚焦 CPU 與進程層面:NUMA/SMP 架構差異、Linux 進程生命週期、上下文切換、中斷處理、Load Average 真實含義,以及 top/vmstat/mpstat/ps/strace 實戰分析技巧。
| 狀態 | 含義 | 是否佔用 CPU |
| TASK_RUNNING | 運行中或就緒隊列等待 | 是 |
| TASK_INTERRUPTIBLE | 可中斷睡眠(等待條件/信號) | 否 |
| TASK_UNINTERRUPTIBLE | 不可中斷睡眠(通常為磁盤 I/O) | 否(但系統在為其工作) |
| TASK_STOPPED | 收到 SIGSTOP/SIGTSTP 暫停 | 否 |
| TASK_ZOMBIE | 退出等待父進程回收 | 否 |
Load Average 計算包含 TASK_RUNNING + TASK_UNINTERRUPTIBLE,故 I/O 密集型負載也會推高 LA。
Nice 值與優先級
- 範圍 -20 (最高) ~ 19 (最低),預設 0;
renice -n -10 -p PID 提升優先級(需 root);
- 非關鍵後台任務可
renice +10 降低爭搶。
三、性能分析工具實戰
1. top:全景式 CPU/記憶體/進程觀測
top - 14:35:55 up 25 min, 4 users, load average: 0.10, 0.07, 0.14
Tasks: 92 total, 1 running, 91 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0%us, 1.7%sy, 0.0%ni, 97.7%id, 0.0%wa, 0.3%hi, 0.3%si, 0.0%st
- 第 1 行:
load average 1/5/15 分鐘平均活躍進程數(含不可中斷睡眠);
- 第 3 行:
us 用戶態、sy 內核態、wa I/O 等待、hi/si 硬/軟中斷、st 虛擬化偷佔;
- 進程列:
VIRT/RES/SHR、%CPU、%MEM、S 狀態;
top -H 顯示線程級視圖(MySQL 線程數可見)。
2. vmstat:系統級吞吐與切換統計
vmstat 2
procs - r: 就緒隊列長度, b: 不可中斷睡眠
memory - swpd/free/buff/cache
swap - si/so: 換入/換出 (KB/s)
io - bi/bo: 塊設備讀/寫
system - in: 中斷/秒, cs: 上下文切換/秒
cpu - us/sy/id/wa/st
r 持續 > CPU 核數 → CPU 瓶頸;
cs (context switch) 高 → 鎖爭用/線程過多;
in 高 → 中斷風暴(網卡/時鐘/磁盤)。
3. mpstat:多核 CPU 逐核利用率
mpstat -P ALL 2
發現單核熱點(如中斷親和性未配置、單線程熱點)。
4. ps -mp PID -o THREAD,pmem,rss,vsz,tid,pid:MySQL 線程級 CPU 分析
pidof mysqld
ps -mp 2412 -o THREAD,pmem,rss,vsz,tid,pid
# 定位高 CPU 線程 TID,轉十六進制對應 pstack/gdb 分析
5. strace:系統調用跟蹤定位阻塞點
strace -aef -p -o mysql_trace.log
# 分析 futex、poll、read/write、nanosleep 等調用分佈
四、CPU 瓶頸調優策略
- 工具確認瓶頸類型:
us 高 → SQL/邏輯優化;sy 高 → 系統調用/鎖/中斷;wa 高 → I/O 子系統;
- 識別高佔用進程/線程 →
SHOW PROCESSLIST 定位慢 SQL → 改寫/加索引/下推從庫;
- 非關鍵進程
renice 降級或 cron 錯峰執行;
- 中斷親和性綁核(
/proc/irq/*/smp_affinity);
- 升級 CPU/調整 NUMA 策略/綁核部署。
- 上一篇文章: MySQL 數據類型深度解析:字符串、整數、小數選型避坑指南
- 下一篇文章: MySQL 5.6 Root 密碼遺忘重置:skip-grant-tables 與 explicit_defaults_for_timestamp 避坑實戰
Copyright ©
程式碼之家 All Rights Reserved