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

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

本節將討論如何針對連線至 Azure Cache for Redis 時發生的延遲和逾時問題進行疑難排解。

注意

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

用戶端疑難排解

以下是用戶端疑難排解。

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

流量暴增加上不當的 ThreadPool 設定,可能會導致延遲處理 Redis 伺服器已傳送但用戶端上尚未使用的資料。 檢查「錯誤」計量 (類型:UnresponsiveClients),確認您的用戶端主機是否可以因應突然增加的流量。

使用 ThreadPoolLogger 範例,監視 ThreadPool 統計資料如何隨著時間變更。 您可以使用 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) 從網路讀取資料的速度,比伺服器傳送資料給您的速度還慢。

您可以設定 ThreadPool,確保執行緒集區可在流量暴增的情況下擴大。

大型索引鍵值

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

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

  • 增加 VM 大小以取得更高的頻寬能力
    • 提高用戶端或伺服器 VM 上的頻寬可降低較大回應的資料傳輸時間。
    • 將兩部機器上的目前網路使用量與目前 VM 大小的限制進行比較。 只在伺服器或用戶端上提高頻寬可能不夠。
  • 增加應用程式使用的連線物件數目。
    • 使用循環配置資源方法透過不同的連線物件提出要求

用戶端主機上的高 CPU

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

使用 Azure 入口網站或機器上效能計數器中的可用計量,監視用戶端的整體系統 CPU 使用量。 請注意不要監視處理程序 CPU,因為有可能單一處理程序的 CPU 使用率很低,但整體系統 CPU 卻很高。 請監看與逾時對應的 CPU 使用量暴增。 高 CPU 也可能在 TimeoutException 錯誤訊息中造成高 in: XXX 值,如 [流量高載] 一節中所述。

注意

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

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

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

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

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

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

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

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

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

RedisSessionStateProvider 重試逾時

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

<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 快取的生產工作負載受到一些內部 Defender 掃描的額外延遲負面影響,您可以使用多個 CPU 核心來擴充至較高層級供應項目的費用 (例如 C2) 來降低影響效果。

伺服器負載中的尖峰

C0C1 快取上,您在 VM 上執行內部 Defender 時,可能會看到伺服器負載不會因要求增加而造成短暫的尖峰。 當在這些層級上執行內部 Defender 掃描時,要求延遲會更高。 C0C1 層級上的快取只有單一核心可進行多工處理,並將內部 Defender 掃描和 Redis 要求的工作分割處理。

高記憶體用量

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

長時間執行的命令

某些 Redis 命令的執行成本高於其他命令。 Redis 命令文件會顯示每個命令的時間複雜度。 Redis 命令處理是單一執行緒。 任何耗費長時間執行的命令都可能會阻礙之後的所有其他命令。

檢閱您向 Redis 伺服器發出的命令,以了解其效能影響。 例如,我們經常使用的 KEYS 命令就不知道其為 O(N) 作業。 您可以使用 SCAN 來避免 KEYS,以減少 CPU 尖峰。

您可以使用 SLOWLOG GET 命令來測量針對伺服器執行的高成本命令。

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

  • SLOWLOG 可用來讀取和重設 Redis 的緩慢查詢記錄。 其可用來調查用戶端上長時間執行的命令。 Redis 慢速記錄是用來記錄查詢超過指定執行時間的系統。 執行時間不包含 I/O 作業,例如與用戶端通訊、傳回覆等等,而只是實際執行命令所需的時間。 客戶可以使用 SLOWLOG 命令來測量/記錄針對其 Redis 伺服器執行的高成本命令。
  • 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 中的逾時例外狀況