騰訊雲企業帳號開通 騰訊雲香港伺服器CPU佔用率過高排查
第一章:先把「過高」變成可量化的問題
CPU 佔用率過高這句話看似簡單,但實際上往往掩蓋了不同成因:有的是短時尖峰,有的是長時間爬升;有的是單核被打爆,有的是多核同步飆升;有的是業務正常、只是計算量暴增,有的是某個程序失控或外部依賴異常。排查的第一步,不是上來就殺進程,而是把現象拆清楚,否則你會在錯的方向上做很多無效動作。
以騰訊雲香港伺服器為例,通常你會在監控看板或告警平台看到 CPU 長期高於閾值。這時建議先做三件事:第一,記錄時間範圍。是 5 分鐘就下來,還是已經持續 2 小時?第二,記錄負載型態。CPU 佔用率是「抖動」還是「平台期」?第三,記錄影響。只有 CPU 高,還是同時出現了延遲上升、連線數激增、磁碟 IO 異常、或負載均衡健康檢查失敗。
你可以把排查分成兩條線:一條看「資源層」到底在做什麼(CPU 在被誰吃掉、花在用戶態還是內核態、是否有高上下文切換等);另一條看「業務層」是什麼請求或任務觸發了它(流量變化、排程任務、批處理、爬蟲、緩存失效、外部依賴超時重試等)。當兩條線都指向同一個點,結論就會很快落地。
第二章:確認監控數據沒有「誤導你」
不少事故的起點其實是「看錯」。例如:你看到的是 CPU 佔用率,但同時機器的負載均衡配置、采樣頻率、或監控時間窗造成誤讀。排查要先核對三類數據的來源和口徑。
2.1 CPU 佔用率:看清是總體還是單核
CPU 佔用率通常是按總體計算,但當你懷疑某個核心被打爆時,要立刻拉出更細的指標:各核心使用率、負載平均值(load average)、以及進程的 CPU 熱點。單核飆升常見於:單線程服務死循環、某個壓縮/序列化操作在單核處理、或某個任務被重複觸發。多核同步飆升更像是:批量請求觸發、背景任務並發過高,或多個 worker 同時失去節流機制。
2.2 佔用是用戶態還是內核態
CPU 飆升的「味道」不同:用戶態(user)通常代表應用計算、語言層邏輯、解析/序列化/加密等;內核態(system)常見於大量系統調用、網路堆疊處理、磁碟 IO、或中斷/上下文切換。這一點在你第一輪排查就要看清楚,因為它直接決定你下一步要看什麼方向的原因。
2.3 負載均值與 CPU 的關係
如果 load average 很高,但 CPU 佔用率沒有同等升高,可能代表大量進程在等待(例如磁碟 IO 慢、鎖競用、網路阻塞)。如果 load average 跟 CPU 同步飆升,才更像是純計算或無節制並發。
第三章:用「分層觀察」抓住 CPU 熱點
當你確認時間窗與口徑沒有問題,下一步就是定位「到底是誰在吃 CPU」。這一步要講究順序:先看整體,再看進程,再看線程與呼叫關係。你不必一次看到最細,但要確保每一步都能縮小範圍。
3.1 先看系統概況:CPU、上下文切換、負載來源
在伺服器上,你可以先使用常見工具做概覽:CPU 使用情況、load average、上下文切換頻率、網卡吞吐與錯誤、磁碟吞吐與等待等。此時要特別留意兩個現象:其一是上下文切換是否飆升(context switch 很高常見於大量短任務、鎖競用、或進程/線程過多);其二是磁碟等待是否上升(如果磁碟慢,CPU 不一定很高,但可能出現等待造成的 load 增大)。
3.2 再看進程:CPU Top 列表是你的羅盤
把 CPU 使用率最高的進程列出來,通常 80% 的問題在前五名就會露出端倪。你要記下:進程名、PID、CPU 使用率、運行時長、以及是否多個相似服務同時上榜。
如果 CPU 熱點集中在某個應用服務(例如 Java 服務、Node 服務、Python worker),你就要進入應用層排查;如果熱點在某些系統級或基礎組件(例如 cron、logrotate、rsync、監控 agent),就先看排程與策略是否異常。
3.3 看線程或執行模型:避免「殺錯人」
很多應用在多線程/多 worker 模式下工作。如果你只看到「某個進程吃 CPU 很多」,直接重啟可能暫時止血,但治不了本因。更好的做法是先確認 CPU 是被某一個線程或任務吃掉,還是所有 worker 同時在跑。若是單線程,就更可能是某段邏輯死循環或某個隊列重複處理;若是多線程同時高,往往是輸入量暴增或節流失效。
第四章:常見根因一覽:從最容易的開始排
排查不是盲猜。你可以用「最常見」的路徑,按優先級逐一排除。下面列出的根因在真實環境中出現頻率很高,尤其是雲服務、跨區訪問與依賴服務變更後的場景。
4.1 流量或請求模式突然變了
最常見的原因之一,是外部請求突然增加,或請求模式改變導致計算量暴增。比如某接口原本命中緩存,但因緩存失效導致每次都要走資料庫查詢與複雜計算;又比如某查詢條件變寬,導致掃描量增加;再比如爬蟲或惡意掃描把你的接口打爆,導致應用大量解析與回應。
此時你要對照:在 CPU 飆升前,Web 入口的 QPS、錯誤率、平均響應時間是否同步變化?如果有,就把注意力放到「請求源」和「路由/限流/緩存策略」上,而不是直接處理進程。
4.2 緩存失效或緩存策略不合理
緩存是降低 CPU 的重要手段。當你觀察到 CPU 飆升同時資料庫查詢量暴增,就要懷疑緩存:例如緩存 key 過期時間太短、緩存更新邏輯失效、或某次部署把緩存命名空間改了,導致原先的 key 全丟失。這會造成「短期冷啟」——看似過去很正常,但某天某次事件讓緩存大面積失效,於是所有請求瞬間回源。
4.3 依賴服務超時與重試風暴
另一個非常典型的根因是依賴服務異常:例如下游 API 延遲升高、資料庫連線池耗盡、消息隊列堆積,導致上游超時。當超時後重試策略太激進,就會形成重試風暴:越慢越重試、越重試越慢。最終表現為 CPU 拉高、連線數上升、以及大量線程/協程處於等待或反覆運算。
排查時要看:超時率是否上升?重試次數是否有指標或日志?連線池是否耗盡?如果你發現某個下游在相同時間開始延遲激增,基本就能鎖定方向。
4.4 背景排程或批處理失控
很多 CPU 飆升不是因為線上請求,而是因為定時任務。cron、排程器、或任務隊列在部署後變更,可能導致同一批任務被重複啟動;也可能因為某次任務卡住後沒有釋放鎖,導致後續任務不斷重試占滿 CPU。
你可以從日志或任務系統中確認:在 CPU 上升的前後是否有定時任務開始、數量是否異常、以及任務耗時是否顯著增加。
騰訊雲企業帳號開通 4.5 日誌過量、同步寫入與壓縮打爆 CPU
日誌是最容易被忽略的資源消耗。當磁碟空間逼近或寫入速度下降,應用可能因同步寫入而卡住;同時某些 log rotate 或壓縮行為也可能短期吃掉大量 CPU。你要看:log 總量是否暴增?磁碟 IO 指標如何?壓縮或打包任務是否在同一時間觸發。
4.6 代碼走進了「非預期複雜度」
有些問題是代碼邏輯本身引起的:例如在循環裡做了大量不必要的序列化、把集合反覆線性查找、或把原本應使用索引的查詢變成了全表掃描。這種問題的特徵通常是:某個 API 在某種輸入組合下才會觸發高 CPU,而且用戶端請求數不一定特別大,但單次處理成本被拉高。
騰訊雲企業帳號開通 這時要對齊:CPU 飆升時段內的主要請求路徑是什麼?是否有特定參數組合?是否剛好在那段時間上線了新版本?
第五章:把定位結果落到可操作的處置順序
很多團隊在排查時容易犯兩種錯:第一是只想快點止血,把機器重啟或直接 kill;第二是陷入細節,長時間不處理業務風險。更好的策略是「分階段」:先保證穩定,再做深入原因分析,最後回到系統設計做修復。
5.1 先止血:降低輸入或隔離熱點
當 CPU 過高已經影響服務(例如超時率升高、回應延遲升高),你需要先做止血。止血通常不是盲目殺進程,而是用最小代價降低負載:例如在入口做限流、暫時關閉非核心功能、調整負載均衡權重、或暫停某個批處理任務。這樣能給你排查留出時間,也避免因為重啟導致狀態丟失。
騰訊雲企業帳號開通 若熱點集中在某個 worker,可以考慮降低該 worker 的並發或增加隔離(例如把隊列消費速度降下來)。重啟雖然簡單,但可能把問題「延後」,而非真正解除。
5.2 再定位:用證據替代猜測
止血後,應該回到定位。你要確認:CPU 熱點進程是否仍然存在?在壓力降低後,CPU 佔用是否同步下降?如果下降,說明熱點與當前輸入有關;如果仍然高,可能是某個無休止的背景循環、鎖競用、或外部依賴仍在觸發重試。
這時你可以開始做更深的觀察:例如抓取關鍵進程的堆棧、查看任務隊列長度、比對最近部署差異、查詢外部依賴的健康狀態。重點是形成因果鏈:某個事件或條件 → 觸發某段行為 → 造成 CPU 飆升 → 最終影響服務。
5.3 最後修復:改策略而不是反覆止血
一個好的修復應該同時解決三件事:第一,降低同類事件的概率(例如限流、超時與重試退避、熔斷)。第二,縮短問題暴露到恢復的時間(例如監控告警、快速回滾機制)。第三,讓故障可觀測(例如把關鍵指標、關鍵日志、trace 補齊)。
騰訊雲企業帳號開通 如果你只是反覆 kill 或重啟,下一次仍然可能以同樣的方式爆掉。修復的方向要落到系統設計與代碼策略上,而不是僅停留在當次事件。
第六章:典型排查案例:香港節點高 CPU 的幾種常見劇本
下面用更貼近日常的方式,描述幾個常見劇本。你可以把它當成檢查清單:對照現象,看你更像哪一種。
6.1 劇本一:入口流量正常,但某個任務在跑
現象:CPU 高,QPS 下降或持平;但系統 load 仍高,且 CPU Top 進程是定時任務或批處理程序。日志顯示某任務在同一時間啟動了多次,或重試機制導致重複處理。
處置思路:先暫停該任務,確認任務是否重複投遞;再檢查任務的分佈式鎖、去重策略與回溯機制。修復通常在於:加入「單次執行保證」、修正並發控制、或調整重試退避與最大重試次數。
6.2 劇本二:CPU 飆升同時磁碟 IO 與網路出現異常
現象:CPU 高且 system 比例偏高;網卡吞吐或重傳增加,磁碟 IO 等待顯著上升;同時應用的錯誤率上升。
處置思路:優先看網路與磁碟是否有外部原因:例如外部依賴下載大量數據、日志寫入量暴增、或某個同步任務導致磁碟飽和。修復通常是:調整緩存與批量策略、降低同步寫入、提高磁碟空間與 IO 配額,並優化網路重試。
6.3 劇本三:多個 worker 同時拉高,且錯誤率上升
現象:CPU Top 里多個相同服務或 worker 都在高位;同時你在應用層看到大量超時與重試。外部依賴(例如資料庫或下游 API)延遲升高。
處置思路:先做限流和熔斷,把重試風暴切斷;再定位依賴服務的健康狀態,確認是否是慢查詢、連線池耗盡或下游性能下降。修復通常是:對外依賴增加退避重試、調整連線池參數、以及為慢操作加上超時與降級策略。
6.4 劇本四:部署後才出現,且熱點集中於單個核心
現象:剛上線新版本後 CPU 開始上升;CPU 熱點集中在某個單線程任務,且堆棧顯示某個迴圈或計算邏輯異常。
處置思路:快速回滾或關閉新特性以止血;同時用測試資料重現並定位複雜度問題。修復通常是:修改演算法或資料結構,避免在高頻路徑上做昂貴計算,並加上針對極端輸入的性能測試。
第七章:監控與告警要「指向行動」,而不是只報錯
騰訊雲企業帳號開通 CPU 高是結果,不是原因。若你只能看到一個「CPU 佔用率過高」告警,而沒有配套的指標來幫你立即縮小範圍,就會陷入反覆排查。更實用的做法是讓告警帶上足夠上下文。
7.1 建議補上的關鍵指標
至少在系統層面建立關聯:用戶態/內核態、load average、top 進程(CPU top5)、上下文切換、磁碟 IO 等待、網卡重傳/錯誤、以及連線數。應用層面則要有:QPS、錯誤率、平均延遲、超時率、重試次數、隊列長度、以及核心依賴的延遲與錯誤。
7.2 告警策略:先看「突發」再看「持續」
突發尖峰的處理方式與持續高位不同。你可以設計兩類告警:短時間(例如 3-5 分鐘)尖峰用於提示觀測;長時間(例如 15-30 分鐘)持續告警用於觸發處置流程。這樣可以避免團隊被短暫波動反覆打擾,同時保證真正的故障不會被忽略。
7.3 用變更管理縮短定位時間
尤其在雲上,CPU 高往往與變更相關。把部署時間、參數調整、隊列配置變更、緩存策略改動等事件記錄到同一時間軸上。當 CPU 上升時,你就能第一時間回看「那段時間你改了什麼」。這比盲目翻日誌快很多,也更符合工程化思維。
第八章:結論——真正的能力在於「建立因果鏈」
騰訊雲香港伺服器 CPU 佔用率過高的排查,不應該停留在「把 CPU 壓下去」這個短期目標。你要做的是建立一條可驗證的因果鏈:監控顯示何時何地何種型態的 CPU 異常 → 系統層找到熱點是進程/態別/資源等待 → 應用層定位是請求、任務還是依賴 → 形成可重現的原因 → 最後用限流、退避、熔斷、去重、優化算法與完善監控閉環。
當你養成這套流程,你會發現排查速度會變快:因為每次都不是從零開始猜,而是在已有的檢查清單中逐步排除;因為每個處置都有證據支撐;因為修復能落到策略與代碼,而不是靠重啟硬扛。
CPU 高的問題終究會再發生,但只要你能把它從「模糊的告警」變成「清晰的工程化事件」,它就不再可怕。真正拉開差距的,是你能否在最短時間內把原因抓住,並讓系統下次不再以相同方式失控。

