為什麼我在 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 警示啟動警示。使用 BytesUsedForCache 或 DatabaseMemoryUsagePercentage 指標,從 CloudWatch 主控台建立警示,以進行監控和擴展。
相關資訊
如何解決 ElastiCache for Redis 叢集節點的錯誤訊息 "OOM command not allowed" (不允許 OOM 命令)?
AWS 官方已更新 2 年前
沒有評論
相關內容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 4 年前