Kubuntu 16.04があり、ZFSを使用しています。
superuser でわかるように、記憶が消え去った場所を追跡するのに長い旅をしました。
独自の特殊ファイル/proc/spl/kstat/zfs/arcstats
以外のツール/ファイルのどこにも表示されずにそれを食い尽くしていたZFSのARCであることが判明しました
カーネルが使用しているメモリ量と、可能であれば、どのカーネルモジュールが使用しているのかを確認する一般的な方法はありますか?
例:
free -hは私にこれを見せていました:
total used free shared buff/cache available
Mem: 31G 19G 1.8G 406M 10G 5.2G
Swap: 8.0G 0B 8.0G
したがって、19GBが使用されています。しかし、TOPは約8GBの使用済みメモリのみを表示しました。そこで、他の11GBを探しに行きました。 6GBは/proc/memstat
およびnmon
で見ることができるスラブであることが判明しました。ただし、5GBはまだ不足しています。
最終的に、ZFSのARCによって消費されていたことがわかりました。しかし、それは独自の特別な情報ファイルにのみリストされていました。 /proc/spl/kstat/zfs/arcstats
/proc/memstat
もtop
、htop
、nmon
、free
、またはatop
のいずれも、これらの5GBを使用しているユーザーを教えてくれません。
そのようなspecialモジュールによって使用されるメモリを確認するためのファイル/ツールはありますか?または、これを通知できる監視ツールを作成する場合、既存のすべてのモジュールを考慮する必要がありますか?
私の観点からは、Linuxでのメモリ情報は完全に混乱しています。すべてが合計メモリに加算されない数十の数。 free
は、合計からfree/cache/buffersを差し引くことで「使用中」パラメーターを計算します。
私が見ることができるツール/情報を持っている/書きたい
Total memory: 32GB
in use: 19GB
processes: 8GB
slab: 5GB
mapper: 1Gb
kernel modules: 5Gb
kernel: 0.3GB
spl: 4.7GB
cache: 6GB
buffers: 2GB
free: 5GB
Additional stats:
Active memory: 8.3GB
Active(anon): 7.1GB
Active(file): 1.2GB
Inactive memory: 2.4GB
...
各サブセクションが実際に親セクションに追加され、メモリの各バイトが考慮される場所を知っています;)
だから、そのようなツールはLinuxの下で可能ですか?すでに存在しますか?
アップデート1
以下に推奨するツールsmemは、実際にはメモリの100%に達し、ARCを占める列「動的カーネルメモリ」を示しています。 ただし、この答え
ところで:私はすでにsmemソースをチェックしました、それは基本的に行います(memtotal-ユーザースペース-無料-キャッシュ)。
したがって、これは単に/ proc/memstatからすべての既知の数値を減算し、missingを「noncache Dynamic Kernel Memory」としてラベル付けすることによってのみ達成されます。そして、Linuxカーネルがそれ以上のものを提供することを本当に願っています。
あなたが探しているものの少なくともかなりの部分に対してsmem
を試すかもしれません。
ユニバースリポジトリにあり、Sudo apt-get install smem
でインストールできます。
マニュアルページman smem
で説明されている便利なスイッチがいくつかあります
いくつかの例を次に示します。注簡潔にするため、すべての例で合計に-tスイッチを使用しています。より詳細な出力が必要な場合は、省略できます。
PSS is the interesting column in these examples as it takes shared memory into account.
Unlike RSS it's meaningful to add it up.
システム全体
me@zippy-64bit:~$ smem -tw
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 989656 860076 129580
userspace memory 936032 180020 756012
free memory 5692716 5692716 0
----------------------------------------------------------
7618404 6732812 885592
ユーザー別
me@zippy-64bit:~$ smem -tu
User Count Swap USS PSS RSS
me 67 0 861452 898915 1245592
---------------------------------------------------
67 0 861452 898915 1245592
また、 smemcap は将来の分析のためにsmem
でデータをキャプチャするためのものであり、 smemstat は共有メモリを考慮した物理メモリ使用量を報告します。このツールは、メモリ使用量の現在のスナップショットを報告するか、メモリの変更を定期的にダンプします。
類似パッケージ のページの下部にもリストがあります。
ソース:
代替1:cat /proc/meminfo
の出力を解析することを検討するか、ページless /proc/meminfo
で出力したい場合
ここでの情報の多くは、free
、top
、およびps
コマンドで使用されます。実際、freeコマンドの出力は、/ proc/meminfoの内容と構造に外観が似ています。しかし、/ proc/meminfoを直接見ると、次のような詳細が明らかになります。
$ cat /proc/meminfo | grep "Slab"
Slab: 267680 kB
代替ソース: https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-proc-topfiles.html
代替案2:カーネルRAMのより良い解析に真剣に取り組んでいるなら、 独自のkstatを実行してください。 while kstat
はSolaris専用のコマンドのようです。上記のリンクを使用すると、2013年に最後に変更されたkstat
でのオープンソースの試みのソースに移動できます(この編集時点)。賢明なCプログラマーは、特定の目的のためにコードを変更できます。
代替案2 ソース: