web-dev-qa-db-ja.com

Ubuntu Linux:プロセスのスワップメモリ​​とメモリ使用量

私のUbuntuは、タスクマネージャが表示しているよりも多くのメモリを消費します。

Sudo ps -e --format rss  | awk 'BEGIN{c=0} {c+=$1} END{print c/1024}'
2750.29

free -m

             total       used       free     shared    buffers     cached
Mem:          3860       2765       1094          0          3        300
-/+ buffers/cache:       2461       1398
Swap:         2729       2374        354

それは奇妙です。誰かがこの違いを説明できますか?

しかし、もっと重要なことは、プロセスが実際に使用しているメモリの量を知りたいということです。仮想メモリのサイズを知りたくありませんが、常駐メモリとプロセスのスワップを知りたいのです。

また、「ps」のparam "sz"というフォーマットを出力しようとしましたが、これの合計は高すぎます(16000 MB)(param 'size'では36700 MB)。他のオプションはありますか?

私は本当にこれを使用して、どのプログラム/プロセスが多くのメモリを消費している(そしてスワップしている)かを特定し、それらを強制終了したいと思います。

/ proc/meminfoの出力:

MemTotal:        3952812 kB                
MemFree:         1119192 kB
Buffers:            2676 kB
Cached:           290068 kB
SwapCached:       160980 kB
Active:          1805396 kB
Inactive:         731680 kB
Active(anon):    1745820 kB
Inactive(anon):   689184 kB
Active(file):      59576 kB
Inactive(file):    42496 kB
Unevictable:         148 kB
Mlocked:             148 kB
SwapTotal:       2795272 kB
SwapFree:         390900 kB
Dirty:              1984 kB
Writeback:             0 kB
AnonPages:       2085472 kB
Mapped:            67432 kB
Shmem:            190676 kB
Slab:              88012 kB
SReclaimable:      42704 kB
SUnreclaim:        45308 kB
KernelStack:        5496 kB
PageTables:        87860 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     4771676 kB
Committed_AS:    9522364 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      374404 kB
VmallocChunk:   34359330144 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       61440 kB
DirectMap2M:     4030464 kB
14
David Halter

ようやく私の質問に対する答えを得ました。 smemというプログラムがあります(Ubuntu/Debianにはapt install smem)スワップと使用済みメモリを個別に一覧表示できます。

スワップをリストするいくつかの異なる方法がここにあります: https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/

1
David Halter

Linuxの仮想メモリシステムはそれほど単純ではありません。すべてのRSSフィールドを合計して、usedによって報告された値をfreeで取得することはできません。これには多くの理由がありますが、私はいくつかの最大の理由を説明します。

  • プロセスがフォークすると、親と子の両方が同じRSSで表示されます。ただし、Linuxはcopy-on-write両方のプロセスが実際に同じメモリを使用するようにします。プロセスの1つがメモリを変更した場合のみ、実際にメモリが複製されます。したがって、これによりfreeの数値はtop RSSの合計よりも小さくなります。

  • RSS値には、共有メモリは含まれません。共有メモリは1つのプロセスによって所有されていないため、topはRSSにそれを含めません。したがって、これにより、freeの数値がtop RSSの合計よりも大きくなります。

11
Patrick

総メモリ使用量に関しては "free"の出力を信頼し、単一プロセスが使用しているメモリ量の一般的な考えについては "ps"を信頼する方がよいと思います。

"ps" RSS値の合計が "free"と等しくないからといって、RSSでプロセスを並べ替えたり、殺すために最大のものを評価したりすることを妨げるものではありません。

とはいえ、マシンが休止状態にできるようにするためだけの努力をしているのであれば、(必要に応じて、ディスク上のファイルの形式で)より多くのスワップを作成する方が簡単です。

1
datn