我的 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
答案1
Linux 虚拟内存系统并不是那么简单。您不能只是将所有 RSS 字段相加并获取 报告的值used
。free
造成这种情况的原因有很多,但我将列举几个最重要的原因。
当一个进程分叉时,父进程和子进程都会显示相同的 RSS。但是 Linux 采用写时复制,因此两个进程实际上都在使用相同的内存。只有当其中一个进程修改内存时,它才会真正被复制。
这将导致该free
数字小于top
RSS 总和。RSS 值不包括共享内存。由于共享内存不属于任何一个进程,因此
top
不将其包含在 RSS 中。
这将导致该free
数字大于top
RSS 总和。
答案2
我认为,就总内存使用情况而言,您最好相信“free”的输出,而对于单个进程正在使用的内存量的大致了解,则最好相信“ps”。
仅仅因为“ps”RSS 值的总和不等于“free”,并不会阻止您按 RSS 对进程进行排序并评估要终止的最大进程。
话虽如此,如果您所有的努力只是为了确保机器可以休眠,那么创建更多的交换(如果需要,以磁盘上的文件的形式)可能是更容易的途径。
答案3
我终于找到了问题的答案。有一个名为 smem 的程序(在 Ubuntu/Debian 上apt install smem
)可让您分别列出交换和已用内存。
这里列出了几种不同的上市交换方式:https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/。