
Ubuntu 22.04 で、メモリに関する奇妙な問題が発生しています。メモリ使用量がなぜこれほど高いのか、原因がわかりません。ラップトップを起動すると、メモリ使用量は予想どおりですが、時間が経つにつれて、何かがメモリを消費しているように見えますが、システムはメモリが何に使用されているかを認識していないようです。
ラップトップを数日間稼働させ、一晩スリープ状態にした後、free -m
次のレポートが表示されます。
total used free shared buff/cache available
Mem: 14812 7329 2683 1810 4799 5348
Swap: 2047 416 1631
すべての応募は締め切られており、このツールすべてのアプリケーションで使用される累積メモリは 1.7 GiB です。では、最後の約 5.5 GiB (7.2-1.7) は何に使用されているのでしょうか?
何か見逃しているのでしょうか?
答え1
この回答は、OP が経験している範囲を超える可能性のある「説明されていない」メモリ使用量の考えられる原因をトラブルシューティングするために書かれています。
背景
Linux では、メモリ使用量は主に次の 2 つの要素に起因します。
- プロセス/スレッドによる使用状況
- ファイルシステムによる使用
この質問の場合、質問者はプロセス/スレッドによって使用されたすべてのメモリを把握できません。したがって、残りのメモリはカーネルによってファイルシステム操作に使用されている可能性が非常に高くなります。
考えられる原因
現在、ファイルシステムのメモリ使用量が過剰になる主な理由は 3 つあると認識しています。
- ZFS ARC キャッシュ (または「通常の」メモリ使用量として登録される同様のファイルシステム キャッシュ)
- ラムディスク(
tmpfs
および類似のファイルシステム) - ネイティブファイルシステムの圧縮と過剰なディスクI/Oの組み合わせ(その結果、圧縮/再圧縮が行われ、一定のメモリ消費が発生します)
これら 3 つのシナリオをトラブルシューティングするには、次の方法をお勧めします。
1. ZFS ARC キャッシュ
ZFS ARC キャッシュの詳細情報を取得するには、次のコマンドを実行します。
arcstat -a
によって報告される統計は、size
通常の使用メモリとして表示されます。
あなたの投稿から、ここでは 0.5 GB が使用されていることは明らかです。
2. ラムディスク
現在のファイルシステム RAM ディスクに関する情報を取得するには、次のコマンドを実行しますtmpfs
。
df -hl -t"tmpfs"
によって報告される量は、used
通常の使用メモリとして表示されます。
Ubuntu (および他の多くの Linux バリアント) には、 の下にデフォルトの RAM ディスクがあります/dev/shm
。アプリケーションがこの領域を使用することがあるため、次のように簡単に確認できます。
ls -ahl /dev/shm
さらに、出力のtmpfs
下に使用量も表示されるため、投稿から、ここでは 1.8 GB が使用されていることがわかります。shared
free
3. FS圧縮
このコマンドでディスク IO を確認します: (はパッケージiostat
の一部ですsysstat
)
iostat
これを、関連するディスクに対して有効になっているファイルシステム圧縮に関する知識と組み合わせます。ZFS の場合、次のコマンドを実行して、すべての Zpool とデータセットの圧縮プロパティを取得します。
zfs get compression
ディスク IO が高く、ネイティブ圧縮が有効になっている場合、過剰なメモリが通常の使用メモリとして報告される可能性があります。
答え2
ファイルシステムで圧縮を使用していますか、それとも BTRFS や ZFS のようなコピーオンライト ファイルシステムを使用していますか?
過剰なメモリ使用量は、カーネルがファイルをリアルタイムで(再)圧縮しようとしたり、大きなファイルが頻繁に変更されるときに各書き込みをコピー/バージョン管理しようとしたりすることが原因である可能性があります。
仮想マシンのイメージのように、ファイルが頻繁に変更され、サイズがメガバイトではなくギガバイト単位である大きなファイルがある場合、メモリの圧迫は特に顕著になります。
ファイルシステム/サブボリューム/ボリュームレベルまたは個々のファイルレベルでの圧縮を無効にしたり、COW(コピーオンライト)を無効にしたりすることができます。
BTRFS:
特定のファイルの圧縮を解除する機能をサポート btrfs コマンド:
property set <file> compression none
特定のフォルダーの COW (コピーオンライト) を削除するには:
chattr -R +C /directory/of/your/vm_images/
ZFS:
個々のファイルの圧縮を解除することはできないと思います。ボリュームの圧縮を無効にすると、将来の書き込みにのみ影響するため、ファイルの圧縮を無効にするには、各ファイルを個別にコピーする必要があります。
zfs set compression=off name_of_zfs_vol