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


14

我的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

我应该指出,“ 1043.84”与“ 1178”相距不远,这是您在执行此计算时要获得的数字。
cjc 2012年

我在unix.stackexchange(+1)上确实有相同的问题。帕特里克吹我的脑海里有太多:P-- unix.stackexchange.com/questions/34795/...
GoldenNewby

Answers:


10

linux虚拟内存系统并不是那么简单。你不能只是添加了所有的RSS领域,并获得价值报告used通过free。造成这种情况的原因很多,但我将介绍其中的几个最大原因。

  • 进程分叉时,父级和子级都将显示相同的RSS。但是linux采用了copy-on-write这样的方式,以便两个进程实际上都使用相同的内存。仅当其中一个进程修改了内存时,才会实际复制它。因此,这将导致该free数字小于topRSS总和。

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


哦谢谢!我一直认为,free -m显示整个系统的实际共享内存总和。但是正如“ man ps”指出的那样:“共享内存列应该被忽略;它已经过时了。”
David Halter 2012年

抱歉,我不能接受此答案,因为它不能解决交换问题,但是还是谢谢您!
David Halter 2012年

@DavidHalter什么交换问题?我提供的信息适用于所有内存,包括交换。
Patrick

共享内存不是真的很大吗?至少那是我在任务管理器中看到的。但是我的交换非常频繁地使用:1035 MB; PS的总和为1 GB,而swap + rss的总和为> 2 GB。我想查看一个进程真正使用了多少内存,而不仅仅是rss。更有趣的是一个进程正在使用多少交换内存。
David Halter 2012年

1
@DavidHalter如果要查看某个进程正在使用多少内存(包括共享内存),请查看“ VSZ”列。
Patrick

1

我认为,就总的内存使用量而言,最好不要相信“ free”的输出,而最好还是相信“ ps”来了解单个进程正在使用多少内存。

仅仅因为“ ps” RSS值的总和不等于“免费”,并不妨碍您通过RSS对进程进行排序并评估最大的进程以供查杀。

话虽这么说,如果您全力以赴确保机器可以休眠,那么创建更多的交换(如果需要,以磁盘上的文件形式)可能是更容易的选择。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.