本頁說明 Memcached 執行個體的「保留記憶體」設定,以及何時需要增加保留記憶體。本頁面也會說明其他最佳做法,協助您有效管理 Memcached 執行個體的記憶體。
Memorystore 會在執行個體中新增額外記憶體 (您看不到),以因應 Memcached 程序造成的負擔。不過,視特定工作負載而定,記憶體負荷可能會大於我們為此佈建的額外記憶體。
如果記憶體用量超過 Memorystore 系統記憶體總量,記憶體不足 (OOM) 情況可能會導致資料快取完全清除,進而中斷應用程式和業務。
以下各節概述設定 Memorystore for Memcached 執行個體時應遵循的一般原則。這些章節也會說明可用於監控記憶體的指標和快訊,以及可採取的動作。
記憶體管理概念
執行個體容量
執行個體容量是指您佈建的記憶體量 (以 GiB 為單位),也是計費依據。快取記憶體與執行個體容量不同,因為快取記憶體並非固定。不過,建立 Memcached 執行個體時,執行個體容量預設會等於快取記憶體。
舉例來說,如果您選擇 5 GiB 的執行個體容量,執行個體預設會有 5 GiB 的空間可儲存項目。
快取記憶體限制
快取記憶體是 Memcached 執行個體可做為快取的記憶體總大小。根據預設,快取記憶體等於執行個體容量。不過,調整預留記憶體可能會減少快取記憶體。詳情請參閱「保留記憶體」。快取記憶體用盡後,Memcached 會開始撤銷快取中儲存的項目,以便騰出空間來執行新的寫入作業。
請注意,查看快取記憶體指標時,系統只會回報 Memcached 節點中項目占用的空間,這表示 Memcached 可能會低估快取記憶體總用量。 快取可能會在 Slab 內分配額外記憶體,導致記憶體片段化。
記憶體負荷
記憶體負擔是指 Memcached 程序使用的記憶體。不包括儲存在記憶體中用於快取的項目。
記憶體負擔會根據有效連線數、項目總數和項目大小而有所不同。此外,記憶體負擔在理論上沒有上限,因此有可能無限成長。
為因應記憶體用量,Memorystore 會為執行個體增加額外記憶體。不過,我們新增的額外記憶體容量不會顯示給您。 對大多數工作負載而言,記憶體負荷不應造成問題。
如果沒有任何設定,空白的 Memorystore for Memcached 節點記憶體看起來會如下圖所示。

應用程式將項目新增至快取時,Memcached 會累積連線緩衝區和內部雜湊表等程序的額外負荷:

由於額外負荷的成長不受限制,因此部分工作負載的額外負荷會超出預留限制,如下所示:

當額外負荷和項目填滿所有可用空間時,Memcached 會耗盡記憶體,而作業系統必須終止程序,導致快取完全清除:

您可能會發現,記憶體負擔超出 Memorystore 預設為負擔分配的額外空間 (如高「系統記憶體使用率」所示)。在這種情況下,請增加保留記憶體參數,為工作負載建立額外負荷。
預留記憶體
預留記憶體是 Memorystore 設定,可增加記憶體額外負荷可用的空間量。
如要增加記憶體可用的記憶體負擔,請增加保留記憶體,這會減少可用的快取記憶體。如果執行個體因記憶體負荷過高而出現記憶體壓力,請新增這類額外空間。
2021 年 10 月 25 日後建立的執行個體,預設保留記憶體百分比為 10%。您可以手動更新執行個體的設定,覆寫這個值。減少執行個體的預留記憶體,可能會大幅增加 OOM 狀況的機率。
下圖顯示的執行個體已增加保留記憶體,為記憶體負擔建立額外空間:

Memcached 快取達到這個縮減上限後,就會開始逐出項目。

開始使用執行個體後,您可能需要根據「系統記憶體使用率」指標,增加執行個體的保留記憶體,以支援尖峰工作負載。
詳情請參閱「管理系統記憶體用量」。
系統記憶體使用率
系統記憶體等於您佈建的執行個體容量,加上 Memorystore 為記憶體額外負荷新增的額外空間。
系統記憶體使用率指標會顯示所有已用記憶體 (儲存的項目加上記憶體負擔) 在系統記憶體中所占的百分比。這項指標非常重要,因為它會顯示執行個體可用系統記憶體的使用情況。當「系統記憶體使用率」指標接近 100% 時,執行個體就越有可能發生 OOM 狀況。為確保執行個體有足夠的記憶體來支援工作負載,請務必確保系統記憶體充足。
如果工作負載嘗試填滿整個快取,並依賴 Memcached 逐出作業來管理儲存的項目,您應該會看到較高的系統記憶體使用率,而且可能需要預先增加保留記憶體,確保有足夠的空間來處理額外負擔。
系統記憶體用量警示
建議您設定快訊,讓系統在「系統記憶體用量」指標超過 90% 時通知您。如果系統記憶體使用率偏高,請密切監控系統記憶體使用率指標,如果該指標大幅增加,請考慮採取步驟管理系統記憶體用量。當系統記憶體用量達到高水位時,請務必採取行動,因為這樣您就有時間減輕影響,而不必處理 OOM 狀況導致的快取清除作業。
驅逐政策
Memcached 會使用最佳化 LRU 演算法,在快取記憶體填滿後逐出項目。如需停用快取逐出的操作說明,請參閱「設定 Memcached 執行個體」。
「監控清除作業」會顯示 Memcached 因大小限制而移除的鍵數量。這個指標不包含因 TTL 到期而移除的項目。如果看到大量撤銷,擴大執行個體可能會提高快取命中率。
如果未啟用逐出功能,且快取已滿,則在 Memcached 伺服器中設定項目可能會失敗。
快取命中率
您應定期監控快取命中率指標,瞭解 Memcached 執行個體中的鍵成功傳回主要查閱內容的百分比。一般來說,快取命中率越高越好,因為這表示快取傳回的快取要求越多。
進行任何大型設定變更 (例如調整保留記憶體、調整金鑰存留時間或擴充執行個體) 之前,請先記下快取命中率。然後在修改執行個體後,再次檢查快取命中率,瞭解變更對這項指標的影響。
監控您執行個體的記憶體用量
下列指標可協助您瞭解執行個體的記憶體用量。如要瞭解如何查看指標及設定快訊,請參閱「監控 Memcached 執行個體」一文。
記憶體管理相關指標
| 指標 | 完整指標地址 |
|---|---|
| 快取記憶體 | memcache.googleapis.com/node/cache_memory |
| 系統記憶體使用率 | memcache.googleapis.com/node/memory/utilization |
| 快取命中率 | memcache.googleapis.com/node/hit_ratio |
| 驅逐 | memcache.googleapis.com/node/eviction_count |
管理系統記憶體用量
如果執行個體發生記憶體壓力或 OOM 錯誤,請按照下列步驟解決問題:
- 驗證 OOM 條件。
- 增加執行個體的保留記憶體。
- 調度執行個體資源。
- 為易變性金鑰設定存留時間。
- 手動刪除執行個體上的金鑰。
- 如果仍遇到 OOM 狀況,請與 Google Cloud Platform 支援團隊聯絡。
驗證 OOM 條件
當執行個體達到 OOM 條件時,第一個訊號是執行個體重新啟動。如要查看重新啟動是否是由 OOM 狀況所致,請查看「正常運作時間」和「系統記憶體用量」指標。
如果正常運作時間降至零之前,系統記憶體使用率超過 90%,表示執行個體重新啟動很可能是因為 OOM 狀況。
增加預留記憶體
增加保留記憶體可為記憶體負擔建立更多空間。方法是降低執行個體的快取記憶體限制。如果「系統記憶體使用率」指標超過 90%,請增加保留記憶體。
如需調整保留記憶體設定的操作說明,請參閱「設定 Memcached 執行個體」
增加保留記憶體會減少可用於儲存項目的記憶體,導致項目更快遭到逐出。這可能會降低執行個體的快取命中率。如果停用逐出功能,系統就不會逐出項目。
調度執行個體資源
請按照「調整 Memcached 執行個體規模」一文中的操作說明,增加節點數量。如果應用程式設定為將鍵分散到各個節點,應用程式可用的總項目儲存空間就會增加,每個節點儲存的鍵數也會減少。
為易變性金鑰設定存留時間
請將應用程式設為在 Memcached 中為儲存的金鑰設定存留時間。根據預設,Memcached 會定期檢查過期的金鑰並移除,藉此釋出伺服器空間,並防止進一步分配快取記憶體。
手動刪除執行個體上的金鑰
如果記憶體壓力過大,建議您刪除索引鍵。不過,由於開放原始碼 Memcached 不會釋放先前分配的記憶體,因此刪除鍵只會降低進入 OOM 狀態的機率。因為新寫入作業會使用空白記憶體,因此可降低發生這種情況的機率。記憶體負擔增加仍可能導致記憶體不足,因為先前分配的記憶體專用於儲存項目,無法供負擔使用。