華為雲帳號充值優惠 華為雲國際站ECS伺服器CPU突然100%解決
第一章 先把服務保住:CPU 100% 的第一反應
CPU 突然拉到 100%,對線上服務來說通常意味著兩件事:一是計算資源被搶占,請求處理變慢甚至超時;二是如果是攻擊或異常迴圈,系統可能會越來越不穩。解決這類問題,最怕的不是「找不到原因」,而是「一上來就動刀」,把還能跑的服務搞崩。
因此我建議你按順序做三件事:先保服務、再降壓、最後才定位根因。這套流程不花多少時間,但能避免後續排查的盲區。
1. 立即確認告警範圍
在華為雲控制台先確認 CPU 100% 是持續性的還是短暫的。看時間線:如果是幾分鐘峰值,可能是批量任務、備份、掃描或部署腳本;如果是持續數十分鐘甚至數小時,那更像是異常程序、死循環或外部攻擊引起的資源耗盡。
同時觀察「相關指標」而不是只看 CPU。至少看:CPU 使用率、網路收發速率、磁碟讀寫速率、磁碟隊列/IO 等待(如有)、以及負載是否同步上升。很多時候,CPU 飆升其實是由於網路/磁碟等待導致的重試或輪詢,造成 CPU 反向被灌滿。
2. 降低風險:短暫限流或暫停高負載任務
如果你知道當前有定時任務、任務隊列、爬蟲、同步腳本或部署流程,CPU 100% 時先暫停它們。對線上服務來說,這一步不是「治本」,而是把系統的狀態固定下來,讓你能在相對穩定的環境中抓證據。
若你是容器化部署,可先把流量導向降級策略;若是直接服務,至少限制入口請求量或提高超時策略,避免爆量導致更多重試與更深層的資源消耗。
3. 保留證據:別重啟之前先抓快照
很多人遇到 CPU 100% 會直接重啟。重啟可能立刻恢復,但你也會失去「CPU 到 100% 時到底在跑什麼」這些關鍵證據。更好的做法是:在重啟前先在 ECS 上抓取瞬時資訊,例如 top/htop、進程列表、開啟檔、最近的高頻日志段落(不需要很完整,抓出異常即可)。
若你確實需要重啟才能恢復服務,也請先記錄:當前時間、持續多久、CPU 飆升時的網路/磁碟指標、以及當時的主要高 CPU 進程名。
第二章 定位路徑:先看「到底是哪個進程」吃掉 CPU
CPU 100% 的根因幾乎都能落到「某個或某群進程在持續消耗 CPU」。你要做的不是猜,而是快速縮小範圍:用最直接的指標定位高 CPU 來源。
1. 用 top/htop 直接鎖定高耗 CPU 進程
登入 ECS 後,先執行:
(1)top:看 %CPU 最高的進程;
(2)如果你偏好視覺化,htop 更直觀,可以同時看各進程的 CPU、內存、以及子進程變化。
華為雲帳號充值優惠 重點觀察三類進程:
第一類是你服務本身(例如 Web 服務、API 服務、worker 服務)。
第二類是系統層(cron、logrotate、agent、監控探針、磁碟/網路相關)。
第三類是可疑進程(名字不明、路徑不正常、啟動時間極近、或運行用戶不是你預期的)。
一旦你看到明確的高 CPU 進程,就不要急著殺。先記下:PID、運行用戶、程式路徑、啟動時間,以及是否有多個相似 PID(例如同一服務多 worker 爆炸)。
2. 用 ps 釐清父子關係與執行路徑
有時候 top 看到的是某個 worker,但真正觸發的是父進程或調度器。你可以用 ps 顯示樹狀或關聯信息:
關鍵是找出:
(1)這個進程是由什麼父進程拉起來的;
(2)它的執行檔是在哪個路徑;
(3)它是否在短時間內反覆重啟(如果是,那就是崩潰後自動拉起,或有腳本在循環重試)。
很多「CPU 100%」其實是誤把「重試風暴」當成故障:上游服務慢、連線失敗頻繁,程式在毫無延遲的情況下重試,導致 CPU 被 while(true) 之類的迴圈灌滿。
3. 分辨 CPU 消耗屬性:是 user 還是 system
top 中 CPU 有 user、system 等概念。粗略來說:
如果主要是 user:多半是應用層或腳本計算、序列化/反序列化、加密、壓縮、或死循環。
如果主要是 system:多半與系統調用相關,例如大量磁碟 I/O、網路封包處理、或文件系統操作頻繁。
這個區分能幫你快速轉向檢查方向:user 多就查代碼邏輯;system 多就查磁碟/網卡、內核層負載與重試。
第三章 常見原因拆解:為什麼 CPU 會突然 100%
經驗上,CPU 突然飆到 100% 的原因通常集中在幾大類。你可以用「特徵」快速對號入座,而不是從零開始翻整台機器。
1. 併發突增:請求打爆 worker
很多服務在壓力下不是單純變慢,而是進入「更努力也更沒用」的狀態。典型表現包括:
(1)Web/API 層返回速度變慢,客戶端或上游重試,造成請求暴漲;
(2)worker 數量超出預期(例如你調整了 autoscaling 或 worker 配置,導致同時啟更多進程);
(3)單次請求耗時變高,例如查詢語句變慢、CPU 密集型序列化、或某個依賴庫發生版本差異。
這類問題處理方式通常是:限流、暫停擴容、回滾最近改動、並針對慢點做性能修復(索引、緩存、批量策略、避免不必要的轉換)。
2. 死循環或異常重試:程式把 CPU 當成空氣
華為雲帳號充值優惠 當你看到某個進程 CPU 幾乎穩定在 80%-100%,而且進程行為看似「無輸出」或日志異常稀少,死循環的可能性很高。
常見觸發:
(1)配置檔讀取失敗後回退策略失效,導致一直重試某個錯誤路徑;
(2)外部依賴服務不可用,程式沒有退避(backoff),而是立即重試;
(3)隊列消費者拿不到消息,卻仍在輪詢;
(4)某段計算在邊界條件下爆炸,例如排序/遞迴無上限。
解決通常是:加退避、加熔斷、把輪詢改成事件驅動、限制最大重試次數,以及修正配置讀取和異常處理。
3. 計畫任務或運維工具:cron/備份/掃描在作怪
CPU 100% 有時並不是代碼壞了,而是某個排程在高峰期運行。舉例:
(1)日誌切割、壓縮、或集中上傳;
(2)資料庫或緩存快照;
(3)安全掃描、漏洞檢測、或自動化依賴更新;
(4)資料同步(rsync、ETL)在處理大批量資料。
華為雲帳號充值優惠 你可以對照告警開始時間與系統 cron 或部署紀錄。若是排程造成,就調整排程時間、提高資源或改成增量方式。
4. 數據壓縮/加密/解碼任務異常膨脹
某些應用在處理「大檔案」或「異常資料」時,CPU 消耗會非常驚人。典型例子是:
(1)壓縮算法在不可預期的輸入上變慢;
(2)base64 轉換、JSON 序列化、正則表達式在某些輸入上出現回溯災難(ReDoS);
(3)加密/解密被反覆觸發或參數錯誤導致效率極低。
這類問題需要結合請求樣本、輸入大小、以及最近的格式變更。最直接的方法是在程式層記錄處理耗時和輸入特徵(至少記錄檔案大小、類型、request id)。
5. 資安風險:加挖礦程式或惡意腳本
如果 CPU 100% 的同時,你發現:
(1)有奇怪的新進程、路徑不明(例如在 /tmp、/var/tmp、或奇怪目錄執行);
(2)開啟的網連多且指向陌生地址;
(3)進程啟動時間與你的操作毫無關聯;
那就要把「惡意程序」當成第一嫌疑,而不是最後才查。
這時候處理順序應該是:先隔離(限制出站/止損)、再取證(保留進程資訊、網連資訊、可疑文件的時間戳與 hash),最後才清理與修補漏洞。
第四章 看日志與監控:把「為什麼開始」補齊
定位高 CPU 進程只是第一步。真正能讓你一次性解決問題的是:知道它在 CPU 飆升前後做了什麼。這需要用日志與監控把時間線拼起來。
1. 查程式日志:錯誤是否在同一時間爆發
回到告警開始的時間點,找對應的日志段落。你要看的不是「有沒有報錯」,而是:
(1)是否出現大量同類錯誤;
(2)是否存在重試信息(例如 retrying、backoff、timeout 之類);
(3)是否出現序列化/正則/計算耗時突然變長;
(4)是否有配置載入失敗、連線重置、或依賴服務不可用。
很多「CPU 突然 100%」的背後,是錯誤處理邏輯出了問題。程式不該重試的時候重試、該退避的時候不退避、該停止的時候仍在無限循環。
2. 查系統日志:cron、oom、磁碟/網路問題
你也要看系統層日志。常見關聯包括:
(1)oom-killer 觸發頻繁(雖然那是記憶體問題,但重啟與重試會引發 CPU 再次飆升);
華為雲帳號充值優惠 (2)磁碟滿導致寫入失敗,應用又不斷重試寫入;
(3)網路重連風暴(DNS 解析失敗、TLS 握手失敗、連線重置);
(4)檔案系統異常或 IO wait 上升。
這些都會讓應用進入忙等或頻繁重試狀態,最終表現就是 CPU 100%。
3. 用網路/磁碟指標判斷是否「瓶頸引發連鎖」
你可能注意到:CPU 飆起來時,磁碟或網路也常常同時異常。這不是巧合,而是因為慢點造成重試與等待,等待時間越長,程式越可能用更多 CPU 重新嘗試,形成連鎖。
因此在排查時,不要只把注意力放在應用本身,也要看:
(1)磁碟讀寫是否突增(尤其是大量寫入、日志刷盤);
(2)網卡收包是否暴增(例如有人打流量或端口掃描);
(3)是否有異常的連接數,導致 accept/回收負擔大。
第五章 解決方案:從止血到根治
當你找到了高 CPU 進程與其行為,就要開始「止血」和「根治」。止血是讓系統恢復;根治是避免同樣情況再次發生。
1. 止血:先讓 CPU 回到可接受區間
若高 CPU 進程是你能確定的應用服務,你可以採取:
華為雲帳號充值優惠 (1)臨時降低 worker 數量;
(2)暫停某個高耗時任務;
(3)對入口層限流或暫時降低並發;
(4)對異常 URL 或請求類型做黑白名單(尤其是確定存在惡意輸入的情況)。
華為雲帳號充值優惠 如果進程明顯可疑(例如來源不明的二進位、奇怪腳本),止血也可以是直接停止服務並隔離網路,同時保留證據。
2. 根治:修復觸發機制,而不是只殺進程
很多人採取「殺掉進程」就結束,問題卻會在幾分鐘後再發作。原因常見是:有監控或 systemd 自動拉起、有腳本反覆重啟、或排程任務一直在重跑。
因此你要找觸發點:
(1)systemd unit 或 supervisor 是否自動重啟?如果是,調整 restart 策略或修復程式;
(2)cron 或任務隊列是否仍在投遞?如果是,先清理隊列或暫停調度;
(3)是否某個配置導致永遠失敗並重試?如果是,立刻修正配置並補上退避策略。
3. 程式層的實用修復:退避、限流、熔斷、上限
若你已定位是重試或死循環類問題,通常可以從四個方向根治:
(1)退避(backoff):失敗後不要立即重試,逐步增加等待;
(2)限流(rate limit):限制同時處理數與單次批量數;
(3)熔斷(circuit breaker):依賴不可用時快速失敗,避免把 CPU 花在無效重試;
華為雲帳號充值優惠 (4)上限(max attempts / max iterations):永遠不要讓迴圈沒有停止條件,尤其是輪詢與遞迴。
這些不是理論,而是能直接把 CPU 100% 的概率壓下去。因為你把系統「最壞情況下的行為」設上限了。
4. 針對查詢或序列化:讓耗時變短,而不是硬靠擴容
如果是性能問題(例如資料庫慢查詢、序列化變慢、正則效率低),你需要做針對性修復:
(1)慢查詢定位與索引調整;
(2)批量處理替代逐條處理;
(3)緩存熱數據,減少重複計算;
(4)替換高風險正則或加入輸入大小限制。
擴容可能能短期止血,但如果根因仍在,擴容後只是把同樣的災難放大,CPU 照樣會再飆。
第六章 一個「可落地」的排查清單:照做就能收斂
下面給你一份實戰排查清單。你不需要全部做完,但越多完成,越能快速收斂到根因。
第一輪:時間線與直覺判斷
- 告警開始時間是什麼?是否與部署、排程、備份、更新同時發生?
- CPU 100% 持續多久?是波峰還是穩定飆升?
- 同時段網路與磁碟是否也異常?
第二輪:進程定位
- top/htop 找到 CPU 最高的 1-3 個進程,記錄 PID、用戶、路徑、啟動時間。
- ps 查看父子關係,判斷是否由監控/排程拉起。
- 華為雲帳號充值優惠 判斷 CPU 主要是 user 還是 system,以決定是應用邏輯還是系統瓶頸。
第三輪:日志與錯誤類型
- 查程式日志:同時間點的錯誤是否爆量?是否有重試/超時/輪詢日志?
- 查系統日志:磁碟滿、oom、cron、網路重連、IO wait 是否有異常。
第四輪:假設驗證
- 如果是重試風暴:修改退避與停止條件,並在短期內限流/暫停任務。
- 如果是排程:調整排程時間與資源,或改成增量與分批。
- 如果是性能:定位慢查詢、序列化/正則,做針對性優化。
- 如果是可疑進程:隔離網路、取證、清理,並回查入侵入口與漏洞修補。
華為雲帳號充值優惠 第七章 如何避免下次再發生:把「異常行為」提前攔住
解決 CPU 100% 不是一次救火就結束。真正的改進是讓系統具備「被打到時也不會失控」的能力。
1. 設置更合理的告警與指標組合
只告警 CPU 可能不夠。你最好把告警條件設成組合,例如:CPU 飆升同時網路收包暴增、或磁碟寫入突增、或應用錯誤率升高。這樣能更快判斷是流量問題、IO 問題還是應用邏輯。
2. 在應用內加熔斷與退避,並把重試做成可觀測
你需要讓重試行為可觀測:例如在指標中上報「重試次數、失敗率、熔斷狀態、隊列堆積」。一旦指標異常,你才能在 CPU 100% 之前就發現端倪。
3. 限制隊列與任務批量大小
線上最常見的失控來源是「一次性處理太多」。即使單筆處理沒問題,批量過大也會讓 CPU 爆發。把批量大小設上限,並讓任務具備背壓(backpressure)能力。
4. 定期做基線檢查:進程、磁盤、網連、異常文件
尤其在國際站這類可能面臨更廣泛外部掃描/探測的環境,定期做基線檢查很有價值:服務進程是否符合預期、可執行檔是否在正確路徑、計畫任務是否被篡改、出站連接是否異常。
結語:把 CPU 100% 從「恐慌」變成「流程」
華為雲國際站 ECS CPU 突然 100% 的解決,關鍵不在於你是否猜中原因,而在於你能否按流程快速收斂:先保服務、再定位高耗 CPU 進程、用日志和監控拼時間線、最後做根治。只要你把止血和根治拆開做,且把重試風暴、排程衝突、性能瓶頸與資安風險四類高概率因素逐一驗證,幾乎都能在可控的時間內解決。
下一次若再遇到 CPU 飆升,請你先問一句:它是在「同一時間點」開始的嗎?高 CPU 進程是誰?系統的網路與磁碟是否同時異常?只要你願意用證據而不是直覺,你就會越來越快,而且不會只靠重啟反覆循環。

