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

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

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

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

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

メモリ管理のコンセプト

インスタンスの容量

インスタンスの容量は、GiB 単位でプロビジョニングするメモリの量で、その量で課金されます。キャッシュ メモリは固定されていないため、インスタンス容量と同じではありません。ただし、Memcached インスタンスを作成すると、インスタンスの容量はデフォルトでキャッシュ メモリと同じになります。

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

キャッシュ メモリの上限

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

キャッシュ メモリ指標を表示すると、報告される Memcached ノードのキャッシュ メモリには、アイテムが占有している容量のみが含まれることに注意してください。つまり、Memcached はキャッシュ メモリの合計使用量を実際よりも少なく見積もる可能性があります。キャッシュは、slab で断片化として追加のメモリを割り当てることができます。

メモリのオーバーヘッド

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

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

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

構成しないと、Memcached ノードのメモリの空の Memorystore は次の図のようになります。

プレースホルダ

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

プレースホルダ

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

プレースホルダ

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

プレースホルダ

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

予約済みメモリ

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

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

2021 年 10 月 25 日以降に作成されたインスタンスのデフォルトの予約済みメモリ率は 10% です。この値は、インスタンスの構成を更新することで、手動でオーバーライドできます。インスタンス上の予約済みメモリを減らすと、OOM 状態になる可能性が大幅に高まります。

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

プレースホルダ

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 状態になる可能性があります。