本頁面說明 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 因大小限制而移除的金鑰數量。因存留時間到期而移除的項目不包含在這個指標中。如果撤銷數量偏高,擴大執行個體可能會提高快取命中率。
如果未啟用逐出功能,且快取已滿,則可能無法在 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%,表示執行個體重新啟動很可能是因為記憶體不足。
增加預留記憶體
增加保留記憶體會為記憶體負擔建立更多空間,做法是減少執行個體的快取記憶體上限。如果系統記憶體使用率指標超過 90%,您就應該增加保留記憶體。
如需調整預留記憶體設定的操作說明,請參閱「設定 Memcached 執行個體」
增加保留記憶體會減少可用於儲存項目的記憶體,導致項目更快遭到逐出,進而降低執行個體的快取命中率。如果停用逐出功能,系統就不會逐出項目。
調度執行個體資源
請按照「擴充 Memcached 執行個體」一文中的操作說明,增加節點數量。如果應用程式已設定為將鍵分散到各個節點,這樣一來,應用程式可用的整體項目儲存空間就會增加,每個節點儲存的鍵數量也會減少。
為易變性金鑰設定存留時間
設定應用程式,在 Memcached 中為儲存的金鑰設定存留時間。根據預設,Memcached 會定期檢查過期的金鑰並移除,藉此釋放伺服器空間,並防止進一步分配快取記憶體。
手動刪除執行個體上的金鑰
面臨記憶體壓力時,您應考慮刪除鍵。不過,由於開放原始碼 Memcached 不會釋出先前分配的記憶體,刪除鍵只會降低進入 OOM 狀態的機率。這是因為新寫入作業會使用空白記憶體。記憶體負擔不斷增加仍可能導致 OOM 狀態,因為先前分配的記憶體專用於儲存項目,無法供負擔使用。