記憶體管理最佳做法

本頁面說明 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 錯誤,請按照下列步驟解決問題:

  1. 驗證 OOM 條件
  2. 提高執行個體的保留記憶體
  3. 調度執行個體資源
  4. 為易變性金鑰設定存留時間
  5. 手動刪除執行個體上的金鑰
  6. 如果仍遇到 OOM 狀況,請與 Google Cloud Platform 支援團隊聯絡

驗證 OOM 條件

當執行個體達到 OOM 條件時,第一個訊號是執行個體重新啟動。如要查看重新啟動是否是由 OOM 狀況所致,請查看「正常運作時間」和「系統記憶體用量」指標

如果系統記憶體使用率在正常運作時間降至零之前超過 90%,表示執行個體重新啟動很可能是因為記憶體不足。

增加預留記憶體

增加保留記憶體會為記憶體負擔建立更多空間,做法是減少執行個體的快取記憶體上限。如果系統記憶體使用率指標超過 90%,您就應該增加保留記憶體。

如需調整預留記憶體設定的操作說明,請參閱「設定 Memcached 執行個體

增加保留記憶體會減少可用於儲存項目的記憶體,導致項目更快遭到逐出,進而降低執行個體的快取命中率。如果停用逐出功能,系統就不會逐出項目。

調度執行個體資源

請按照「擴充 Memcached 執行個體」一文中的操作說明,增加節點數量。如果應用程式已設定為將鍵分散到各個節點,這樣一來,應用程式可用的整體項目儲存空間就會增加,每個節點儲存的鍵數量也會減少。

為易變性金鑰設定存留時間

設定應用程式,在 Memcached 中為儲存的金鑰設定存留時間。根據預設,Memcached 會定期檢查過期的金鑰並移除,藉此釋放伺服器空間,並防止進一步分配快取記憶體。

手動刪除執行個體上的金鑰

面臨記憶體壓力時,您應考慮刪除鍵。不過,由於開放原始碼 Memcached 不會釋出先前分配的記憶體,刪除鍵只會降低進入 OOM 狀態的機率。這是因為新寫入作業會使用空白記憶體。記憶體負擔不斷增加仍可能導致 OOM 狀態,因為先前分配的記憶體專用於儲存項目,無法供負擔使用。