視覚的な診断により、ACK クラスター内のメモリリーク、断片化、および OOM エラーを特定します。
メモリ診断は、メモリ概要、メモリ分析、OOM 分析の 3 つの領域で構成されます。ノードレベルと Pod レベルの両方でメモリを検査します。
表示される診断項目は、実際のクラスター設定を反映しています。
診断を実行すると、ACK は各ノードからシステムバージョン、負荷状況、Docker と kubelet のステータス、システムログ内の主要なエラーメッセージなどのデータを収集します。ACK は、ビジネスデータや機密情報を収集しません。
診断ワークフロー
3 つの診断領域を順番に使用して、メモリの問題を絞り込みます。
-
メモリ概要 — メモリリーク、断片化、未解放の Memcg エントリ、THP の浪費などのメモリリスクを確認します。グラフを使用して、異常な使用がカーネルメモリとアプリケーションメモリのどちらで発生しているかを確認します。
-
メモリ分析 — プロセスレベルおよび Pod レベルのメモリ使用量までドリルダウンし、どのプロセスまたはコンテナが過剰な匿名メモリ、ページキャッシュ、または共有メモリを消費しているかを特定します。
-
OOM 分析 — OOM イベントの数と種類を確認し、OOM エラーがノード (ホスト) レベルで発生しているか、コンテナ (cgroup) レベルで発生しているか、またどのコンテナがメモリ制限に達したかを判断します。
メモリ概要
以下の診断項目でメモリリスクを特定します。
| 診断項目 | 説明 |
|---|---|
| メモリリーク | Slab、Vmalloc、バディシステム (allocpage) におけるカーネルメモリのリークをチェックします。 |
| メモリ使用量 | システムのメモリ使用率を表示します。 |
| Memcg | 未解放のメモリ cgroup (Memcg) がシステムのパフォーマンスを低下させたり、統計エラーを引き起こしたりしていないかチェックします。 |
| メモリの断片化 | システムのパフォーマンスを低下させるメモリの断片化をチェックします。 |
| THPZeroPage | 透過的ヒュージページ (THP) の浪費率を評価します。 |
システムのメモリ使用量は、グラフで 3 つのカテゴリに分けて表示されます。
-
カーネルメモリ (kernel):OS カーネルが使用する合計メモリ。
-
アプリケーションメモリ (app):ユーザーモードのプログラムが使用する合計メモリ。
-
空きメモリ (free):システムの合計空きメモリ。
基本概念
以下の用語は、メモリ診断全体で使用されます。
| 用語 | 説明 |
|---|---|
| メモリリーク | 動的に割り当てられたメモリが解放されず、メモリ使用量が継続的に増加する場合に発生します。未解決のリークはパフォーマンスを低下させ、クラッシュを引き起こす可能性があります。 |
| メモリ使用率 | メモリ使用率 = (合計メモリ - 空きメモリ) x 100 / 合計メモリ。ページキャッシュは空きメモリとしてカウントされ、使用率には影響しません。カーネルはいつでも回収できます。 |
| 未解放のMemcg | システム例外のために解放されなかったメモリ cgroup。システムのパフォーマンスを低下させる可能性があります。 |
| メモリの断片化 | 時間の経過とともに、連続した空きメモリブロックが小さくなり、大きな割り当て要求に対応できなくなります。これにより、割り当てが遅延し、アプリケーションのジッターが発生します。 |
| THPの浪費率 | THP の浪費率 = ゼロ THP の数 x 100% / THP の総数。詳細については、後述の「THP の詳細」をご参照ください。 |
| バディシステム | メモリページを管理するための Linux カーネルアルゴリズム。ページを 2 のべき乗のブロックサイズを持つ 11 のグループ (4 KB、8 KB、16 KB、32 KB ... 4 MB) に分割します。ほとんどのページは 4 KB です。 |
| Slab | バディシステム上で小さなメモリを割り当てます。 |
| Vmalloc | バディシステム上で非線形マッピングを使用してメモリを割り当てます。 |
| ページキャッシュ (filecache) | Linux は、後のアクセスを高速化するために、ファイルの内容をメモリにキャッシュします。 |
| 匿名メモリ | new、malloc、または mmap によってプロセスのヒープとスタックに動的に割り当てられるメモリ。ファイルシステムによってバックアップされません。 |
| 共有メモリ | プロセス間通信のために 2 つ以上のプロセスで共有されるメモリブロック。 |
| tmpfs | メモリにバックアップされる Linux の一時ファイルシステム。すべての読み取りと書き込みがメモリにキャッシュされます。 |
| hugetlb | ファイルシステム内のヒュージページによって消費されるメモリ。 |
THP の詳細
透過的ヒュージページ (THP) は、カーネル内でサイズが 2 MiB または 1 GiB のヒュージページです。各サブページは 4 KiB なので、1 つの 2 MiB THP は 512 のサブページに相当します。
THP が有効になっていると、カーネルは動的に THP を割り当て、トランスレーション ルックアサイド バッファ (TLB) のミスを減らし、パフォーマンスを向上させます。ただし、THP はメモリの肥大化と過剰コミットを引き起こす可能性があります。アプリケーションが 8 KiB (2 サブページ) しか要求しない場合でも、カーネルは完全な 2 MiB の THP を割り当てます。これにより、510 のゼロサブページが残り、常駐セットサイズ (RSS) を浪費し、OOM エラーを引き起こす可能性があります。
カーネルメモリのメトリクス
ほとんどの場合、メモリリークは SUnreclaim またはバディシステムの異常な使用量によって示されます。これらのメトリクスを注意深く監視してください。
| メトリクス | 説明 |
|---|---|
| SReclaimable | Slab が回収できるメモリ。 |
| SUnreclaim | Slab が回収できないメモリ。異常な増加は、カーネルメモリのリークを強く示唆しています。 |
| PageTables | カーネルのページテーブルによって占有されるメモリ。 |
| Vmalloc | Vmalloc によって割り当てられたメモリ。 |
| KernelStack | プロセスによって使用されるカーネルスタックメモリの合計。 |
| AllocPages | alloc_pages などの関数によってバディシステムから割り当てられたメモリ。どのノードファイルからも取得できないため、過剰に使用するとメモリのブラックホールが作成されます。 |
アプリケーションメモリのメトリクス
ユーザーモードのメモリ使用量を分析する際は、匿名メモリ、共有メモリ、ページキャッシュに注目します。
| メトリクス | 説明 |
|---|---|
| filecache | drop caches を実行することで回収できるページキャッシュ。 |
| anon | プログラムのヒープとスタックで使用される匿名メモリ。使用量が多い場合は、プロセスのメモリリークまたは THP が有効になっていることを示唆します。 |
| mlock | システムによってロックされたメモリ。 |
| huge | ヒュージページによって使用されるメモリ。 |
| buffer | ブロックデバイスとファイルシステムのメタデータによって使用されるメモリ。 |
| shmem | 共有メモリ (tmpfs)。プロセスが終了した後に tmpfs ファイルが削除されない場合、またはファイルが開いている間に削除された場合にリークが発生します。 |
メモリ分析
プロセスメモリとPod メモリの 2 つのビューを提供します。
プロセスメモリ
メモリ使用量でソートされたプロセスを一覧表示し、匿名メモリ、ページキャッシュ、共有メモリの内訳を示します。
Podメモリ
各コンテナと Pod でどのファイルがページキャッシュと共有メモリを占有しているか、またアクティブキャッシュと非アクティブキャッシュの比率を表示します。
| 診断項目 | 説明 |
|---|---|
| Pod | Pod の名前。 |
| コンテナ | コンテナの名前。 |
| ファイル | ファイル名を含むファイルのフルパス。 |
| キャッシュ | ファイルによって占有されるページキャッシュ (filecache)。 |
| コンテナキャッシュ | ファイルによって占有されるコンテナレベルのキャッシュ。同じコンテナ内の複数のプロセスが同じファイルを参照する場合があります。 |
| アクティブキャッシュ | 現在使用中のページキャッシュ。 |
| 非アクティブキャッシュ | 使用されておらず、回収対象となるページキャッシュ。 |
OOM分析
以下の項目でメモリ不足エラーを診断します。
| 診断項目 | 説明 |
|---|---|
| OS OOMカウント | ホストの起動から診断までの合計 OOM エラー数。 |
| 利用可能なメモリ | 現在のシステムの空きメモリ。 |
| 低ウォーターマーク | メモリ不足のしきい値。利用可能なメモリがこの値を下回ると、カーネルは非同期のメモリ回収をトリガーします。 |
| コンテナ | Pod 名、コンテナ ID、または cgroup 名。 |
| 制限 | コンテナに設定されたメモリ制限。 |
| 使用量 | コンテナが現在使用しているメモリ。 |
| OOMカウント | コンテナ内の合計 OOM エラー数。 |
| OOMタイプ | [Host]OOM エラーのタイプ:ホストまたは。 |