為什麼我在 ElastiCache 叢集中看到記憶體用量很高或不斷增加?

1 分的閱讀內容
0

我在 Amazon ElastiCache 叢集中看到記憶體用量很高或不斷增加。如何確定 ElastiCache 叢集節點上的記憶體用量?

解決方案

若要確定叢集及其節點上的整體記憶體用量,請檢閱這些 Redis 指標。這些指標會針對叢集中的每個節點發佈在 Amazon CloudWatch 中:

  • **BytesUsedForCache:**Redis 為資料集、緩衝區等配置的位元組總數。此指標衍生自 Redis 節點的 INFO 命令輸出。使用此指標來確定叢集的記憶體使用率。
  • **FreeableMemory:**此主機層級指標顯示主機上提供的可用記憶體數量。記憶體用量由於快取資料或額外負荷而增加時,您可以看到 FreeableMemory 減少。FreeableMemory 減少表示主機上的可用記憶體不足。如果 FreeableMemory 太低,可能會發生交換。
  • **DataBaseMemoryUsagePercentage:**此指標衍生自 Redis INFO 命令輸出。這是叢集節點使用的記憶體百分比。在此指標達到閾值 100% 之後,Redis 會啟動 Redis 最大記憶體移出政策

請記住,依預設,ElastiCache for Redis 會預留 25% 的 max-memory 供非資料使用,例如容錯移轉和備份。如果您沒有為非資料使用指定足夠的預留記憶體,交換的可能性會增加。如需詳細資訊,請參閱管理預留記憶體

記憶體用量突然很高的原因

  • **最近新增的金鑰:**新增金鑰值對會導致記憶體用量增加。在現有金鑰上新增元素也會增加記憶體用量。檢查 SetTypeCmds 指標,以確定節點上是否存取最近的資料變更。此指標會記錄寫入類型命令的總數,且衍生自 Redis commandstats 統計資料。
  • **緩衝區用量增加:**用戶端透過網路連線至 Redis。如果用戶端從快取讀取的速度不夠快,Redis 會將回應資料保留在稱為用戶端輸出緩衝區的記憶體空間中。用戶端可以繼續從緩衝區空間讀取。如果訂閱的用戶端讀取速度不夠快,則 Pub 和 Sub 用戶端亦如此。
    如果網路頻寬出現瓶頸,或叢集持續處於高負載情況下,則緩衝區用量可能會繼續累積。此累積會導致記憶體耗盡和效能降低。依預設,ElastiCache for Redis 不會限制輸出緩衝區的增長,且每個用戶端都有自己的緩衝區。使用 client-list 命令檢查緩衝區用量。
  • **大量新連線:**大量新連線可能會提高記憶體用量。所有新連線都會建立一個耗用記憶體的檔案描述項。大量新連線的彙總記憶體耗用量可能很高,導致資料移出或 OOM 錯誤。檢查 NewConnections 指標,了解接受的新連線總數。
  • 高交換用量:有可用記憶體時,快取節點上會看到部分交換用量是正常的。但是,交換用量過多可能會導致效能問題。高交換通常在記憶體壓力下執行的節點中開始發生,從而導致可用記憶體不足。使用 SwapUsage 指標來監控主機上的交換。
  • **高記憶體分段:**記憶體分段過高表示作業系統內的記憶體管理效率低下。Redis 可能無法在移除金鑰時釋放記憶體。使用 MemoryFragmentationRatio 指標來監控分段率。如果您遇到分段問題,請開啟 activedefrag 參數 CAN 以進行作用中記憶體重組。
  • **大金鑰:**具有大型資料大小或大量元素的金鑰稱為大金鑰。即使 CurrItems 指標保持低位,您也可能會看到由於大金鑰導致的高記憶體用量。若要偵測資料集中的大金鑰,請使用 redis-cli --bigkeys 命令。

控制高記憶體用量的最佳實務

  • **對金鑰使用 TTL:**您可以針對過期為金鑰指定 TTL。這樣做會在過期後移除金鑰,而無需等待記憶體壓力。這可防止不必要的金鑰干擾 Redis。少量移出並不是問題,但是大量移出意味著您的節點在記憶體壓力下執行。
  • **使用移出政策:**快取記憶體開始填滿時,Redis 會根據 maxmemory-policy 移出金鑰以釋放空間。預設 maxmemory-policy 政策設定為 volatile_lru。最佳實務是選擇特定於工作負載需求的移出政策。
  • **配置預留記憶體:**若要避免容錯移轉或備份期間發生問題,最佳實務是將非資料用量的 reserved_memory_percentage 設定為至少 25%。如果沒有足夠的預留記憶體來執行容錯移轉或備份,則會發生交換和效能問題。
  • **使用連線集區:**連線集區有助於控制 Redis 用戶端嘗試的大量新連線。檢閱用於處理大量新連線的 AWS 最佳實務指導方針
  • **調整輸出緩衝區大小限制:**您可以調整輸出緩衝區限制以控制緩衝區空間用量。ElastiCache for Redis 參數群組提供數個以 client-output-buffer-limit-* 開頭的參數,以避免用戶端輸出緩衝區用量無限增長。請注意,這些參數沒有建議的限制,因為每個工作負載都是唯一的。最佳實務是對工作負載進行基準測試,以便選擇適當的值。
  • **考慮使用雜湊映射:**在 Redis 中,Redis 資料庫的總記憶體用量是線性的。與具有較少字段的單一雜湊映射金鑰相比,更少個別金鑰需要更多記憶體。雜湊映射有助於具有大量金鑰的資料結構。除了雜湊映射之外,您還可以利用 ziplist 編碼,與雜湊表相比,此編碼可減少記憶體用量。請注意,使用雜湊映射可能會導致 Redis 引擎用量激增,因為這是一個複雜的命令,需要比集操作更多的 CPU。
  • **擴展叢集:**有時,在採取必要預防措施後,您可能會遇到記憶體壓力。如果發生這種情況,而且用量是由於預期的工作負載所致,請考慮執行適當的擴展以緩解記憶體瓶頸。
  • 設定記憶體用量的警示。 記憶體用量超過預設閾值時,您可以使用 CloudWatch 警示啟動警示。使用 BytesUsedForCacheDatabaseMemoryUsagePercentage 指標,從 CloudWatch 主控台建立警示,以進行監控和擴展。

相關資訊

Redis 的指標

Redis 4.0.10 參數變更

如何解決 ElastiCache for Redis 叢集節點的錯誤訊息 "OOM command not allowed" (不允許 OOM 命令)?

金鑰移出

Redis 的記憶體最佳化

AWS 官方
AWS 官方已更新 2 年前