QPS過萬,redis大量連線超時怎麼解決?

科技繆繆發表於2020-08-23

    7月2號10點後,剛好某個負責的服務發生大量的redis連線超時的異常(redis.clients.jedis.exceptions.JedisConnectionException),由於本身的資料庫查詢快取在redis中2分鐘,並且未做降級措施,而且本身不能做限流處理,而且隨著午高峰的時間流量在飆升,並且從10點開始的2000的QPS,在11點達到高峰的13000QPS。

 

    好在只是redis超時導致的某個查詢的失效,並不會導致整個主鏈路的流程不可用,所以接下來是怎麼快速發現和解決問題。

 

    1、首先和負責redis同學排查,先排除redis本身的問題

    2、服務自查

 

異常分佈

如果監控可以看到單機維度的話,切換到單機維度檢視異常是否均勻分佈,如果分佈不均勻,只是少量的host特別高,基本可以定位到出現問題的機器

 

Redis負載

檢視redis叢集是否有節點負載過高,比如以常規經驗看來的80%。

    • 如果有一個或少量節點超過,則說明存在「熱key」問題。

    • 如果大部分節點都超過,則說明存在「redis整體壓力大」問題。

 

慢請求

檢視監控,如果有慢請求的時間和發生問題的時間匹配,則可能存在「大key」問題

 

客戶端原因

常見的幾個問題原因有:

  • CPU

  • 程式GC

  • 網路

  • 容器宿主機

CPU

觀察機器或容器的CPU:

    • CPU (100%)是否接近或超過80%

    • CPU限流是否存在密集的限流 或者長時間的限流

如果存在這些現象,應該是「計算資源不足」的問題

程式GC

頻繁的GC或者GC耗時過長會讓執行緒無法及時被排程到讀取redis響應。

通常是用每分鐘GC總時長/60s/每分鐘GC個數,如果達到ms級了,對redis讀寫延遲的影響就會很明顯。

然後也要對比和之前正常時是否存在明顯上升。

網路

度量網路質量一般可以看TCP重傳率的監控,這個比率越低越好。如果TCP重傳率保持在0.02%(以自己的實際情況為準)以上,或者突增,可以定位到是否是「網路問題」。

 

我的問題定位到這裡其實已經發現了,容器的TCP重傳率非常高,有些甚至達到了0.6%,諮詢容器的同事建議重啟容器,重啟之後立刻解決問題。

 

繼續說排查思路。

容器宿主機

通過監控檢視容器宿主機的CPU情況,有一些可能機器是虛擬機器的情況,CPU的監控指標可能不準確,特別是對於io密集型的情況會有較大差異。可以通用OPS提供的其他手段來查詢。

 

由於保密性的問題,問題的截圖是不能放的,但是這個事情其實也是敲響一個警鐘,熔斷限流降級措施在關鍵性的鏈路一定要保證有,重要的事情說3遍,要有X3!

 

而且原來的歷史程式碼本身也有一點小問題,這些快取的資料其實大半年都不會變分擔分的,完全不需要redis快取,記憶體級別的快取就足夠了,或者說記憶體快取+redis做級快取也是一個比較合理的方案。平時開發中要充分考慮資料的時效性來做對應的設計。

 

 

相關文章