メモリ管理のベスト プラクティス

このページでは、Memcached インスタンスの予約済みメモリの構成と、必要に応じて予約済みメモリを増加する場合について説明します。このページでは、Memcached インスタンスのメモリを効果的に管理するために知っておくべきその他のベスト プラクティスについても説明します。

Memorystore では、Memcached プロセスによって作成されたオーバーヘッドに対応するために、インスタンスに表示されないメモリが追加されます。ただし、特定のワークロードによっては、この目的でプロビジョニングした追加のメモリよりもメモリ オーバーヘッドが大きくなる場合があります。

メモリ使用量が Memorystore のシステムメモリ全体よりも大きくなると、メモリ不足(OOM)条件によりデータの完全なキャッシュ フラッシュが発生し、アプリケーションとビジネスが中断される可能性があります。

次のセクションでは、Memorystore for Memcached インスタンスを構成する際に従う一般的な原則の概要を説明します。また、メモリのモニタリングに使用できる指標とアラートと、実行可能なアクションについても説明します。

メモリ管理のコンセプト

インスタンスの容量

インスタンスの容量は、プロビジョニングするメモリ量(GiB)と請求額です。キャッシュメモリは固定されていないため、インスタンス容量とは異なります。ただし、Memcached インスタンスを作成すると、インスタンスの容量はデフォルトでキャッシュ メモリと同じになります。

たとえば、インスタンスの容量として 5 GiB を選択した場合、アイテムを保存するインスタンスのデフォルトの容量は 5 GiB になります。

キャッシュ メモリの上限

キャッシュ メモリは、Memcached インスタンスによってキャッシュとして使用できるメモリの合計サイズです。デフォルトでは、キャッシュ メモリはインスタンスの容量と同じです。ただし、予約済みメモリを調整すると、キャッシュ メモリが削減される場合があります。詳細については、予約済みメモリをご覧ください。キャッシュ メモリがいっぱいになると、Memcached はキャッシュに保存されているアイテムを削除し、新しい書き込み用のスペースを確保します。

キャッシュ メモリ指標を表示すると、Memcached ノードの報告されたキャッシュメモリには、アイテムが占めるスペースのみが含まれます。つまり、Memcached はキャッシュの合計メモリ使用量を過小評価する可能性があります。追加のメモリは、スラブ内の断片化としてキャッシュによって割り当てられる場合があります。

メモリのオーバーヘッド

メモリのオーバーヘッドは、Memcached のプロセスで使用されるメモリです。キャッシュのためにメモリに保存されたアイテムは含まれません。

メモリ オーバーヘッドは、アクティブな接続の数、合計アイテム数、アイテムサイズに基づいてスケーリングされます。また、メモリのオーバーヘッドは理論上は制限されないため、無限に増加する可能性があります。

Memorystore ではメモリのオーバーヘッドに対応するために、インスタンスにメモリが追加されます。ただし、追加で割り当てられるメモリの量は確認できません。 ほとんどのワークロードでは、メモリのオーバーヘッドは問題になりません。

構成しないと、Memcached ノードのメモリの空の Memorystore は次の図のようになります。予約済みメモリと比較して、追加メモリの量には、Memorystore で提供される追加のメモリ量が反映されません。

プレースホルダ

アプリケーションがキャッシュにアイテムを追加すると、Memcached は接続バッファや内部ハッシュ テーブルなどのプロセスのオーバーヘッドを蓄積します。

プレースホルダ

オーバーヘッドの増加は制限されていないため、以下に示すように、一部のワークロードのオーバーヘッドは予約された上限を超えて増加します。

プレースホルダ

オーバーヘッドとアイテムが使用可能な容量をすべて占有すると、Memcached はメモリ不足になり、OS によってプロセスが終了し、キャッシュは完全にフラッシュされます。

プレースホルダ

メモリのオーバーヘッドが、Memorystore でデフォルトでオーバーヘッドに対して割り当てられる追加容量を超えて増加する場合があります(システムメモリ使用率が高いことによって示される)。そのような場合は、予約済みメモリ パラメータの値を大きくして、ワークロードのオーバーヘッドを追加します。

予約済みメモリ

予約済みメモリは、メモリ オーバーヘッドで使用できる容量を増やすことができる Memorystore 構成です。

メモリ オーバーヘッドに利用できるメモリを増やすには、予約済みのメモリを増やして、使用できるキャッシュ メモリを減らします。インスタンスでメモリ オーバーヘッドが高いためにメモリ負荷が発生した場合は、この容量を追加する必要があります。

下の図は、予約済みメモリを増やすことにより、メモリ オーバーヘッド用に追加の容量を作成したインスタンスを示しています。

プレースホルダ

Memcached キャッシュがこの上限に達すると、アイテムの排除が開始されます。

プレースホルダ

インスタンスの使用を開始した後、システムメモリ使用率の指標によっては、ピーク時のワークロードに対応するためにインスタンスの予約済みメモリの増量が必要になることがあります。

詳細については、システムのメモリ使用量の管理をご覧ください。

システムのメモリ使用率

システムメモリは、プロビジョニングされたインスタンスの容量に、メモリのオーバーヘッドのために Memorystore によって追加される容量を加えた容量と同じです。

システム メモリ使用率は、システムメモリと比較した使用されているすべてのメモリ(保存されているアイテムとメモリのオーバーヘッド)の割合を示す指標です。これはインスタンスに対して使用可能なシステムメモリがどれだけいっぱいになっているかを示しているため、重要な指標です。システムのメモリ使用率の指標が 100% に近づくと、インスタンスで OOM 状態が発生する可能性があります。インスタンスを確保するには、ワークロードをサポートするために十分なメモリがあり、利用可能で十分なシステム メモリが常にあることが重要です。

ワークロードがキャッシュ全体を占有し、保存するアイテムを管理するために Memcached の強制排除に依存しているワークロードでは、システムのメモリ使用率が高くなることが予想されます。ワークロードに対して十分な容量を保証するには、あらかじめ予約済みメモリを増やしておく必要があります。

システムのメモリ使用率のアラート

システムのメモリ使用率の指標が 90% を超えた場合に通知するアラートを設定する必要があります。システムのメモリ使用率が高い場合は、システム メモリ使用率の指標を注意深く監視し、急激に増加した場合は、システムのメモリの使用率を管理する手段を検討する必要があります。システムのメモリ使用率が高レベルに達したときに対応することは、OOM 状態によるキャッシュ フラッシュに対処する代わりに緩和する時間を確保ために重要です。

エビクション ポリシー

Memcached は最適化された LRU アルゴリズムを使用して、キャッシュ メモリを使い切るとアイテムを削除します。キャッシュの強制削除を無効にする手順については、Memcached インスタンスの構成をご覧ください。

モニタリングの強制削除では、サイズ制限が原因で Memcached で削除されるキーの数が表示されます。TTL の有効期限により削除されたアイテムは、この指標には含まれません。多数の強制削除が発生した場合、インスタンスをスケールアップすると、キャッシュ ヒット率が上がる可能性があります。

強制削除が有効ではない場合、キャッシュが完全にいっぱいになると、Memcached サーバーでアイテムを設定できないことがあります。

キャッシュ ヒット率

キャッシュ ヒット率の指標を定期的にモニタリングして、Memcached インスタンスのキーによって正常に返されるキー検索の割合を把握する必要があります。一般に、低いキャッシュ ヒット率よりは、高いキャッシュ ヒット率の方が良いと言われています。これは、キャッシュがより多くのキャッシュ リクエストを返すことを意味するためです。

予約済みメモリの調整、キー TTL の調整、インスタンスのスケーリングなど、大きな構成変更を行う前に、キャッシュ ヒット率をメモしておく必要があります。次に、インスタンスを変更した後、キャッシュ ヒット率を再度確認して、変更がこの指標にどのように影響したかを確認します。

インスタンスのメモリ使用量をモニタリングする

次の指標により、インスタンスのメモリ使用量を確認できます。指標を表示してアラートを設定する方法については、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. 変動キーに TTL を設定します
  5. インスタンス上の鍵を手動で削除します
  6. それでも OOM の状態が続く場合は、Google Cloud Platform サポートまでお問い合わせください。

OOM 状態の確認

インスタンスが OOM 状態に達すると、最初のシグナルはインスタンスの再起動になります。OOM 状態によって再起動が発生したかどうかを確認するには、稼働時間とシステムメモリ使用率の指標を確認します。

稼働率がゼロになる前にシステムメモリ使用率が 90% を超えた場合、OOM 状態によってインスタンスの再起動が発生した可能性があります。

予約済みメモリを増やす

予約済みメモリを増やすと、メモリのオーバーヘッドのための容量が増加します。これを行うには、インスタンスのキャッシュメモリの上限を下げます。システムメモリ使用率の指標が 90% を超える場合は、予約済みメモリを増やす必要があります。

予約済みメモリの構成を調整する手順については、Memcached インスタンスの構成をご覧ください。

予約済みメモリを増やすと、アイテムの保存に使用できるメモリが減少し、アイテムの強制削除が早く発生します。これにより、インスタンスのキャッシュ ヒット率が下がる場合があります。強制削除が無効な場合は、アイテムが強制排除されません。

インスタンスをスケールアップする

Memcached インスタンスのスケーリングの手順に従って、ノード数を増やします。アプリケーションがノード間でキーをシャーディングするように構成されている場合、アプリケーションで利用可能なアイテム全体の保存容量が増加し、個々のノードに保存されるキーの数を減少します。

変動キーに TTL を設定する

Memcached に保存されるキーに対して TTL を設定するようにアプリケーションを構成します。デフォルトでは、Memcached は期限切れのキーを定期的にチェックして削除し、サーバーの空き容量を増やして、キャッシュのメモリ割り当てが増えないようにします。

インスタンスのキーを手動で削除する

メモリ不足に直面した場合、キーの削除を検討する必要があります。ただし、オープンソースの Memcached は以前に割り当てられたメモリを解放しないため、キーを削除しても、OOM 状態になる可能性が低くなるだけです。新しい書き込みでは空のメモリが使用されるため、この可能性は低くなります。以前に割り当てられたメモリはアイテムの保存専用であり、オーバーヘッドで使用できないため、メモリのオーバーヘッドが増加すると OOM 状態になる可能性があります。