為什麼我在 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 時間的長期執行的命令:具有高時間複雜度的命令 (例如 keyshkeys hgetall 等) 會耗用較高 CPU 時間。如需每個命令的時間複雜度和效能建議,請參閱 redis.io 網站上的命令Lua 指令碼 (由 EVALEVALSHA Redis 命令執行) 是 Redis 中的原子操作。在 Lua 指令碼的整個執行時間期間,所有伺服器活動都會遭封鎖,導致高 EngineCPUUtilization。 使用 Redis 慢速日誌檢查是否存在長期執行的命令或長期執行的 Lua 指令碼。
  • 大量請求:檢查命令統計資料以確定是否存在命令爆量,或延遲是否增加。您可以使用 CloudWatch 指標 (例如 GetTypeCmdsHashBasedCmds) 來檢查命令統計資料。或者,使用 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 的常見原因:


此文章是否有幫助?


Precisa de ajuda com faturamento ou suporte técnico?