web-dev-qa-db-ja.com

すべてのメモリ使用量を監視する一般的な方法

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/memstattophtopnmonfree、または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カーネルがそれ以上のものを提供することを本当に願っています。

5
Torge

あなたが探しているものの少なくともかなりの部分に対して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で出力したい場合

ここでの情報の多くは、freetop、および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 ソース:

6
Elder Geek