CPU 跑滿的表現是網站變慢、SSH 輸入延遲、排程任務逾時。原因可能是正常業務增長,也可能是程式失控甚至被植入挖礦木馬。本文按排查順序展開。
第一步:看清是誰在吃 CPU
執行 top(按 P 以 CPU 排序)或更直觀的 htop,記下佔用最高的程序名和 PID。這裡先分三類情況:
- 認識的業務程序(mysql、php-fpm、node 等)→ 走第二步;
- 名字陌生或偽裝成系統程序(隨機字串、kdevtmpfsi、xmrig 等)→ 大機率中了挖礦木馬,跳到第四步;
- iowait 高而非使用者態高(top 裡 wa 值大)→ 瓶頸其實是磁碟,排查方向改為磁碟 IO。
第二步:業務程序吃滿的常見原因
- MySQL:慢查詢缺索引。開啟慢查詢日誌,對掃全表的語句加索引;
- PHP / Node:無窮迴圈或被爬蟲打高。結合存取日誌看是否有異常 IP 高頻請求,配合限流或防火牆封鎖;
- 排程任務堆疊:上一輪 cron 沒跑完下一輪又啟動,任務越積越多,給腳本加鎖(flock)。
第三步:確認是否只是配置不夠
如果高峰期 load average 持續超過核心數、但每個程序都正常,說明是真實業務量超出配置,優化空間有限時直接升級 CPU 更划算。
第四步:疑似挖礦木馬的處理
特徵:CPU 常年 100%、程序名怪異、殺掉自動復活、crontab 裡多了陌生條目。處理順序:斷掉可疑程序的網路、檢查 crontab -l 和 /etc/cron.* 裡的陌生任務、檢查 ~/.ssh/authorized_keys 是否被加了陌生公鑰。重要:清理木馬很難徹底,最穩妥的做法是備份資料後重灌系統,再按安全加固文章設定防火牆和金鑰登入。需要協助可聯繫 00Shark 客服。