進程切換代價高昂。LMbench 測試(高端伺服器):單次切換開銷 ~8μs。對高性能伺服器不可接受。目標:在單一時間片內多做實事,而非浪費在無謂切換。
# dstat 1
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 100 0 0 0| 0 0 | 796B 1488B| 0 0 |1004 128
0 0 100 0 0 0| 0 0 | 280B 728B| 0 0 |1005 114
...
csw (context switch) ~120/s,但 dstat/vmstat 不告訴「誰在幹壞事」。
#!/usr/bin/env stap
global csw_count
global idle_count
probe scheduler.cpu_off {
csw_count[task_prev, task_next]++
idle_count+=idle
}
function fmt_task(task_prev, task_next) {
return sprintf("%s(%d)->%s(%d)",
task_execname(task_prev), task_pid(task_prev),
task_execname(task_next), task_pid(task_next))
}
function print_cswtop() {
printf("%45s %10s\n", "Context switch", "COUNT")
foreach ([task_prev, task_next] in csw_count- limit 20) {
printf("%45s %10d\n", fmt_task(task_prev, task_next), csw_count[task_prev, task_next])
}
printf("%45s %10d\n", "idle", idle_count)
delete csw_count
delete idle_count
}
probe timer.s(5) {
print_cswtop()
printf("--------------------------------------------------------------\n")
}
執行:stap cswmon.stp 5(每 5 秒輸出 Top 20)
Context switch COUNT
swapper(0)->systemtap/11(908) 500
systemtap/11(908)->swapper(0) 498
swapper(0)->fct1-worker(2492) 50
fct1-worker(2492)->swapper(0) 50
...
idle 859
清晰可見:
• 進程從哪裡切到哪裡、切換次數
• swapper(0) 即 idle 進程(PID 0)
• 最後一行 idle 計數 = 系統閒置切換到 idle 休息的次數
perf sched、trace-cmd 做深度調用鏈分析。SystemTap 讓「誰在切換進程」從黑盒變透明。定位切換熱點 → 針對性優化 → 釋放 CPU 週期給業務邏輯,是高性能 Linux 運維的必修課。
高密度數據中心連續製冷解決方案:從 UPS 配置到蓄冷罐的分級防禦體系
HTTP 快取控制詳解:Last-Modified、ETag、Expires 原理與 Apache/Nginx 配置實戰
IIS 本地調試無法透過 IP 存取:權限與防火牆雙重排查指南
Nginx 與 Apache 限制 IP 連接數與頻寬完整實戰配置
IIS 5.0/6.0排錯指南與HTTP錯誤代碼完整手冊:從服務啟動失敗到404.1深度解析
CentOS 卸載 Apache (httpd) 完整方法:rpm 命令與依賴處理