本頁面說明 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 錯誤,請按照下列步驟解決問題:
- 驗證 OOM 情況。
- 增加執行個體的保留記憶體。
- 擴充執行個體。
- 為易變性金鑰設定存留時間。
- 手動刪除執行個體上的金鑰。
- 如果仍遇到 OOM 情況,請與 Google Cloud Platform 支援團隊聯絡。
驗證 OOM 情況
當執行個體達到 OOM 情況時,第一個信號就是重新啟動執行個體。如要查看重新啟動是否由 OOM 情況所造成,請查看「Uptime」和「System Memory Utilization」指標。
如果系統記憶體使用率在正常運作時間降至零之前超過 90%,表示執行個體重新啟動的原因可能是 OOM 情況。
增加預留記憶體
增加保留記憶體可為記憶體開銷騰出更多空間。這麼做的方式是降低執行個體的快取記憶體限制。如果「系統記憶體使用率」指標超過 90%,請增加「保留記憶體」的容量。
如需調整「保留記憶體」設定的操作說明,請參閱「設定 Memcached 執行個體」
增加「預留記憶體」會減少可用於儲存項目的記憶體,導致項目提早遭到淘汰。這可能會降低執行個體的快取命中率。如果您已停用淘汰機制,系統就不會淘汰項目。
擴充執行個體
如要增加節點數量,請按照「調整 Memcached 執行個體」一文中的操作說明進行。如果應用程式已設定為在各個節點上分割索引鍵,則可增加應用程式可用的整體項目儲存空間,並減少儲存在個別節點上的索引鍵數量。
為易變性金鑰設定存留時間
請設定應用程式,為 Memcached 中儲存的金鑰設定 TTL。根據預設,Memcached 會定期檢查並移除已過期的金鑰,釋出伺服器空間並避免進一步分配快取記憶體。
手動刪除執行個體上的金鑰
遇到記憶體壓力時,建議您考慮刪除索引鍵。不過,由於開放原始碼 Memcached 不會釋放先前已配置的記憶體,因此刪除鍵只會降低進入 OOM 情況的機率。因為新寫入作業會使用空白記憶體,因此可降低發生的機率。記憶體開銷增加仍可能導致 OOM 狀況,因為先前已分配的記憶體專門用於儲存項目,無法供開銷使用。