Container Intelligence Service は、メモリリーク、メモリ断片化、メモリ不足 (OOM) エラーなど、Container Service for Kubernetes (ACK) クラスタにおける一般的なメモリの問題を特定するのに役立つメモリ診断機能を提供します。診断結果はチャートと表に表示され、システムのメモリ使用量を示し、O&M 作業を容易にします。このトピックでは、メモリ診断について紹介します。
メモリ診断は、メモリの概要、メモリ分析、および OOM 分析で構成されています。ノードとポッドのメモリ使用量を表示できます。
診断項目は、クラスタ構成によって異なる場合があります。診断ページの実際の診断項目が優先されます。
診断機能を使用すると、ACK はクラスタ内の各ノードでデータ収集プログラムを実行し、診断結果を収集します。収集される情報には、システムバージョン、負荷の状態、Docker、kubelet のステータス、およびシステムログの主要なエラー情報が含まれます。ACK はビジネス情報や機密データを収集しません。
メモリの概要
メモリの概要機能は、メモリリスクに関連する診断項目を表示します。次の表に、診断項目を示します。
診断項目 | 説明 |
Leaked Memory | Slab、Vmalloc、および buddy system (allocpage) におけるシステムカーネルのメモリリークを確認します。 |
Memory Usage | システムメモリの使用率を表示します。 |
Memcg | 解放されていないメモリ cgroup がシステムパフォーマンスを低下させ、統計エラーを引き起こすかどうかを評価します。 |
Memory Fragmentation | システムパフォーマンスを低下させるメモリ断片化を確認します。 |
THPZeroPage | THP の無駄の比率を評価します。 |
カーネルメモリ、ユーザーモードのアプリケーションメモリ、空きメモリなど、システムメモリ使用量に関する情報がチャートに表示されます。
カーネルメモリ (kernel): オペレーティングシステムカーネルによって使用されるメモリの総量。
アプリケーションメモリ (app): ユーザーモードのプログラムによって使用されるメモリの総量。
空きメモリ (free): 空きシステムメモリの量。
用語
用語 | 説明 |
メモリリーク | メモリリークとは、プログラムに動的に割り当てられたメモリリソースが解放され、システムメモリの使用率が増加することを指します。メモリリークは、プログラムのパフォーマンスを低下させたり、システムクラッシュを引き起こしたりする可能性があります。 |
メモリ使用率 | メモリ使用率 = (合計メモリ - 空きメモリ) × 100/合計メモリ。ファイルキャッシュは空きメモリであり、メモリ使用率には影響しません。システムはいつでもファイルキャッシュを再利用できます。 |
解放されていない Memcg | システムの例外により解放されていないメモリ cgroup。これらのメモリ cgroup は、システムパフォーマンスを低下させる可能性があります。 |
メモリ断片化 | メモリ断片化とは、システムが長時間実行された後、空き連続メモリブロックが小さすぎるために、連続メモリ割り当て要求を満たすことができないことを指します。この失敗により、メモリ割り当てが遅延し、ビジネスのジッターが発生します。 |
THP の無駄の比率 | Transparent Enormous Pages (THP) は、カーネル内でサイズが 2 MiB または 1 GiB の巨大なページです。サブページのサイズは 4 KiB です。 THP が有効になっている場合、カーネルは動的に THP を割り当てて、Translation Lookaside Buffer (TLB) ミスを減らし、アプリケーションのパフォーマンスを向上させます。 ただし、THP はメモリ肥大化を引き起こす可能性があります。カーネルは、2 MiB のメモリブロックを THP として割り当てます。これは 512 個のサブページに相当します。これにより、メモリの無駄が生じ、メモリオーバーコミットが発生します。メモリ肥大化は、OOM エラーにつながる可能性があります。たとえば、8 KiB のメモリ (2 つのサブページ) のみ要求するアプリケーションに 2 MiB の THP が割り当てられると、残りの 510 個のサブページはゼロサブページになり、常駐セットサイズ (RSS) の無駄が生じ、OOM エラーが発生します。 THP の無駄の比率 = ゼロ THP の数 × 100%/THP の総数 |
buddy system | buddy system は、Linux カーネルがメモリページを管理するために使用するアルゴリズムです。メモリページを 11 のグループに分割します。ほとんどの場合、メモリページのサイズは 4 KB です。 buddy system は、各メモリブロックのメモリページ数を 2 の累乗の増分で管理します (4 KB、8 KB、16 KB、32 KB……4 MB など)。 |
Slab | Linux の buddy system に基づいて小さなメモリを割り当てるメモリ割り当て子。 |
Vmalloc | Linux の buddy system に基づいて非線形マッピングを使用するメモリ割り当て子。 |
filecache | Linux がファイルを読み書きするときに、ファイルの内容をメモリにキャッシュします。これにより、プログラムはメモリ内の内容を直接読み書きできます。これは、ファイルを読み書きするよりもはるかに高速です。 |
匿名メモリ | 匿名メモリは、new、malloc、または mmap を介してプロセスのヒープとスタックに動的に割り当てられます。匿名メモリはファイルシステムによってバッキングされていません。 |
共有メモリ | 通信のために 2 つ以上のプロセスによって共有されるメモリブロック。 |
tmpfs | メモリに基づく Linux の一時ファイルシステム。ファイルシステムは、読み書きする内容をメモリにキャッシュします。 |
enormoustlb | ファイルシステム内の巨大なページによって消費されるメモリの量。 |
カーネルメモリ
ほとんどの場合、Sunreclaim と buddy system のメモリ使用量が異常な場合、メモリリークが発生します。カーネルモードでのメモリ使用量に細心の注意を払ってください。
メトリック | 説明 |
Sreclaimable | Slab によって再利用できるメモリ。 |
Sunreclaim | Slab によって再利用できないメモリ。 |
PageTables | カーネルページテーブルによって占有されるメモリ。 |
Vmalloc | Vmalloc 関数を呼び出すことによって割り当てられるメモリ。 |
KernelStack | プロセスのヒープとスタックによって占有されるメモリ合計。 |
AllocPages | alloc_pages などの関数を呼び出すことによって buddy system から割り当てられるメモリ。ノードファイルを使用してメモリを取得することはできません。メモリの過剰使用は、ブラックホールを引き起こします。 |
アプリケーションメモリ
ユーザーモードでアプリケーションのメモリ使用量を表示する場合は、匿名メモリ、共有メモリ、およびファイルキャッシュに細心の注意を払う必要があります。
メトリック | 説明 |
filecache | キャッシュのドロップを実行することで再利用できるファイルキャッシュ。 |
anon | プログラムのヒープとスタックによって占有される匿名メモリ。大量の匿名メモリが占有されている場合は、プロセスでメモリリークを確認し、THP が有効になっているかどうかを確認する必要があります。 |
mlock | システムによってロックされたメモリ。 |
enormous | 巨大なページによって占有されるメモリ。 |
buffer | ブロックデバイスとファイルシステムのメタデータによって占有されるメモリ。 |
shmem | 共有メモリ (tmpfs)。プロセスが終了した後に tmpfs ファイルが削除されない場合、または tmpfs ファイルが開いている間に削除された場合、共有メモリリークが発生します。 |
メモリ分析
メモリ分析は、プロセスメモリ分析とポッドメモリ分析で構成されます。
プロセスメモリ
メモリ使用量情報は、匿名メモリ、ファイルキャッシュ、共有メモリなど、プロセスごとに表示されます。
ポッドメモリ
ポッドメモリ分析機能を使用すると、コンテナとポッドのファイルキャッシュと共有メモリを占有するファイル、アクティブキャッシュの比率、および非アクティブキャッシュの比率を表示できます。
診断項目 | 説明 |
Pod | ポッドの名前。 |
Container | コンテナの名前。 |
File | ファイル名を含むファイルの完全なパス。 |
Cache | ファイルによって占有されるファイルキャッシュ (filecache)。 |
Container Cache | ファイルによって占有されるコンテナキャッシュ。コンテナ内の異なるプロセスが同じファイルを管理する場合があります。 |
Active Cache | 使用中のファイルキャッシュ。 |
Inactive Cache | 使用されていないファイルキャッシュ。 |
OOM 分析
OOM 分析機能は、OOM エラーを迅速に診断し、次の診断項目を表示できます。
診断項目 | 説明 |
OS OOM Count | ホストが起動してから診断が実行されるまでに発生した OOM エラーの総数。 |
Available Memory | 空きシステムメモリの量。 |
Low Watermark | 指定された低メモリ使用量しきい値。メモリ使用量が低いしきい値を下回ると、非同期メモリ再利用操作がトリガーされます。 |
Container | ポッドの名前、コンテナの ID、または cgroup の名前。 |
limit | コンテナのメモリ制限。 |
usage | コンテナによって使用されるメモリの量。 |
OOM Count | コンテナで発生した OOM エラーの総数。 |
OOM Type | OOM エラーのタイプ。Host または cgroup を指定できます。 |