【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

路邊兩盞燈發表於2021-07-22

問題描述

Azure Redis在使用的過程中,多次無規律的出現超時問題。抓取到客戶端的異常錯誤後,想進一步的分析是何原因導致瞭如下異常呢?

Timeout awaiting response (outbound=0KiB, inbound=0KiB, 5984ms elapsed, timeout is 5000ms), command=GET, 
next: GET n:AbpZeroMultiTenantLocalizationDictionaryCache,c:HMedia#zh-CN#0,
inst: 0, qu: 0, qs: 498, aw: False, rs: ReadAsync, ws: Idle, in: 65536,
serverEndpoint: xxxxxx-cache.redis.cache.chinacloudapi.cn:6380,
mc: 1/1/0, mgr: 10 of 10 available, clientName: RD0003FF04A4F7,
IOCP: (Busy=70,Free=930,Min=250,Max=1000),
WORKER: (Busy=430,Free=32337,Min=400,Max=32767), v: 2.1.58.34321

官方文件對該類問題的解釋為:

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

 

雖然這裡Busy大於Min的Worker數量,表示目前客戶端中所設定的ThreadPool值不夠用,需要做一定的調整。但是這並不是Redis出現持續超時的根本原因,還是需要繼續排查是否有某一方面達到了效能的限制呢?

問題分析

  • 第一步:分析Azure Redis的各種指標,檢視在超時時間點是否有突增的尖峰。
  • 第二步:對比尖峰值,檢視是否有突破當前定價層的閾值。
  • 第三步:檢視Redis日誌,發現不常規的點。使用各種已知的命令來輔助調查。
  • 第四步:如何來避免呢?

根據以上的四步原則。檢視Azure Redis的指標,發現網路的讀寫出現尖峰。指標圖類似於:

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

  • 快取讀取量:指定報告間隔期間,從快取中讀取的資料量,以每秒兆位元組數(MB/秒)為單位。 此值來源於支援虛擬機器的網路介面卡,該虛擬機器託管快取,但並不特定於 Redis。 此值對應於該快取使用的網路頻寬。如果要針對伺服器端網路頻寬限制設定警報,則可使用此 Cache Read 計數器來建立警報。
  • 快取寫入量:指定報告間隔期間,寫入快取中的資料量,以每秒兆位元組數(MB/秒)為單位。 此值來源於支援虛擬機器的網路介面卡,該虛擬機器託管快取,但並不特定於 Redis。 此值對應於從客戶端傳送到快取的資料的網路頻寬。

但是,只檢視主節點的流量(注:Azure Redis有兩個節點,一主一從),寫入流量(409KB)與上圖中的38.07MB卻存在巨大的差別, 難到這是有連線直接操作從節點,而不通過主節點?

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

 

#根據以下步驟,就可以檢視到從節點的網路寫入,讀取指標圖:

1在Azure Redis的門戶中,開啟Metrics頁面, 選取name space為Redis Cache standard metrics

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

2)Metric 選取Cache Write (Instance Based)

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

3)新增Filter,Primary = False

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

4)啟用Apply Splitting,按照埠細分

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

 

#如果發現從節點有大量的流量操作,已經嚴重影響主節點的正常指令執行

這個時候,就需要跟進一步的分析,是那些客戶端連線到Redis?它們執行命令的次數有多少呢?它們執行了那些命令呢?

可以通過Redis-cli.exe工具連線到Redis後,通過 client list 當前的客戶端連線情況和IP地址,已經通過numops檢視當前連線已經執行的OPS。然後通過 monitor 指令實時監控命令的執行和所發出請求的IP地址

1) 使用 redis-cli.exe連線到Azure Redis服務

redis-cli.exe -h yourcachename.redis.cache.chinacloudapi.cn -p 6379 -a YourAccessKey

2) 使用 client list 檢視你連線數和 numops數 (實時)

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

3) 使用monitor指令監控所執行的命令(實時)

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

 

#如何來避免其他非法的連線呢?對IP地址進行限制,設定白名單。或者啟用內網訪問 或者啟用專用終結點

【Azure Redis 快取】Azure Redis出現了超時問題後,記錄一步一步的排查出異常的客戶端連線和所執行命令的步驟

[完]

 

 

 

參考資料

排查 Azure Cache for Redis 超時問題:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-troubleshoot-timeouts

將 Redis 命令列工具與 Azure Redis 快取配合使用:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-how-to-redis-cli-tool#connect-using-the-redis-command-line-tool

Azure資料中心各資源的IP地址列表:https://www.microsoft.com/en-us/download/details.aspx?id=57062

Redis Private Endpoint:https://docs.microsoft.com/zh-cn/azure/azure-cache-for-redis/cache-private-link

Redis部署至VNET:https://docs.microsoft.com/zh-cn/azure/azure-cache-for-redis/cache-how-to-premium-vnet

 

相關文章