共用方式為


針對 Azure Cache for Redis 的延遲及逾時進行疑難排解

這很重要

Azure Cache for Redis 宣布了所有 SKU 的淘汰時間表。 建議您儘快將現有的 Azure Cache for Redis 執行個體移至 Azure 受控 Redis

有關退役的更詳細資訊:

未收到及時回應的 Azure Cache for Redis 用戶端作業可能會導致高延遲或逾時例外狀況。 本文說明如何針對可能導致高延遲和逾時的常見問題進行疑難解答。

作業可能會在各種階段遇到問題或逾時。 問題的來源有助於判斷原因和風險降低。 本文分為客戶端和伺服器端問題。

客戶端問題

伺服器端問題

用戶端疑難排解

下列客戶端問題可能會影響延遲和效能,並導致逾時。

高用戶端連線

超過快取最大上限的客戶端連線請求可能會導致失敗。 處理重複性的重新連線嘗試時,高用戶端連線也可能造成高伺服器負載。

用戶端連線數偏高時,可能表示用戶端程式碼中發生連線洩漏。 連線可能未正確地重複使用或關閉。 檢閱用於連線的用戶端程式碼。

如果偏高的連線數全都屬於合理且必要的用戶端連線,則可能需要將快取升級至具有較高連接限制的大小。 檢查 連線用戶端的 [最大匯總 ] 計量是否接近或高於快取大小允許的連線數目上限。 如需調整每個用戶端連線大小的詳細資訊,請參閱 Azure Cache for Redis 效能

用戶端主機上的高 CPU

高用戶端CPU使用量表示系統無法跟上指派的工作。 即使快取快速傳送回應,用戶端可能無法快速處理回應。 最好讓用戶端CPU保持在小於80%。

若要減輕用戶端的高 CPU 使用量:

  • 調查 CPU 尖峰的原因。
  • 將客戶端升級至具有更多 CPU 容量的較大虛擬機 (VM) 大小。

使用 Azure 入口網站中可用的計量,或透過 VM 上的性能計數器,監視客戶端的系統 CPU 使用量。 檢查計量 錯誤(類型:無回應Clients), 以判斷您的用戶端主機是否可以及時處理來自 Redis 伺服器的回應。

請小心不要監視進程 CPU,因為單一進程可能會有低 CPU 使用量,但全系統的 CPU 可能很高。 請監看與逾時對應的 CPU 使用量暴增。 高 CPU 也可能造成 in: XXX 錯誤訊息中的高 timeoutException 值。 如需範例,請參閱 流量高載和線程集 區組態一節。

StackExchange.Redis 1.1.603 和更新版本在 local-cpu 錯誤訊息中包含 timeoutException 度量。 請務必使用最新版的 StackExchange.Redis NuGet 套件,因為 Bug 會定期修正,讓程式代碼對逾時更具抵抗性。 如需詳細資訊,請參閱 調查 timeout StackExchange.Redis 中的例外狀況

大型鍵值

您可以使用 redis-cli --bigkeys 命令來檢查快取中的大型索引鍵。 如需 redis-cli、Redis 命令行介面的詳細資訊,請參閱 Redis CLI

要解決此問題:

  • 增加 VM 的大小,以取得更高的頻寬功能。 提高用戶端或伺服器 VM 上的頻寬可降低較大回應的資料傳輸時間。 將這兩部 VM 上的目前網路使用量與目前 VM 大小的限制進行比較。 只有伺服器或用戶端上的更多頻寬可能不夠。

  • 增加應用程式使用的連線物件數目。 使用循環配置資源方法透過不同的連線物件提出要求。 如需使用多個索引鍵和較小值的相關資訊,請參閱考慮使用更多索引鍵和較小的值

Redis 用戶端上的記憶體壓力

用戶端的記憶體壓力可能會導致效能問題延遲處理快取回應。 發生記憶體壓力時,系統可能會將數據分頁至磁碟。 此「分頁錯誤」 會使系統明顯變慢。

若要偵測用戶端上的記憶體壓力:

  • 監視 VM 上的記憶體使用量,以確保它不會超過可用的記憶體。
  • 監視用戶端的 Page Faults/Sec 效能計數器。 在正常作業期間,大部分的系統都有一些分頁錯誤。 與要求逾時對應的分頁錯誤尖峰,可能表示記憶體壓力。

若要減輕用戶端上的高記憶體壓力:

  • 調查記憶體使用量模式,以減少用戶端上的記憶體耗用量。
  • 將用戶端 VM 升級至具有更多記憶體的較大大小。

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

視其架構而定,用戶端計算機可能會有網路頻寬可用性的限制。 如果用戶端因超載網路容量而超過可用頻寬,則無法在用戶端上快速處理數據,因為伺服器正在快速傳送數據。 這種情況可能會導致逾時。

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

Redis 會話狀態提供程式 retryTimeout

如果您使用 RedisSessionStateProvider,請確定您已正確設定 retryTimeoutretryTimeoutInMilliseconds 值應高於 operationTimeoutInMilliseconds 值。 否則,不會發生重試。

在下列範例中, retryTimeoutInMilliseconds 會設定為 3000

<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"
>

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

在 Linux 上裝載的用戶端應用程式可能會因為 Linux 中的樂觀性 TCP 設定而遇到連線問題。 如需詳細資訊,請參閱 Linux 裝載用戶端應用程式的 TCP 設定

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

流量暴增加上不當的 ThreadPool 設定,可能會導致延遲處理 Redis 伺服器已傳送但用戶端上尚未使用的資料。 檢查 錯誤(類型:無回應客戶端) 指標,以驗證您的用戶端主機是否能應對流量的突然高峰。 您可以 設定執行緒池配置,以確保執行緒池能在突發情況下快速擴展。

您可以使用 StackExchange.Redis 中的 timeoutException訊息,來進行進一步調查。

    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,不會在伺服器傳送數據時儘快從網路讀取數據。

StackExchange.Redis 1.1.603 和更新版本在 local-cpu 錯誤訊息中包含 timeoutException 度量。 請務必使用最新版的 StackExchange.Redis NuGet 套件,因為 Bug 會定期修正,讓程式代碼對逾時更具抵抗性。 如需詳細資訊,請參閱 調查 StackExchange.Redis 中的逾時例外狀況

伺服器端疑難排解

下列伺服器端問題可能會影響效能,並導致逾時。

高記憶體用量

伺服器上的記憶體壓力可能會導致延遲要求處理的各種效能問題。 發生記憶體壓力時,系統會將數據分頁到磁碟,這會導致系統大幅降低速度。

記憶體壓力的一些可能原因是快取被數據填滿到接近其最大容量,或 Redis 伺服器的記憶體碎片化程度高。

碎片化可能會發生在負載模式下的數據儲存具有高度大小變異時,例如當數據分散在 1 KB 和 1 MB 的大小之間時。 從現有的記憶體中刪除 1 KB 金鑰時,1 MB 的密鑰無法放入空間中,導致片段化。 同樣地,如果刪除 1 MB 金鑰,新增的 1.5 MB 金鑰無法放入現有的回收記憶體中。 這個未使用的可用記憶體會導致片段化。

如果快取已是碎片,並在高記憶體壓力下執行,則系統會執行容錯移轉以嘗試復原 Resident Set Size (RSS) 記憶體。 Redis 會透過 used_memory 命令公開兩個統計數據used_memory_rss,以協助您識別此問題。 您也可以 在 Azure 入口網站中檢視這些計量

如果used_memory_rss值高於計量的 1.5 倍used_memory,則記憶體會出現片段。 下列情況時,片段可能導致問題:

  • 記憶體使用量接近快取的最大記憶體限制。
  • 指標 used_memory_rss 高於記憶體最大限制,可能會導致記憶體頁錯誤。

您可以採取數個動作來協助保持記憶體使用量狀況良好。

如需記憶體管理的詳細資訊,請參閱 記憶體管理的最佳做法

伺服器負載偏高

高伺服器負載表示 Redis 伺服器忙碌中,無法跟上要求,導致逾時或回應緩慢。 若要降低高伺服器負載,請先調查原因,例如由於記憶體壓力過高而 長時間執行的命令

您可以從 Azure 入口網站監視伺服器負載等 計量 。 若要檢查 [伺服器載入計量],請從快取頁面上的左側導覽功能表選取 [監視] 底下的 [深入解析],然後檢視 [伺服器載入] 圖形。 或選取左側導覽功能表中 [監視] 底下的 [計量],然後選取 [計量] 下的 [伺服器負載]。

請留意伺服器負載使用量中的尖峰,這些尖峰可能對應於逾時情況。 在伺服器負載計量上建立警示,以便儘早收到潛在影響通知。

伺服器負載中的尖峰

在 C0 和 C1 快取上,您可能會看到伺服器負載出現短暫的尖峰,這不是因為要求增加,而是因為 VM 上正在執行內部 Defender 掃描。 當在這些層級上發生內部 Defender 掃描時,要求延遲會更高。

C0 和 C1 層級上的快取只有單一核心可進行多工處理,並將內部 Defender 掃描和 Redis 要求的工作分割處理。 如果內部 Defender 掃描的額外延遲對 C1 緩存上的生產工作負載造成負面影響,您可以升級至進階層級的方案,例如具有多個 CPU 核心的 C2。 如需詳細資訊,請參閱選擇正確的階層

如需用戶端連線數目快速變更的詳細資訊,請參閱 避免用戶端連線尖峰

調整大小

您可以擴增為更多分區,以將負載分散到多個 Redis 程序,或擴大為使用更多 CPU 核心的較大快取大小。 調整作業需要大量 CPU 和記憶體,因為它們可能牽涉到在節點周圍移動數據,以及變更叢集拓撲。 如需詳細資訊,請參閱 Azure Cache for Redis 規劃常見問題調整

長時間執行的命令

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

檢閱您向 Redis 伺服器發出的命令,以瞭解其效能影響。 例如,我們經常在不知道其是大 O 表示法 (O(N)) 運算的情況下使用 KEYS 命令。 若要減少 CPU 尖峰,您可以使用 KEYS 來避免

您可以在控制台中執行下列 Redis 命令,以調查長時間執行且昂貴的命令。

  • 用戶端清單

    此命令 CLIENT LIST 會以大部分人類可讀的格式傳回用戶端連接伺服器的相關信息和統計數據。

  • INFO

    此命令 INFO 會傳回伺服器的相關信息和統計數據,其格式很簡單,計算機可剖析並方便人類閱讀。 區 CPU 段對於調查 CPU 使用量很有用。 server_load100 (最大值) 表示 Redis 伺服器一直忙著處理要求,而沒有閒置的時間。

    下列範例顯示命令的 INFO 輸出:

    # 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
    
  • 顯示器

    MONITOR 是偵錯命令,可串流處理 Redis 伺服器處理的每個命令。 MONITOR 可協助您了解資料庫的狀況。 此命令要求高,而且可能會對效能造成負面影響並降低。

  • SLOWLOG

    Redis 慢速記錄是用來記錄查詢超過指定執行時間的系統。 運行時間不包含 I/O 作業,例如與用戶端交談或傳送回復,但只包含實際執行命令所需的時間。

    SLOWLOG命令會讀取並重設 Redis 慢速查詢記錄檔,也可用來調查用戶端上長時間執行的命令。 您可以使用 SLOWLOG GET 來監視和記錄針對 Redis 伺服器執行的昂貴命令。

網路頻寬限制

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

您可以在 Azure 入口網站中監控像是快取讀取和快取寫入等指標,以查看伺服器端已使用多少頻寬。 針對這些計量建立警示,以便儘早收到潛在影響通知。

若要在網路頻寬使用量接近最大容量時,緩解此情況:

伺服器維護

計劃性或非計劃性維護可能會導致用戶端連線中斷。 例外狀況的數目和類型取決於程式碼路徑中要求的位置,以及快取關閉其連線的時間。

如果您的 Azure Redis 快取發生故障轉移事件,則所有來自故障節點的用戶端連線都會轉移至仍然運作的節點。 伺服器負載可能會因為連線增加而突然增加。 您可以嘗試重新啟動用戶端應用程式,讓所有用戶端連線在兩個節點間重新建立和重新分配。

傳送要求但未在發生故障轉移時收到回應的作業可能會發生 timeout 例外狀況。 已關閉連線物件上的新要求會收到連線例外狀況,直到成功重新連線為止。

若要檢查在發生 timeout 例外狀況期間,您的 Azure Redis 快取是否發生故障轉移,請檢查 Errors 度量值。 在快取的 Azure 入口網站頁面上,選取左側導覽功能表中 [監視] 底下的 [計量]。 然後,建立測量 Errors 計量的新圖表,並依 ErrorType 分割。 建立此圖表之後,您會看到容錯移轉的計數。 如需容錯移轉的詳細資訊,請參閱容錯移轉和修補 Azure Cache for Redis

如需因伺服器維護而減輕問題的詳細資訊,請參閱下列文章: