針對 Azure Cache for Redis 的延遲及逾時進行疑難排解 (機器翻譯)

未收到及時回應的用戶端作業可能會導致高延遲或逾時例外狀況。 一項作業可能會在各種階段上逾時。 逾時的來源有助於判斷原因和緩和降低風險。

本節討論連線到 Azure Cache for Redis 時所發生的延遲和逾時問題的疑難解答。

注意

本指南中的數個疑難解答步驟包括執行 Redis 命令和監視各種效能計量的指示。 如需詳細資訊和指示,請參閱<其他資訊>一節中的文章。

用戶端疑難解答

以下是用戶端疑難解答。

流量高載和執行緒集區設定

結合不良 ThreadPool 設定的流量高載可能會導致 Redis 伺服器已傳送但尚未在用戶端取用的處理數據時發生延遲。 檢查「錯誤」計量 (類型:UnresponsiveClients),確認您的用戶端主機是否可以因應突然增加的流量。

使用範例ThreadPoolLogger來監視統計數據ThreadPool隨著時間變化的方式。 您可以使用 TimeoutException StackExchange.Redis 的訊息進一步調查:

    System.TimeoutException: Timeout performing EVAL, inst: 8, mgr: Inactive, queue: 0, qu: 0, qs: 0, qc: 0, wr: 0, wq: 0, in: 64221, ar: 0,
    IOCP: (Busy=6,Free=999,Min=2,Max=1000), WORKER: (Busy=7,Free=8184,Min=2,Max=8191)

在上述例外狀況中,有數個問題很有趣:

  • 請注意,在 IOCP 區段和 WORKER 區段中,您有 Busy 大於 Min 值的值。 此差異表示您的 ThreadPool 設定需要調整。
  • 您也可以看到 in: 64221。 這個值表示在用戶端的核心套接字層收到64,221個字節,但應用程式並未讀取。 這項差異通常表示您的應用程式(例如 StackExchange.Redis)不會在伺服器傳送數據給您時,儘快從網路讀取數據。

您可以設定 ThreadPool 設定,以確保線程集區會在高載案例下快速相應增加。

大型索引鍵值

如需使用多個索引鍵和較小值的相關信息,請參閱 考慮更多索引鍵和較小的值

您可以使用 redis-cli --bigkeys 命令來檢查快取中是否有大型金鑰。 如需詳細資訊,請參閱 redis-cli、Redis 命令行介面--Redis

  • 增加 VM 的大小,以取得更高的頻寬功能
    • 用戶端或伺服器 VM 上的更多頻寬可能會減少較大型響應的數據傳輸時間。
    • 將這兩部機器上目前的網路使用量與目前 VM 大小的限制進行比較。 只有伺服器上的更多頻寬,或用戶端上的頻寬可能不夠。
  • 增加應用程式所使用的連接物件數目。
    • 使用迴圈配置資源方法來對不同的連接物件提出要求

用戶端主機上的高 CPU

高用戶端CPU使用量表示系統無法跟上指派的工作。 即使快取快速傳送回應,用戶端可能無法及時處理回應。 我們建議將用戶端 CPU 保持在 80% 以下。 檢查計量「錯誤」(類型: UnresponsiveClients) 以判斷您的用戶端主機是否可以及時處理來自 Redis 伺服器的回應。

使用 Azure 入口網站 或計算機上性能計數器中提供的計量,監視用戶端的系統全系統 CPU 使用量。 請小心不要監視進程 CPU,因為單一進程可能會有低 CPU 使用量,但全系統的 CPU 可能很高。 監看與逾時對應的CPU使用量尖峰。 高 CPU 也可能造成錯誤訊息中的TimeoutExceptionin: XXX值,如 [流量高載] 區段所述。

注意

StackExchange.Redis 1.1.603 和更新版本包含 local-cpu 錯誤訊息中的 TimeoutException 計量。 請確定您使用的是最新版的 StackExchange.Redis NuGet 套件。 Bug 會在程式代碼中定期修正,使其更強固於逾時。 擁有最新版本很重要。

若要降低用戶端的高 CPU 使用量:

  • 調查造成 CPU 尖峰的原因。
  • 將客戶端升級至具有更多 CPU 容量的較大 VM 大小。

用戶端主機上的網路頻寬限制

視用戶端電腦的架構而定,它們可能會有可用的網路頻寬限制。 如果用戶端多載網路容量而超過可用的頻寬,則資料在用戶端上的處理速度不會和伺服器傳送資料的速度一樣快。 這種情況可能會導致逾時。

使用 範例 BandwidthLogger來監視頻寬使用量隨著時間變化的方式。 在某些具有限制許可權的環境中,此程式代碼可能無法成功執行(例如 Azure 網站)。

若要減輕,請減少網路頻寬耗用量,或將用戶端 VM 大小增加為具有更多網路容量的 VM 大小。 如需詳細資訊,請參閱 大型要求或回應大小

Linux 型用戶端應用程式的 TCP 設定

由於 Linux 中的開放式 TCP 設定,在 Linux 上裝載的用戶端應用程式可能會遇到連線問題。 如需詳細資訊,請參閱 Linux 裝載用戶端應用程式的 TCP 設定

RedisSessionStateProvider 重試逾時

如果您使用 RedisSessionStateProvider,請確定您已正確設定重試逾時。 此值 retryTimeoutInMilliseconds 應高於 operationTimeoutInMilliseconds 值。 否則,不會發生重試。 在下列範例中, retryTimeoutInMilliseconds 會設定為 3000。 如需詳細資訊,請參閱 ASP.NET Azure Cache for Redis 的會話狀態提供者和 如何使用會話狀態提供者和輸出快取提供者的組態參數。

<add 
    name="AFRedisCacheSessionStateProvider"
    type="Microsoft.Web.Redis.RedisSessionStateProvider"
    host="enbwcache.redis.cache.windows.net"
    port="6380"
    accessKey="..."
    ssl="true"
    databaseId="0"
    applicationName="AFRedisCacheSessionState"
    connectionTimeoutInMilliseconds = "5000"
    operationTimeoutInMilliseconds = "1000"
    retryTimeoutInMilliseconds="3000"
>

伺服器端疑難解答

以下是伺服器端疑難解答。

伺服器維護

計劃性或非計劃性維護可能會導致用戶端連線中斷。 例外狀況的數目和類型取決於程式碼路徑中要求的位置,以及快取關閉其連線的時間。 例如,傳送要求但未在故障轉移發生時收到回應的作業可能會發生逾時例外狀況。 關閉連接物件上的新要求會接收連線例外狀況,直到重新連線成功為止。

如需詳細資訊,請參閱下列其他區段:

若要檢查 Azure Cache for Redis 在逾時發生期間是否有故障轉移,請檢查計量 錯誤。 在 Azure 入口網站 的 [資源] 功能表上,選取 [計量]。 然後建立測量 Errors 計量的新圖表,並依 分割 ErrorType。 建立此圖表之後,您會看到故障轉移計數。

如需故障轉移的詳細資訊,請參閱 Azure Cache for Redis 的故障轉移和修補。

伺服器負載偏高

高伺服器負載表示 Redis 伺服器無法跟上要求,導致逾時。 伺服器的回應速度可能很慢,且無法跟上要求速率。

監視伺服器負載等計量 。 監看與逾時對應的使用量尖峰 Server Load針對伺服器負載上的計量建立警示 ,以便儘早收到潛在影響通知。

您可以進行幾項變更來減輕偏高的伺服器負載:

  • 調查造成高伺服器負載的原因,例如 本文所述長時間執行的命令,因為記憶體壓力很高。
  • 向外延 展至更多分區,以將負載分散到多個 Redis 進程,或相應增加為具有更多 CPU 核心的較大快取大小。 如需詳細資訊,請參閱 Azure Cache for Redis 規劃常見問題
  • 如果 C1 快取上的生產工作負載受到病毒掃描的額外延遲負面影響,您可以透過支付具有多個 CPU 核心的較高層級供應專案來降低效果,例如 C2

伺服器負載的尖峰

C0C1 快取上,您可能會在 VM 上執行病毒掃描時,看到伺服器負載的短暫尖峰不會因為要求增加而增加。 當病毒掃描發生在這些層級時,您會看到要求延遲較高。 C0 和 C1 層上的快取只有單一核心可多任務,並分割處理病毒掃描和 Redis 要求的工作。

高記憶體用量

本節已移至其他地方。 如需詳細資訊,請參閱 高記憶體使用量

長時間執行的命令

某些 Redis 命令的執行成本高於其他命令。 Redis 命令文件顯示每個命令的時間複雜度。 Redis 命令處理是單一執行緒。 任何需要長時間執行的命令都可以封鎖之後的所有其他命令。

檢閱您要發給 Redis 伺服器的命令,以瞭解其效能影響。 例如, KEYS 命令通常用於不知道它是 O(N) 作業。 您可以使用 SCAN 來避免金鑰,以減少 CPU 尖峰。

使用 SLOWLOG GET 命令,您可以測量針對伺服器執行的昂貴命令。

客戶可以使用主控台來執行這些 Redis 命令,以調查長時間執行且昂貴的命令。

  • SLOWLOG 可用來讀取和重設 Redis 慢速查詢記錄。 它可以用來調查用戶端上長時間執行的命令。 Redis 慢速記錄是一個系統,可記錄超過指定運行時間的查詢。 運行時間不包含 I/O 作業,例如與用戶端交談、傳送回復等等,但只是實際執行命令所需的時間。 客戶可以使用 命令來測量/記錄對其 Redis 伺服器 SLOWLOG 執行的昂貴命令。
  • MONITOR 是偵錯命令,可串流處理 Redis 伺服器處理的每個命令。 它有助於瞭解資料庫發生的情況。 此命令要求高,而且可能會對效能造成負面影響。 它可能會降低效能。
  • INFO - 命令會傳回伺服器的相關信息和統計數據,其格式很簡單,可供計算機剖析,而且人類易於閱讀。 在此情況下,CPU 區段對於調查 CPU 使用量很有用。 伺服器負載為 100 (最大值)表示 Redis 伺服器一直忙碌中,而且在處理要求時永遠不會閒置。

輸出範例:

# CPU
used_cpu_sys:530.70
used_cpu_user:445.09
used_cpu_avg_ms_per_sec:0
server_load:0.01
event_wait:1
event_no_wait:1
event_wait_count:10
event_no_wait_count:1
  • CLIENT LIST - 傳回用戶端連接伺服器的信息和統計數據,大部分是人類可讀的格式。

網路頻寬限制

不同的快取大小具有不同的網路頻寬容量。 如果伺服器超過可用的頻寬,則數據不會儘快傳送至用戶端。 用戶端要求可能會逾時,因為伺服器無法快速將資料推送至用戶端。

您可以使用「快取讀取」和「快取寫入」計量來查看使用的伺服器端頻寬量。 您可以在 入口網站中檢視這些計量針對快取讀取或快取寫入等計量建立警示 ,以便儘早收到潛在影響通知。

若要減輕網路頻寬使用量接近最大容量的情況:

StackExchange.Redis 逾時例外狀況

如需在使用 StackExchange.Redis 時解決逾時的詳細資訊,請參閱 調查 StackExchange.Redis 中的逾時例外狀況。