问题描述
我的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’的参数”sz”格式,但是总和很高(16000 MB)(参数’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
最佳办法
linux虚拟内存系统并不是那么简单。您不能仅将所有RSS字段相加并获得free
报告的used
值。造成这种情况的原因很多,但我将介绍其中的几个最大原因。
-
进程分叉时,父级和子级都将显示相同的RSS。但是,Linux使用
copy-on-write
,因此两个进程实际上都使用相同的内存。仅当其中一个进程修改了内存时,它才实际被复制。因此,这将导致free
编号小于top
RSS总和。 -
RSS值不包括共享内存。由于共享内存不属于任何一个进程,因此
top
不在RSS中包含它。因此,这将导致free
编号大于top
RSS总和。
次佳办法
我终于得到了我问题的答案。有一个名为smem的程序(在Ubuntu /Debian apt install smem
上),可让您分别列出交换和已用内存。
可以在此处找到几种不同的列表交换方式:https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/。