我想要追蹤 Amazon ElastiCache for Valkey 或 Amazon ElastiCache for Redis OSS 叢集中的高延遲問題。
簡短描述
以下是 ElastiCache for Valkey 或 ElastiCache for Redis OSS 叢集中高延遲問題的常見原因:
- 命令變慢
- 由於記憶體使用量高,交換活動增加
- 網路問題
- 用戶端延遲問題
- Redis 同步處理
- Amazon ElastiCache 叢集事件
解決方法
命令變慢
由於 Valkey 和 Redis OSS 叢集是單執行緒,在目前的請求完成之前,ElastiCache 無法為用戶端提供服務。這種減速會導致請求總時間增加,並導致高延遲。
若要監控平均延遲,您可以使用 Valkey 和 Redis 的 Amazon CloudWatch 指標來監控特定命令。如需詳細資訊,請參閱 Valkey 和 Redis OSS 的指標。
若要擷取引擎處理時間超過 10 毫秒的命令清單,請使用 SLOWLOG GET 命令。您可以連線到受影響的節點,在 valkey-cli 中執行 slowlog get 128 命令。
此外,ElastiCache 會以微秒延遲計算常見的 Redis 操作。CloudWatch 會每分鐘對指標進行取樣,並將延遲指標顯示為多個命令的總計。單一命令可能會導致逾時等小問題,但不會導致指標圖表發生重大變化。
需要很長時間才能完成的慢速命令可能會導致 ElastiCache 節點上的 CPU 使用量增加。如果 EngineCPUUtilization 指標增加,則請參閱如何對 ElastiCache for Redis 自行設計叢集中 CPU 使用量增加的問題進行疑難排解?
以下是可能減慢 ElastiCache 叢集速度的複雜命令範例:
- 在具有大型資料集的生產環境中使用 KEYS 命令: KEYS 命令會掃描整個索引鍵空間並搜尋指定的模式。如需詳細資訊,請參閱 Valley 網站上的 KEYS。
- 需要長時間執行的 Lua 指令碼: 根據指令碼的複雜程度或資料集的大小,Lua 指令碼可能會長時間執行並導致延遲問題。
由於記憶體使用量高,交換活動增加
當叢集的記憶體壓力增加時,Redis 會交換記憶體頁面。由於記憶體頁面在交換區域之間傳輸,因此交換可能會增加延遲並導致逾時。CloudWatch 指標中的以下變化是交換活動增加的跡象:
- SwapUsage 增加
- FreeableMemory 偏低
- BytesUsedForCache 和 DatabaseMemoryUsagePercentage 指標過高
若要對交換活動增加的問題進行疑難排解,請查看以下文章:
網路問題
網路問題可能會導致叢集出現高延遲。根據您的網路問題,完成以下任務以對高延遲問題進行疑難排解。
用戶端與 ElastiCache 叢集之間的網路延遲
若要減少用戶端與 ElastiCache 叢集之間的延遲,您可以隔離用戶端和叢集節點之間的網路延遲。如需更多資訊,請參閱如何透過網際網路閘道對虛擬私有雲端 (VPC) 中的 EC2 Linux 或 Windows 執行個體與內部部署主機之間的網路效能問題進行疑難排解?
叢集達到網路限制
ElastiCache 節點與相關的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體有相同的網路限制。例如,ElastiCache cache.m6g.large 節點類型和 Amazon EC2 m6g.large 執行個體的網路限制是相同的。如需支援的 ElastiCache 節點類型和網路頻寬限制的詳細資訊,請參閱支援的節點類型。
若要對 ElastiCache 節點網路限制進行疑難排解,請參閱網路相關限制。
**注意:**最佳做法是監控您的 Amazon EC2 執行個體網路效能、頻寬能力、每秒封包 (PPS) 效能和追蹤的連線。
TCP/SSL 信號交換延遲
當用戶端連線到 Redis 叢集時,建立 TCP 連線可能需要幾毫秒。在此期間,延遲可能會對您的 Redis 作業和 ElastiCache 節點 CPU 造成額外的壓力。當您有許多新連線時,這種壓力可能會導致網路的高延遲。
若要控制連線數量並減少延遲,您可以使用連線集區將已建立的 TCP 連線快取到集區中。若要設定連線集區,請使用 Redis 用戶端程式庫。或者,您可以手動建立連線集區。
若要最佳化連線集區,您也可以使用彙總命令 (例如 MSET 或 MGET) 或 Redis 管線。如需詳細資訊,請參閱 Redis 網站上的 Redis 管線。
在 ElastiCache 節點上有大量連線
如果 ElastiCache 節點上有大量 TCP 連線,那麼您可能會耗盡 maxclients 限制。當達到此限制時,您會收到「ERR 已達到最大用戶端數量錯誤」,並且可能會遇到連線逾時。
若要減少高延遲,最佳做法是追蹤 CurrConnections 和 NewConnections CloudWatch 指標。您可以監控這些指標,以查看 ElastiCache 節點擁有的 TCP 連線數量。若要解決耗盡 maxclients 限制時出現的問題,請參閱大量連線一節,該節位於最佳做法: Redis 用戶端和 Amazon ElastiCache for Redis 中。
用戶端延遲問題
如果您為用戶端資源設定的逾時值過低,那麼您可能會收到逾時錯誤。若要判斷用戶端資源是否造成延遲問題,請檢查用戶端的記憶體、CPU 和網路使用率。如果這些資源接近其限制,請將用戶端逾時值設定為較大的值,以便資源能夠回應。
如果您的應用程式在 Amazon EC2 執行個體上執行,那麼您可以使用 CloudWatch 指標來進一步識別問題。或者,在 Amazon EC2 執行個體內使用監控工具,例如 atop 或 CloudWatch 代理程式。
若要判斷是否為用戶端導致高延遲,請檢查以下問題:
- 檢查逾時是否經常發生,或在一天中的特定時間發生。
- 檢查是否在特定用戶端或多個用戶端上發生逾時。
- 檢查是否在特定 Valkey 或 Redis 節點,或多個節點上發生逾時。
- 檢查是否在特定叢集或多個叢集發生逾時。
Redis 同步處理
Redis 同步處理會在備份、節點更換和擴展事件時啟動。此程序是運算密集型工作負載,可能會導致延遲。
若要檢查同步處理是否影響節點效能,您可以檢查 CloudWatch 中的 SaveInProgress 指標。
**注意:**為了將對使用者流量的影響降到最低,最佳做法是將同步處理事件安排在離峰時段進行。
ElastiCache 叢集事件
如果您的 ElastiCache 叢集發生叢集事件,那麼您可能會在事件期間遇到高延遲。您可以使用 ElastiCache 主控台來查看延遲期間的事件。檢查是否存在背景活動,例如來自 ElastiCache 受管維護和服務更新的節點更換或容錯移轉事件。
如果您認為是意外的硬體故障導致高延遲,請聯絡 AWS Support。
**注意:**您可以在 AWS Health 儀表板中查看排定的事件通知。
範例事件日誌:
Finished recovery for cache nodes 0001
Recovering cache nodes 0001
Failover from master node cluster_node to replica node cluster_node completed
相關資訊
使用 Amazon CloudWatch 監控 Amazon ElastiCache for Redis 的最佳做法
持續的連線問題
如何在 ElastiCache for Redis OSS 或 ElastiCache for Valkey 叢集中啟用日誌傳送?