Linuxメモリを監視する正しい方法

少し前に、私たちの恐れを知らない(恐ろしい?)リーダーが Linux仮想メモリを監視する正しい方法。 彼はお金に正しかったことがわかりました(スティーブは賢い人です—誰が知っていましたか?)。 彼のブログはLinuxの監視に焦点を当てていましたが バーチャル メモリ、監視には微妙な違いがあることがわかりました 物理的な 記憶も。

あなたはLinuxオタクなので、もちろんそれを知っています 無料です。 は、カーネルがメモリをどのように使用しているかを確認するために使用するツールです。

1日平均VaST

または、さらに良いことに、監視システムがあなたに代わってそれを行うことを信頼するだけです。 Linuxシステムに適用されたLogicMonitorのNetSNMPMemデータソースによって提供される視覚化のXNUMXつを次に示します。
1日平均VaST

ちょっと待って! 監視システム(最も確実にメモリ情報についてNet-SNMPをポーリングしている)が同意しない場合、それはどういう意味ですか? 無料です。。 この場合、Net-SNMPは、このシステムが最大28 GBのメモリを使用していると述べていますが、 無料です。 使用しているのは約1.5GiBのみであると主張しています。 〜26.5 GiBの不一致は、さらに調査する価値があります。

グラフがデータを取得している場所と、「使用済み」スペースをどのように計算しているかを簡単に見てみましょう。 下のスクリーンショットでわかるように、グラフの「使用済み」データポイントは、「TotalReal」(このホストにインストールされている実メモリ/物理メモリの合計量)から「空き」と「ファイルキャッシュ」を差し引いて計算されます。 もしあなたが信じるなら 無料です。 が正しい情報を提供している場合、「空き」または「ファイルキャッシュ」のいずれかが約12GiB大きいと想定します。

1日平均VaST

では、その方法を見てみましょう 無料です。 「使用済み」を計算し、それで問題が解決するかどうかを確認します。 判明 無料です。 を解析して情報を取得します / proc / meminfoファイル。 このファイルは、Net-SNMPよりもはるかに詳細なメモリ使用量を提供します。 これがからのスニペットです proc / sysinfo.c、 コード 無料です。 / proc / meminfoを解析するために使用します:

mem_used = kb_main_total – kb_main_free – kb_main_cached – kb_main_buffers;

明らかに 無料です。 は同様の計算を使用して、メモリの合計量から空き領域とキャッシュ領域を差し引きます。 ただし、バッファスペースも差し引かれています。これは、NetSNMPMemによってキャプチャされたり、「使用済み」の計算に考慮されたりすることはありません。 通常、バッファは大量のスペースを使用しません。 カーネルのドキュメントには「20MiB程度」と記載されているため、これが原因ではない可能性があります。 ザ・ 無料です。 上記のコマンドは、下に最大30GiBを表示します バフ/キャッシュ ただし、バッファとキャッシュの内訳は示されません。 を見ようよ / proc / meminfo 問題のシステムで:

1日平均VaST

バッファー は、使用されたわずか75MiBのスペースを示しています。 カーネルのドキュメントで指定されているよりもかなり多いですが、12GiBにはほど遠いです。 見つめている キャッシュされた、上のグラフに示すように、Net-SNMPによって反映されたものである約2.5GiBが表示されます。

では、何が得られるのでしょうか? です 無料です。 違う? すべきではない バッファー & キャッシュ の出力にリストされている最大30GiBまで合計 無料です。? 何を確認したほうがいい 無料です。 「バフ/キャッシュ」を意味するので、ソースに戻ります。

printf(”%11s”、scale_size(kb_main_buffers + kb_main_cached、flags、args));

かなり単純に見え、バッファとキャッシュされています。 もう少し深く掘り下げて、これらの値がどのように作成されているかを確認する必要があります。 ザ・ kb_main_buffers 変数はからまっすぐです バッファー / proc / meminfoの行なので、何が構成されているか見てみましょう kb_main_cached:

kb_main_cached = kb_page_cache + kb_slab_reclaimable;

それは面白い、 無料です。さん キャッシュ メトリックは、ページキャッシュなどの合計です。 kb_slab_reclaimable です。 の kb_page_cache 変数は、の「キャッシュ」行に対応します / proc / meminfo、おそらくスラブのものが私たちの不一致の原因です。 見て / proc / meminfo ここでも、「Slab」、「SReclaimable」、「SUnreclaim」があります。 グーグルを節約します。 スラブは、カーネル内のデータ構造キャッシュのサイズです。 iノードやデントリーなどをキャッシュします。 SReclaimableは、再利用できるスラブの一部ですが、SUnreclaimは、(ご想像のとおり)再利用できないスラブの他の部分です。

まとめると、からCached、SReclaimable、およびBuffersを追加しましょう。 / proc / meminfo 無料で「buff / cache」(またはソースのkb_main_cached)と呼ばれるものを取得するには:

キャッシュ+ SReclaimable +バッファ=「バフ/キャッシュ」
2577684 + 27733024 + 74448 = 30385156


の出力 無料です。 および/ proc / meminfoは数分間隔で記録されましたが、上記の値は上記のfreeコマンドから見たもののように見えます。 同じ場所からデータを取得しているので、これは完全に予想されます。

しかし、もともと「使用済み」のスペースに関心があったのではないでしょうか。 上記の「mem_used」のソースの式に基づいて確認しましょう。

MemTotal – MemFree –(キャッシュ+ SReclaimable +バッファー)–バッファー=使用済み
32661080 – 464700 – 30385156 – 74448 = 1736776

それは何とまったく同じではありません 無料です。 は「使用済み」として報告していますが、はるかに近いです。 不一致は、異なる時間にデータをポーリングすることによるものです。 上記と同じ計算を行っています 無料です。 ありません。

Net-SNMPによって提供される値は、明らかにスラブスペースを考慮に入れていません。そうしないと、グラフにはるかに大きい「ファイルキャッシュ」とはるかに小さい「使用済み」が表示されます。 Net-SNMPは使用します / proc / meminfo、ただし、スラブの再生可能スペースは考慮されていません。 技術的には、上のグラフの「ファイルキャッシュ」データポイントは正しいです。これは、スラブの再利用可能なスペースがファイルキャッシュではなく、オブジェクトキャッシュであるためです。 とにかく、この追加の洞察を得るために、私たちは使用することができます Net-SNMPの「拡張」機能 の内容を取得するには / proc / meminfo SNMP経由でファイルし、自分で計算を行います。

この行をsnmpd.confに追加し、デーモンを再起動します。

meminfo / bin / cat / proc / meminfoを拡張します

LogicMonitorの新しいLinux_Meminfo_SNMPデータソースを使用すると、新しく構成された拡張OIDが自動的に検出され、監視されます。

1日平均VaST

しかし、まだ気になるパズルのピースがもう28つあります。 スラブキャッシュが最大XNUMXGiBのメモリを使用したのはなぜですか? 将来のブログのために詳細な分析を保存しますが、好奇心旺盛な方のために、 / proc / slabinfo (meminfoに似ていますが、スラブ用です)そしてそれは主に「dentry」オブジェクトタイプによって使用されていました。 オタクで好奇心旺盛な方は、「ディレクトリエントリキャッシュ」の詳細をご覧ください。 kernel.orgvfs仕様。