博客 / 詳情

返回

拒絕查詢超時:一次真實高併發場景下的 SLS 物化視圖調優實戰

作者:戴志勇

做後端和監控開發的同學,大概都有過這種焦慮時刻:當日志數據量大到一定規模後,原本順暢的查詢就開始“罷工”。監控服務瘋狂報警,或者老闆急着要數據,結果你調用的日誌接口一直卡住,最後直接報請求超時。

最近,我們配合一位深度用户(某大型業務團隊),在他們的核心日誌場景裏落地了 SLS 物化視圖。我們在生產環境中對比了開啓該功能前後的表現,無論是硬指標的性能數據,還是實際的使用體驗,差距都非常大。

本文將結合真實的業務場景與結果數據,覆盤一下我們是如何把幾個總是超時的慢查詢,優化到“秒級”響應的。

案例一:SDK 高併發“轟炸”,終於不再超時了

這是一個非常典型的自動化監控場景。用户的監控服務通過 SDK 高頻調用日誌接口,拉取服務間的調用延時數據。

痛點: 這個場景的難點在於“高併發 + 動態條件”。監控程序會在短時間內發出大量請求,每個請求的查詢條件都在變,比如這一秒查 columnx:"abc",下一秒查 columnx:"abd"。這種用法對後端壓力較大。優化前,平均一次查詢要 4100 毫秒。這就導致一個惡性循環:查詢慢 -> 線程池積壓 -> 併發進一步爭搶資源 -> 最終大面積超時。

去掉業務語義後的 SQL:

query| select 
  column1, column2, column3, 
  (timestamp - timestamp % 3600) as time_slot, 
  count(*) as cnt, 
  avg(metric_val) as avg_lat 
  from log 
  group by column1,column2,column3,time_slot

使用物化視圖後:查詢耗時直接降到了 46 毫秒,性能提升了 89 倍。更重要的是,現在無論 SDK 的併發有多高,或者查詢條件怎麼變,由於只需要讀取預計算好的結果,響應時間都非常穩定,徹底解決了高併發下的超時問題。

案例二:搞定“去重統計”這個性能殺手

做過數據的都知道,count(distinct) 是資源消耗大户,尤其是在數據量很大的場景下。

用户 SQL:

query | select 
  project_id, 
  count(1) as event_cnt, 
  count(distinct hash_val) as issue_cnt
  from log
  group by project_id

為了統計去重後的錯誤特徵(Hash),在數據量較大時,這個 SQL 跑起來較吃力。

  • 優化前:這個查詢之前平均耗時 16.8 秒。稍微把時間範圍拉長一點(比如看過去一個月的趨勢),或者高峯流量大一點,就很容易查不出來。
  • 優化後:通過物化視圖加速,查詢時間降到了 2.2 秒,8 倍的性能提升,已經讓這個功能從“經常不可用”變成了“可以隨時查”。

案例三:同比分析,從“54 秒超時”到“秒級響應”

這是這次優化中性能提升最大的一個場景。用户有一個查看操作日誌讀延遲同比變化的需求(對比 1 天前、3 天前、7 天前的數據)。

用户 SQL:

type:read| 
  select 
  time, 
  diff [1] as day1, 
  diff [2] as day2, 
  diff [3] as day3, 
  diff [4] as day7
  from ( 
    select 
    time,
    ts_compare(avg_latency, 86400, 172800,604800) as diff
    from ( 
      select 
      avg(latency) as avg_latency, 
      date_trunc('hour', __time__) as time
      from log 
    group time ) 
  group by time order by time ) 

這個 SQL 涉及 ts_compare 和多層子查詢嵌套,當查詢時間範圍較大時,計算量非常大。

  • 優化前:耗時 54.3 秒,後端服務稍微抖動一下,用户的請求就超時了,基本上就是一個不可用的狀態。
  • 優化後:耗時 958 毫秒,從接近一分鐘的漫長等待,直接變成了不到 1 秒。性能提升了 56 倍。這種從“查不出來”到“秒開”的體驗變化,對於等着看數據的運維同學來説,是最直觀的。

算一筆賬

這次優化的 ROI(投入產出比)非常划算:

  • 利用率高:一天下來,這幾個視圖累積命中了 10,223 次查詢。
  • 成本極低:大家可能擔心存一份結果會不會很貴,實際看下來,新增的存儲成本還不到原始日誌存儲費用的千分之一,幾乎可以忽略不計。

總結

結合這次實戰經驗,我們也總結了 SLS 物化視圖最適合的三個場景。如果你的業務也中了下面這些情況,直接開啓物化視圖吧:

  1. 專治“必死”的超長慢查詢:如果你的 SQL 裏包含大量的去重統計(count distinct)、高精度的百分位計算(approx_percentile),或者像案例三那樣涉及長週期時間範圍的數據分析。這些操作在原始數據量較大時,怎麼優化都很難跑進幾秒內,甚至直接超時。物化視圖能把這些“算不出來”的硬骨頭提前啃完,把“超時”變成“秒出”。
  2. 對“交互手感”要求極高的場景:並不是説不超時就夠了。對於直接面向用户的數據產品,或者老闆天天看的核心大盤,10 秒和 1 秒是完全不同的體驗。如果你的目標是讓大盤操作起來像本地 Excel 一樣絲滑,預計算是繞不開的路。
  3. 高併發轟炸下的“保命符”:這是最容易被忽視的一點。很多時候單次查詢雖然能忍,但一旦故障發生,幾十號人同時刷新大盤,再加上自動化巡檢腳本(SDK)幾百個併發打過來,很容易觸發服務端的資源瓶頸。物化視圖的本質是把昂貴的“現場計算”變成了低延遲的“查表讀取”。在關鍵時刻,這就是系統不崩盤的基石。

千言萬語不如一張圖。我們將本次實戰的核心性能指標與最佳適用場景濃縮成了下面這張全景圖,希望能為您的性能優化提供參考。

image

點擊此處查看產品詳情。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.