海外雲在線 海外雲在線 立即諮詢

阿里雲國際帳號認證 找出真凶利用阿裡雲DAS輕鬆抓取導致CPU100百分比的慢SQL

阿里雲國際 / 2026-06-25 13:45:33

第一章:CPU 100% 的瞬間,誰在搗亂?

凌晨兩點,監控告警像警笛一樣刺耳:CPU 使用率長時間維持在 100%,服務延遲暴漲,隊列積壓,偶爾還伴隨超時。很多團隊第一反應是「重啟」或「擴容」——這些做法有時能救急,但它們不回答一個更重要的問題:到底是哪條 SQL 把資源吃乾抹淨?

在資料庫事故裡,慢 SQL 往往不是孤立事件,它通常帶著一整套副作用:執行計畫變差、索引被忽略、統計資訊失真、鎖等待被放大、甚至是某段程式被重試機制放大了壓力。要找到真凶,就必須把「CPU 爆表」和「SQL 行為」連成一條可追溯的線。

本文的主線很簡單:用阿裡雲 DAS(Data Analytics Service / 通常指其資料庫監控與分析能力)去抓取造成 CPU 100% 的慢 SQL,並把每一步都做到可落地。你不需要先懂所有資料庫內部知識,只要掌握幾個觀察角度:慢 SQL 是什麼、是否大量重複觸發、它在什麼時間段產生、是否卡在鎖或被迫做全表掃描、以及最後的修復方向。

第二章:先看現象,再定義「真凶」

很多人拿到告警後就直接翻慢查詢列表,結果常常是:列表很長、SQL 很多、但每條都看起來「也沒那麼離譜」。問題在於你沒有定義「真凶」的判準。CPU 100% 的真凶,通常具備至少一個特徵:

  • 執行頻率高:同一條 SQL 在短時間內反覆觸發,導致 CPU 被累積吃光。
  • 耗時長:單次查詢非常慢,且慢的程度足以持續佔用 CPU 或造成其他操作排隊。
  • 計畫不合理:例如索引失效導致全表掃描、笛卡爾積、過多的排序/聚合等。
  • 被鎖放大:等待鎖的時間看似在「等」,但實際上造成連鎖阻塞,最終吞吐下降、CPU 與上下文切換飆升。

因此,第一步不是「找到最慢那條」,而是「找到最可能把 CPU 打滿的那幾條」。接下來我們用 DAS 做這件事。

第三章:用 DAS 把問題落到時間線

當你看到 CPU 告警時,務必同步抓取以下時間點:告警開始的時間、CPU 開始攀升的前後、以及是否有發布、流量增長、批次任務等事件。因為慢 SQL 的證據通常只在那段時間最明顯,過了就會被其他查詢淹沒。

在 DAS 的監控視圖中,你可以先定位資料庫實例,查看 CPU、QPS、連接數、慢查詢數等核心指標。你要盯的不是一個數字,而是關係:CPU 上升是否伴隨慢查詢數增加?QPS 是否異常波動?連接數是否暴增?如果 CPU 100% 但慢查詢數並不多,真凶可能在「非慢 SQL」——例如特定查詢其執行時間不長但頻率極高;或某些後台任務(統計/維護/索引重建)把資源吃掉。

但在多數線上事故中,慢 SQL 或性能退化確實會同步出現。接下來你要做的是把「慢 SQL」從抽象概念變成「一組具體候選」。

第四章:抓取候選慢 SQL——從海量列表到可對比的排名

在 DAS 裡找到慢查詢分析或 SQL 監控頁面後,你會看到慢 SQL 列表。此時最常見的錯誤是直接按耗時排序,忽略 CPU 的特性。更合理的策略是做交叉篩選:

  • 阿里雲國際帳號認證 時間範圍:只看 CPU 告警開始前後的窗口,例如前後 30 分鐘或 1 小時。
  • 執行次數:優先看執行次數高的 SQL(因為 CPU 是累積耗用)。
  • 耗時分佈:關注平均耗時與分位數(若有),避免被單次極端值誤導。
  • 是否為同一模板:同一條 SQL(或同一類型)可能因參數不同而呈現為多條相近語句,你需要做聚合。

假設你在 DAS 中看到某條 SQL 在告警期間執行了數萬次,平均耗時 50ms,另外一條只執行了十幾次但每次耗時 3 秒。那麼真正更可能打滿 CPU 的,往往是前者:因為它把 CPU 以「反覆、小碎」的方式吃掉,導致上下文切換與執行排隊長期存在。

在這一步,你的目標不是立刻下結論,而是把候選縮小到 3~5 條。通常候選過多意味着你的篩選維度不夠準;而候選過少則可能代表你看的窗口太窄,或 CPU 的主要來源不是慢 SQL。

第五章:確定「真凶」——從單條慢 SQL 到實際資源消耗

當候選縮到幾條 SQL 後,接下來要判斷它們是不是「真正在打 CPU」的那個。你需要做兩個層次的核對:資料層面的合理性、以及運行層面的影響。

5.1 觀察執行頻率與佔比

在 DAS 裡通常可以看到每條 SQL 的執行次數、耗時總量或佔比。你可以用一個簡單但有效的思路:耗時總和(或加權耗時)越高,越可能對 CPU 形成主要壓力。

CPU 打滿並不只與「單次耗時」相關,還與「同時併發」和「執行總量」相關。即使某條 SQL 單次耗時不長,只要執行總量足夠大,它就能把 CPU 拉到上限。

5.2 核對鎖等待與阻塞

很多團隊誤以為「慢 SQL 代表在算」,但實際上慢 SQL 很可能是在「等」。DAS 若提供鎖等待、阻塞分析或可以聯動查看相關指標,你要特別關注:

  • 該 SQL 是否伴隨 lock_wait 或排隊現象?
  • 是否有某些寫入(UPDATE/INSERT)導致大量讀取被鎖住?
  • 是否同一條 SQL 在同一時間段形成阻塞風暴?

一旦鎖等待是核心問題,修復方向就不再是單純的「加索引」,而是要從交易設計、隔離級別、批次大小、是否存在長事務等角度處理。

5.3 核對執行計劃與索引命中

確定候選後,你要把 SQL 對應的執行計劃拉出來(DAS 通常可提供 SQL 分析、執行計劃、或可聯動查詢)。判斷指標包括:

  • 是否使用了預期索引?還是落入全表掃描/索引退化?
  • 是否出現大量 rows 估算偏差(例如實際掃描行數遠大於估算)?
  • 阿里雲國際帳號認證 是否產生昂貴的排序(filesort)、聚合(group by)或嵌套迴圈導致爆炸?

當你看到「掃描行數飆升」或「索引命中率下降」的跡象,基本可以判定真凶與索引/統計/條件寫法相關。

第六章:一個常見案例——看似查詢慢,實際是索引失效

假設告警期間 DAS 排名靠前的一條 SQL 類似於(僅示意):

SELECT ... FROM order_detail
WHERE user_id = ?
  AND status = ?
  AND create_time BETWEEN ? AND ?
ORDER BY create_time DESC
LIMIT 50;

你在候選列表看到它執行次數極高,平均耗時中等偏高。這時你拉執行計劃,發現它沒有走複合索引,而是走了單列索引或直接退化成大量掃描。可能原因包括:

  • 複合索引順序與查詢條件不一致,例如索引是 (status, create_time, user_id),但條件最先用的是 user_id。
  • 某些條件型別不匹配,導致隱式轉換(例如 create_time 字段為 datetime,但參數被當成字串比較)。
  • 統計資訊過舊,優化器估算錯誤,選錯了執行路徑。

如果你的資料表在近期發生過寫入量劇增或資料分佈改變,統計資訊確實容易失真。結果就是:同樣的 SQL,過去走索引,現在不走了。

阿里雲國際帳號認證 這也是為什麼我們要用 DAS 先定位時間窗口。你可以把「觸發 CPU 爆表的 SQL」與「最近一次索引/資料分佈變化或發布」對照,通常能找到關聯。

第七章:修復路徑——不是只有加索引

抓到真凶後,修復有多種路徑。選哪一條,取決於你在 DAS 分析中看到了什麼。

7.1 如果是索引不命中:補齊或調整複合索引

最常見的修復是建立或調整索引。要注意兩點:第一,索引不是越多越好,過多索引會拖慢寫入;第二,複合索引要匹配查詢條件的過濾順序與排序需求。

回到示例:如果查詢同時過濾 user_id、status、時間範圍並按 create_time 倒序排序,那複合索引可能需要考慮覆蓋條件的排列,例如 (user_id, status, create_time)。但最終仍要以實際執行計劃為準:你希望看到 rows 掃描下降、排序不再需要額外 filesort、成本估算合理。

7.2 如果是統計失真:更新統計與檢查自動分析策略

當你看到估算行數明顯偏離實際,通常與統計資訊有關。修復方式可能包括手動更新統計、調整自動統計的頻率、或在資料量變動大時觸發重新分析。

這種修復的特點是:SQL 本身可能沒改,卻因為資料分佈變了導致執行計劃改變。你用 DAS 定位「在哪個時間點開始變慢」,對應回去看資料增長與統計更新節奏,就能形成合理證據鏈。

7.3 如果是寫入或鎖放大:調整事務、批次大小與隔離級別

如果 DAS 顯示真凶 SQL 的慢主要由 lock wait 或阻塞造成,索引可能只是局部解法。你更需要看:

  • 是否存在長事務(例如大批量更新未提交)?
  • 批次大小是否過大導致鎖持有時間延長?
  • 是否因為重試機制或並發策略,造成大量相同請求同時等待同一資源?

這時修復方向是工程性的:縮短鎖持有時間、把大操作拆成可控批次、在必要時調整隔離策略,並配合觀察 CPU 是否伴隨鎖等待下降。

7.4 如果是應用層問題:避免把查詢放進迴圈或 N+1

有些事故不是資料庫選錯路徑,而是應用把它濫用。典型場景是 N+1 查詢:在一次請求中執行大量相似 SQL,單次都不一定特別慢,但總量大到把 CPU 撐爆。

DAS 在這種情況下常常也會顯示「同模板 SQL 的執行次數異常高」——你看到的真凶不是最慢,而是「量最大」。修復策略是改成批量查詢、預取(prefetch)、或把統計計算移到更合理的位置。

第八章:用 DAS 驗證修復是否奏效

修復後最怕的不是「沒效果」,而是「效果看似有,但其實只是轉移到了別的地方」。所以你需要用 DAS 做回歸驗證。

阿里雲國際帳號認證 驗證應該同時看兩類指標:

  • 性能指標:CPU 是否下降、慢查詢數是否回落、延遲是否恢復穩定。
  • SQL 指標:真凶 SQL 的執行計劃是否改變、rows 掃描是否下降、耗時與佔比是否同步改善。

如果 CPU 沒降,但慢查詢列表裡那條真凶耗時下降了,可能代表 CPU 壓力已轉移到其他 SQL;這時候你需要回到 DAS 時間線重新抓一次候選,避免「局部修好、全局仍爆」。

相反,如果 CPU 大幅下降,但真凶 SQL 的佔比只小幅下降,則可能是其他配套因素(例如批量導致的併發降低)同時發生。你依然需要確認修復是否帶來可預期的長期收益。

第九章:抓到一次不夠,要把監控做成制度

一次事故解決容易,下一次不必然還同樣有效。你需要把這次「找出真凶」的經驗固化成可複用的方法。

9.1 建立告警到分析的標準流程

建議團隊把「CPU 告警」對應的排查流程寫成 checklist,例如:

  • 確認告警開始時間與背景事件(發布、流量、批次)。
  • 用 DAS 把慢 SQL 限定到時間窗口。
  • 用執行次數/耗時總和而非單次最大耗時做排序。
  • 核對鎖等待或阻塞信息(若有)。
  • 拉執行計劃,判斷索引命中與掃描行數。
  • 根據原因選擇索引/統計/事務/應用修復策略。
  • 修復後用 DAS 回歸驗證 CPU 與真凶 SQL 的佔比。

這個流程的價值在於:你不再依賴個人經驗,而是讓每次排查都能更快收斂。

9.2 為高風險 SQL 設定更精細的觀測

阿里雲國際帳號認證 如果 DAS 能針對特定語句或關鍵表做更細的監控,就把它當成「重點目標」。例如:查詢面向核心交易、訂單/支付/物流等表的高頻 SQL。對這些語句,你可以:

  • 設定更嚴格的慢查詢閾值。
  • 對同模板 SQL 做併發與執行次數監控。
  • 定期回顧執行計劃變化(特別是資料量增長後)。

9.3 做容量與回退預案

即便你找到了真凶,也要假設它可能再次出現。比如索引變更、資料分佈變化、或程式發布引入了更高頻的相同查詢。此時你需要回退預案:

  • 臨時限流或降級策略:保護主流程。
  • 必要時的 SQL 變更回滾:避免繼續擴大影響。
  • 資料庫維護策略:更新統計、索引重建等要有節奏。

預案不是用來好看的,是為了讓你在下一次 CPU 爆表時不至於慌亂。

第十章:把「抓取」變成「結案」

阿裡雲 DAS 的價值在於縮短你從「現象」到「證據」的距離。當 CPU 100% 時,你不是要猜,而是要找到能被驗證的那條 SQL:它在告警時間窗裡反覆執行,它在執行計劃上出現了不合理的索引/掃描,它對應的耗時或鎖等待能解釋 CPU 的飆升。

阿里雲國際帳號認證 結案的標準也不應只是「CPU 下來了」。真正的結案是:你確認了原因,修復了根因,並在 DAS 裡看到真凶 SQL 的行為穩定改善。這樣才算把事故從一次性止血變成可持續的治理。

下一次當告警再響,你會發現流程其實已經在心裡。你不需要靠運氣,也不需要靠吼叫。你只要沿著時間線、沿著候選排名、沿著執行計劃的證據,一步一步抓到真凶,然後讓它永遠不再回來。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系