Ubuntu Linux:进程交换内存和内存使用情况

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' 的格式参数“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 字段相加并获取 报告的值usedfree造成这种情况的原因有很多,但我将列举几个最重要的原因。

  • 当一个进程分叉时,父进程和子进程都会显示相同的 RSS。但是 Linux 采用写时复制,因此两个进程实际上都在使用相同的内存。只有当其中一个进程修改内存时,它才会真正被复制。
    这将导致该free数字小于topRSS 总和。

  • RSS 值不包括共享内存。由于共享内存不属于任何一个进程,因此top不将其包含在 RSS 中。
    这将导致该free数字大于topRSS 总和。

答案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/

相关内容