Linuxでの「不足している」メモリ使用量の追跡


10

Arch 3.6.7 x86_64カーネルでは、システムのメモリ使用量を計算しようとしています。これを見ると、穴が空いているように見えます(使用済みメモリの計算では、の使用法)。

これは、新しく起動したシステムです。systemdとsshd以外はあまり実行せず、シンプルに保つ

$ ps aux | sort -n -k6
...
root       316  0.0  0.0   7884   812 tty1     Ss+  14:37   0:00 /sbin/agetty --noclear tty1 38400
matt       682  0.0  0.0  24528   820 pts/0    S+   15:09   0:00 sort -n -k6
dbus       309  0.0  0.0  17280  1284 ?        Ss   14:37   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
matt       681  0.0  0.0  10808  1364 pts/0    R+   15:09   0:00 ps aux
root       308  0.0  0.0  26060  1516 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-logind
root       148  0.0  0.0  25972  1692 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-udevd
matt       451  0.0  0.0  78180  2008 ?        S    14:37   0:00 sshd: matt@pts/0
root       288  0.0  0.0  39612  2708 ?        Ss   14:37   0:00 /usr/sbin/sshd -D
matt       452  0.0  0.0  16452  3248 pts/0    Ss   14:37   0:00 -bash
root         1  0.0  0.0  32572  3268 ?        Ss   14:37   0:00 /sbin/init
root       299  0.0  0.0  69352  3604 ?        Ss   14:37   0:00 /usr/sbin/syslog-ng -F
root       449  0.0  0.0  78040  3800 ?        Ss   14:37   0:00 sshd: matt [priv]
root       161  0.0  0.0 358384  9656 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-journald

私は見つけることができる最も詳細なメモリ情報があり、これは、プロセスを占め、一般的なカーネルへのPSSフィールドの追加をもたらしてきたように見えますが、そのPythonのコードは古いカーネル用であり、残念なことには/ proc / K *ファイルのいくつかは2007年からそれ以来姿を消した。/ procの/ meminfoのドキュメントも便利ですが、あまりにも少し老朽化。

だから、私が見ているもののデモンストレーション。

# cat /proc/meminfo
MemTotal:       16345780 kB
MemFree:        16129940 kB
Buffers:           10360 kB
Cached:            48444 kB
SwapCached:            0 kB
Active:            24108 kB
Inactive:          46724 kB
Active(anon):      12104 kB
Inactive(anon):     3616 kB
Active(file):      12004 kB
Inactive(file):    43108 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         11996 kB
Mapped:            16372 kB
Shmem:              3696 kB
Slab:              25092 kB
SReclaimable:      11716 kB
SUnreclaim:        13376 kB
KernelStack:         928 kB
PageTables:         2428 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172888 kB
Committed_AS:      34304 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      372788 kB
VmallocChunk:   34359362043 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

中古品を合算すると:

MemTotal - MemFree - Buffers - Cached = Used
16345780 - 16129940 - 10360 - 48444 = 157036

すべてのActive * / Inactive *は一部のページ(すべてではない)に適用されるカウンターのように見えるため、他の場所でカウントされるものと重複する可能性があります。

Active + Inactive = Used
46724  + 24108    = 70832 (not quite)

ここでのCommited_ASは、/ proc / * / smapsからのユーザースペースのプライベート/共有メモリ割引共有ファイルの合計に密接に追跡しているようです。PSSも考慮に入れています。(興味がないので、私は32ビットdebian 2.6.32-5-686ではるかに大きなCommited_ASを取得しています)

AnonPages + Mapped + Commited_AS = Userspace?
11996     + 16372  + 34304       = 62672

スラブは/ proc / slabinfoとインラインです

Slab +  Shmem + KernelStack + PageTables = Kernelspace?
25092 + 3696  + 928         + 2428       = 32144

Userspace? + Kernelspace? = Used?
62672      + 32144        = 94816

だから〜63M短い。カーネルとロードされたすべてのモジュールにいくつかのMBが不足していることに私は気付きました。しかし、スラブはたくさんカバーしているようですので、欠けているものがあれば、それが〜60Mbに相当するかどうかはわかりませんか?

63はアクティブ+非アクティブの数値に少し近いですが、それは正しくありません。

だから誰も魔法の数式を知っていますか?そうでなければ、私が見ている数字が正しいものである場合、私が突き刺すことができるメモリ割り当ての灰色の領域は何ですか?

Linuxが私のRAMを食べたようです!通常非難されているよりも少ない部分です=)

編集 Commited_ASは、カーネルがコミットしたものの99.9%をカバーするために必要なメモリ量の推定値なので、実際に割り当てられた数ではありません。AnonPages + Mappedはそのコンポーネントであるため、現在は約100MBの大きな穴が残っています。

User + Kernel
28368 + 32144 = 60512 != 157036

AnonPagesとMappedは主に、PSS / Sharedを考慮に入れて/ proc / [0-9] * / smaps wgenからのanon / mapped情報で追跡します。

予約された領域はすべて、合計メモリから取り出されたチャンクに収まるように見えます。

合計freeメモリは16345032Kbです。
合計システムメモリは16777216Kb
PCIの「穴」ですlspci -v -266520K = 16510696K
予約dmesg 済みのBIOS - 92793K = 16417903K

edit2 この余分なメモリ使用量は、元の元のボックス内で実行されているVMではないことに気付きました/proc/meminfo。それで私は両者の違いを見て回り始めました。最終的に、使用可能な総物理メモリの増加は、使用済みメモリの増加と一致することがわかりました。

phys 16GB used>144508     vm>50692      user>21500      kern>26428      u+ktot>47928
vm   64MB used>24612      vm>31140      user>14956      kern>14440      u+ktot>29396
vm  256MB used>26316      vm>35260      user>14752      kern>14780      u+ktot>29532
vm    1GB used>33644      vm>35224      user>14936      kern>14772      u+ktot>29708
vm    2GB used>41592      vm>35048      user>14736      kern>15056      u+ktot>29792
vm    4GB used>57820      vm>35232      user>14780      kern>14952      u+ktot>29732
vm    8GB used>82932      vm>36912      user>15700      kern>15388      u+ktot>31088
vm   12GB used>110072     vm>35248      user>14812      kern>15624      u+ktot>30436
vm   15GB used>122012     vm>35424      user>14832      kern>15824      u+ktot>30656

これは、1GBのメモリごとに最大8Mbが割り当てられることになります。カーネル内のメモリマップである可能性があります...しかし、起動時にセットアップされるのではなく、メモリが割り当てられると、それだけが大きくなると思いました。

トレンドが続く場合、誰かがbigmemマシンにアクセスできるかどうかを確認するのは興味深いでしょうか?


ps仕様による。メモリアカウンティングには使用しないでください。
バハマート2013

2
乾杯、しかしこれは集計ではありませんps。での全体的な使用方法です/proc/meminfo。唯一のプロセスアカウンティングは、共有メモリとプライベートメモリを考慮するsmapsを介して行われましたが、それはmeminfoからのAnonPages / Mapped値と比較することのみでした。
マット


したがって、実際に私のramを食べるLinuxに関する私の投稿の参照=)
Matt

回答:


3

「プロセスによって使用されるメモリは」ありません最新のオペレーティングシステムにおける明確な概念。測定できるのは、プロセスのアドレススペースのサイズ(SIZE)と常駐セットサイズ(RSS、アドレススペース内の現在のメモリ内のページ数)です。RSSの一部が共有されます(メモリ内のほとんどのプロセスがglibcの1つのコピーを共有するため、他のさまざまな共有ライブラリの場合は、同じ実行可能ファイルを実行している複数のプロセスが共有します。フォークされたプロセスは読み取り専用データを共有し、変更されていない可能性があります親とのデータの読み書き)。一方、ページテーブル、カーネルバッファ、カーネルスタックなど、カーネルがプロセスに使用するメモリは考慮されません。全体像では、グラフィックスカード用に予約されたメモリ、カーネルの使用、およびDOSや他の先史時代のシステム用に予約された各種の「穴」を考慮する必要があります(それは多くはありませんが、

全体像を把握する唯一の方法は、カーネルがそのように報告することです。未知のオーバーラップと未知の除外された数値を合計することは、算術の素晴らしい練習であり、それ以上はありません。


1
「プロセスごとのメモリ」は明確ではありませんが、それが全体的な使用状況の追跡に影響を与える必要がある理由がわかりませんか?カーネルの場合、全体的なPageTables、Slab、KernelStack、およびその他の非プロセスmemカウンターが/ proc / meminfoに報告され、説明しようとしているものに含まれます(プロセスmemもそこにあるようです)。プロセスメモリーが/ proc / meminfoのどこにあるのかを把握するために、非/マッピングされた共有/プライベートメモリのプロセスごとのsmapを調べた全体的なカウンターに加えて。私ははっきりに穴を持っている、物理的なまで追加VM番号のどのセットを目指しています。
マット・

1
基本的にpsは、メモリを正しく説明することができません。したがって、使用しないでください。psそのプロセスがシステムで実行されている唯一のプロセスである場合にのみ、どのレポートが真になります(不可能)。なぜそれを行わないのかについては、psここを読んでください:Linuxでのメモリ使用量の理解
バハマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.