記憶體管理最佳做法

本頁面說明 Memcached 執行個體的保留記憶體設定,以及何時需要增加保留記憶體。本頁也說明您需要瞭解的其他最佳做法,以便有效管理 Memcached 執行個體的記憶體。

Memorystore 會為您的執行個體新增額外記憶體 (您無法看到),以便因應 Memcached 程序產生的額外負擔。不過,視您的具體工作負載而定,記憶體額外負擔可能會超過我們為此目的提供的額外記憶體。

如果記憶體用量超過 Memorystore 系統記憶體總量,記憶體不足 (OOM) 的情況可能會導致資料的完整快取刷新,進而中斷應用程式和業務。

以下各節將概述設定 Memcached 專屬 Memorystore 時應遵循的一般原則。這些章節也將說明可用於監控記憶體的指標和快訊,並說明可採取的行動。

記憶體管理概念

執行個體容量

執行個體容量是您佈建的記憶體量 (以 GiB 為單位),也是我們向您收取費用的項目。快取記憶體與執行個體容量不同,因為快取記憶體並非固定值。不過,建立 Memcached 執行個體時,執行個體容量預設為等於快取記憶體。

舉例來說,如果您選擇 5 GiB 的執行個體容量,則執行個體預設會有 5 GiB 的空間可用來儲存項目。

快取記憶體限制

快取記憶體是 Memcached 例項可用於做為快取的記憶體總大小。根據預設,快取記憶體會等於執行個體的容量。不過,調整「預留記憶體」可減少快取記憶體。詳情請參閱「保留記憶體」。快取記憶體一旦用盡,Memcached 就會開始撤銷快取中儲存的項目,以便騰出空間供新寫入作業使用。

請注意,查看快取記憶體指標時,Memcached 節點回報的快取記憶體只包含項目所占用的空間。也就是說,Memcached 可能會低估快取記憶體總用量。快取可能會分配額外記憶體,以便在區塊內進行分割。

記憶體額外負擔

記憶體額外負擔是指 Memcached 程序使用的記憶體。不包含儲存在記憶體中的項目,以便快取。

記憶體額外負擔會根據有效連線數量、項目總數和項目大小進行調整。此外,記憶體開銷在理論上是無限的,因此可能會無限增長。

為因應記憶體額外負擔,Memorystore 會為執行個體新增額外記憶體。不過,您無法查看我們新增的額外記憶體容量。 對於大多數工作負載而言,記憶體額外負擔不應造成問題。

在沒有任何設定的情況下,Memcached 節點的空白 Memorystore 記憶體會如下圖所示。

預留位置

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

預留位置

由於額外開銷的成長沒有上限,因此某些工作負載的額外開銷會超過預留限制,如下所示:

預留位置

當開銷和項目填滿所有可用空間時,Memcached 就會耗盡記憶體,且作業系統必須終止該程序,導致完整快取清除:

預留位置

您可能會發現記憶體開銷會超出 Memorystore 預設為開銷分配的額外空間 (如高 系統記憶體使用率所示)。在這種情況下,請增加「保留記憶體」參數,為工作負載建立額外額外負擔。

預留的記憶體

保留記憶體是一種 Memorystore 設定,可讓您增加可供記憶體額外負擔使用的空間量。

如要增加可用於記憶體開銷的記憶體,請增加「保留記憶體」,這會減少可用的快取記憶體。如果執行個體因高記憶體額外負擔而受到記憶體壓力,請新增這個額外空間。

2021 年 10 月 25 日後建立的執行個體,預留記憶體的預設百分比為 10%。您可以手動更新例項設定,覆寫這個值。減少執行個體的預留記憶體,可能會大幅提高 OOM 情況的機率。

下圖顯示一個透過增加「保留記憶體」來為記憶體開銷建立額外空間的執行個體:

預留位置

一旦 Memcached 快取達到這個縮減的上限,就會開始移除項目。

預留位置

開始使用執行個體後,視系統記憶體使用率指標而定,您可能需要增加執行個體的保留記憶體,以支援工作負載尖峰。

詳情請參閱「管理系統記憶體用量」。

系統記憶體使用率

系統記憶體等於您佈建的執行個體容量,加上 Memorystore 為記憶體開銷新增的額外空間。

「系統記憶體使用率」指標會顯示所有已用記憶體 (儲存項目加上記憶體額外負擔) 與系統記憶體的百分比。這是一項重要的指標,因為它會顯示您離完全填滿執行個體的可用系統記憶體有多近。隨著系統記憶體使用率指標接近 100%,執行個體發生 OOM 情況的可能性就會提高。為確保執行個體有足夠的記憶體來支援工作負載,請務必隨時保留足夠的系統記憶體。

如果工作負載會嘗試填滿快取,並依賴 Memcached 淘汰作業來管理儲存的項目,則系統記憶體使用率會偏高,建議您預先提高保留記憶體,確保有足夠的空間可用於額外負擔。

系統記憶體用量警示

您應該設定快訊,讓系統在「System Memory Utilization」(系統記憶體使用率) 指標超過 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 錯誤,請按照下列步驟解決問題:

  1. 驗證 OOM 情況
  2. 增加執行個體的保留記憶體
  3. 擴充執行個體
  4. 為易變性金鑰設定存留時間
  5. 手動刪除執行個體上的金鑰
  6. 如果仍遇到 OOM 情況,請與 Google Cloud Platform 支援團隊聯絡

驗證 OOM 情況

當執行個體達到 OOM 情況時,第一個信號就是重新啟動執行個體。如要查看重新啟動是否由 OOM 情況所造成,請查看「Uptime」和「System Memory Utilization」指標

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

增加預留記憶體

增加保留記憶體可為記憶體開銷騰出更多空間。這麼做的方式是降低執行個體的快取記憶體限制。如果「系統記憶體使用率」指標超過 90%,請增加「保留記憶體」的容量。

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

增加「預留記憶體」會減少可用於儲存項目的記憶體,導致項目提早遭到淘汰。這可能會降低執行個體的快取命中率。如果您已停用淘汰機制,系統就不會淘汰項目。

擴充執行個體

如要增加節點數量,請按照「調整 Memcached 執行個體」一文中的操作說明進行。如果應用程式已設定為在各個節點上分割索引鍵,則可增加應用程式可用的整體項目儲存空間,並減少儲存在個別節點上的索引鍵數量。

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

請設定應用程式,為 Memcached 中儲存的金鑰設定 TTL。根據預設,Memcached 會定期檢查並移除已過期的金鑰,釋出伺服器空間並避免進一步分配快取記憶體。

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

遇到記憶體壓力時,建議您考慮刪除索引鍵。不過,由於開放原始碼 Memcached 不會釋放先前已配置的記憶體,因此刪除鍵只會降低進入 OOM 情況的機率。因為新寫入作業會使用空白記憶體,因此可降低發生的機率。記憶體開銷增加仍可能導致 OOM 狀況,因為先前已分配的記憶體專門用於儲存項目,無法供開銷使用。