用 Bash 一行指令快速揪出 Linux 伺服器上最食 CPU 嘅十個 Process
成日聽人講「伺服器好慢、CPU 爆錶」,但係一 login 入去,面對成個黑媽媽嘅 terminal,又唔知由邊度入手。今日就用一篇短文,教大家點樣用 Bash 幾行指令,快速定位邊個 process 食咗你部 Linux 機最食 CPU,跟手仲有埋排錯方向。
點解要識睇 Process 食 CPU?
一部 Linux 伺服器行得慢,可能係網絡問題、可能係 disk I/O 樽頸,但最常見嘅元兇一定係某一個 process 突然失控,將成粒 CPU core 食到盡。如果你唔識定位,淨係識「重啟部機」,咁問題遲早會再嚟。識得用 top、ps、htop 呢啲工具,先至可以做到「對症下藥」。
第一步:用 top 睇即時情況
最簡單直接,就係打:
top
入到去之後,撳 Shift+P 就可以按 CPU 使用率由高至低排序。呢個係最基本嘅操作,但係 top 有個缺點:佢係互動式界面,唔方便攞數據出嚟做 script。
第二步:用 ps 攞出 Top 10 食 CPU 嘅 Process
如果你想一個指令就攞到結果,可以用 `ps` 配合 `sort` 同 `head`:
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -11
拆解一下呢條指令:
– `-eo`:自訂輸出欄位
– `pid`:Process ID
– `ppid`:Parent Process ID(邊個 process 生佢出嚟)
– `cmd`:完整執行命令
– `%cpu`:CPU 使用率
– `%mem`:記憶體使用率
– `–sort=-%cpu`:按 CPU 使用率遞減排序(負號代表由大至小)
– `head -11`:攞頭 11 行(第 1 行係 header,加 10 個 process)
第三步:想睇指定 User 嘅 Process?
如果你懷疑係某個 service account 出問題,可以加 `-u` 參數:
ps -u www-data -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -11
咁樣就只會顯示 `www-data` 呢個 user 行緊嘅 process,方便縮窄範圍。
第四步:用 watch 持續監察
如果你想一路監察,唔使手動重複打指令,可以用 `watch`:
watch -n 2 "ps -eo pid,cmd,%cpu --sort=-%cpu | head -6"
呢條指令每 2 秒自動更新一次,攞住頭 5 個最食 CPU 嘅 process。
第五步:定位到之後點做?
當你搵到元兇,假設佢 PID 係 `12345`,你可以:
# 睇下佢開咗啲咩檔案
lsof -p 12345
睇下佢喺邊度嚟
ls -l /proc/12345/exe
睇下佢嘅系統呼叫(strace 要小心用喺 production)
strace -p 12345 -c
如果真係失控,可以 kill 佢(先 SIGTERM 再 SIGKILL)
kill 12345
kill -9 12345 # 最後手段
小貼士
1. 先睇 load average:用 `uptime` 或者 `w` 睇下系統 load average,如果 load 值高過 CPU core 數,代表有 process 排緊隊等 CPU。
2. 分清 CPU 定 I/O:如果 process 係 `D`(uninterruptible sleep)狀態,多數係 disk I/O 問題,唔係 CPU 問題,用 `iostat` 或者 `iotop` 去查。
3. 記錄 baseline:喺伺服器正常嘅時候,記低個 `ps` 輸出做 baseline,出事嗰陣一比較就知道邊個 process 異常。
🔗 參考資料:NVD NIST 漏洞資料庫
識得呢幾招,下次伺服器一慢,你就唔使慌,幾行指令就可以鎖定元兇,做個真正嘅系統管理員啦。
#Linux #IT教學 #技術分享




