為什麼我在 ElastiCache for Redis 叢集中看到 CPU 用量很高或不斷增加?
上次更新日期:2022 年 7 月 26 日
我在 Amazon ElastiCache for Redis 叢集中看到 CPU 用量很高或不斷增加。我該如何對此錯誤進行疑難排解?
簡短描述
ElastiCache for Redis 有以下兩個 Amazon CloudWatch CPU 指標:
- EngineCPUUtilization:此指標報告 Redis 引擎執行緒的 CPU 使用率。由於 Redis 是單一執行緒,因此最佳實務是監控具有四個或更多 vCPU 的節點的 EngineCPUUtilization 指標。
- CPUUtilization:此指標顯示整個主機的 CPU 使用率百分比。對於具有兩個 vCPU 以下的較小節點,請使用 CPUUtilization 指標來監控叢集工作負載。
解決方案
高 EngineCPUUtlilization
以下是高 EngineCPUUtilization 的常見原因:
- 耗用高 CPU 時間的長期執行的命令:具有高時間複雜度的命令 (例如 keys、hkeys、 hgetall 等) 會耗用較高 CPU 時間。如需每個命令的時間複雜度和效能建議,請參閱 redis.io 網站上的命令。Lua 指令碼 (由 EVAL 或 EVALSHA Redis 命令執行) 是 Redis 中的原子操作。在 Lua 指令碼的整個執行時間期間,所有伺服器活動都會遭封鎖,導致高 EngineCPUUtilization。 使用 Redis 慢速日誌檢查是否存在長期執行的命令或長期執行的 Lua 指令碼。
- 大量請求:檢查命令統計資料以確定是否存在命令爆量,或延遲是否增加。您可以使用 CloudWatch 指標 (例如 GetTypeCmds 或 HashBasedCmds) 來檢查命令統計資料。或者,使用 Redis 命令 info commandstats 來檢查。如果由於應用程式的預期工作負載而看到大量請求,請考慮擴展叢集。
- 備份和複寫:檢查 SaveInProgress 指標,查看是否正在備份或複寫。當背景儲存 (分叉或無分叉) 正在進行時,此二進位指標會傳回 "1"。如果背景儲存不在進行中,指標會傳回 "0"。確保您有足夠的記憶體來建立 Redis 快照。
- 大量新連線:建立 TCP 連線是一項運算成本極高的操作,特別是對於啟用 TLS 的叢集而言。在短時間內有大量的新用戶端連線請求可能會導致 EngineCPUUtilization 增加。 自 Redis 6.2 起,已針對具有四個 vCPU 或更多 vCPU 的 Graviton2 節點類型使用具有八個 vCPU 或更多 vCPU 的 x86 節點類型的已啟用 TLS 叢集實作效能提升。如需有關處理大量連線的建議,請參閱最佳實務:Redis 用戶端和 Amazon ElastiCache for Redis。
- 大量移出:Redis 會根據 maxmemory-policy 參數移出金鑰。當快取沒有足夠的記憶體來保存新資料時,就會發生移出。如果移出量很高,則 EngineCPUUtilization 會增加,因為 Redis 忙於移出金鑰。您可以使用 CloudWatch 指標 Evictions 來監控移出量。如果移出量很高,則使用較大的節點類型來縱向擴展叢集,或新增更多節點來橫向擴展。
- 大量回收:若要釋放記憶體,Redis 會先取樣,然後刪除任何已到逾時過期時間的金鑰。此程序稱為「回收」。 如果存在大量過期時間,則 EngineCPUUtilization 會增加,因為 Redis 正忙於回收金鑰。您可以使用 CloudWatch 指標 Reclaimed (回收) 來監控金鑰過期事件的數量。 例如,最佳實務是不要透過執行 EXPIREAT Redis 命令同時使太多金鑰過期。
如需有關對高 EngineCPUUtilization 進行疑難排解的詳細資訊,請參閱對連線進行疑難排解 – CPU 用量。
高 CPUUtilization
以下是高 CPUUtilization 的常見原因:
- 高網路流量或連線:檢查 NewConnections、NetworkBytesIn、NetworkBytesOut、NetworkPacketsIn 和 NetworkPacketsOut CloudWatch 指標。
- 由其他執行緒處理的高 EngineCPUUtilization 和非同步 I/O:如需增強型 I/O 處理的詳細資訊,請參閱 Amazon EC2 M5 和 R5 執行個體的 Amazon ElastiCache 效能提升。
- 持續受管維護和服務更新:維護和服務更新需要運算容量。因此,在這些事件期間,您可能會發現 CPUUtilization 中的峰值。檢查維護時段,以查看峰值是否與時段一致。最佳實務是在用量最低時設定維護時段,以最大限度地減少影響。如需詳細資訊,請參閱Amazon ElastiCache 受管維護和服務更新說明頁面。
- 高分頁和備份等操作:節點上的記憶體不足可能會導致核心分頁記憶體用盡而交換。如果分頁過多,您可能會看到 CPUUtilization 增加。同樣地,如果在備份或擴展等操作期間節點上的負載很高,您可能會看到 CPUUtilization 增加。如需有關用於識別峰值原因的指標的建議,請參閱使用 Amazon CloudWatch 監控 Amazon ElastiCache for Redis 的最佳實務。