我的内存都用在哪儿了?

我的内存都用在哪儿了?

我有一台 4 GB 的 HP Microserver,旁边运行着一个非常小的 LXDE 桌面。它主要是 Web 和小型 VM 服务器。它使用的是 Debian 7.2 Stable。

# free -m
             total       used       free     shared    buffers     cached
Mem:          3840       3262        577          0         19        238
-/+ buffers/cache:       3005        834
Swap:         7628         12       7616

我从中得出的结论是,这不是磁盘缓存变大通常会让人感到害怕的问题。如果我强制删除缓存,它只会释放 100 MB 左右的空间,所以我认为这不是问题所在。

我试图找出什么东西使用了这 3 GB。

# cat /proc/meminfo 
MemTotal:        3932292 kB
MemFree:          919468 kB
Buffers:            2356 kB
Cached:            74220 kB
SwapCached:         1932 kB
Active:           201688 kB
Inactive:          44464 kB
Active(anon):     153004 kB
Inactive(anon):    24032 kB
Active(file):      48684 kB
Inactive(file):    20432 kB
Unevictable:          16 kB
Mlocked:              16 kB
SwapTotal:       7812088 kB
SwapFree:        7798840 kB
Dirty:                40 kB
Writeback:             0 kB
AnonPages:        167800 kB
Mapped:           362992 kB
Shmem:              7412 kB
Slab:              43164 kB
SReclaimable:      10728 kB
SUnreclaim:        32436 kB
KernelStack:        3688 kB
PageTables:        14072 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     9778232 kB
Committed_AS:    1364204 kB
VmallocTotal:   34359738367 kB
VmallocUsed:     2580308 kB
VmallocChunk:   34357040804 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      124480 kB
DirectMap2M:     3938304 kB
DirectMap1G:           0 kB

看一下/proc/meminfo,将所有活动/非活动部分加起来只有大约 1GB,还有 2GB 未考虑在内。这也与输出结果完全吻合,top我应该主观地考虑现在系统上运行的程序。

其他一些帖子建议查看Slab:这里的数字,但那只有 43 兆字节。

知道我还应该在哪里寻找这丢失的 2 GB 吗?

答案1

你可以通过这个来查看哪些内容占用了你的内存命令

ps -e -orss=,args= | sort -b -k1,1n

答案2

如果您遇到问题的机器是虚拟机,那么您可能会遇到所谓的“膨胀”现象。基本上,这是主机系统向客户操作系统施加内存压力的一种方式,当其他主机开始使用大量内存时,会消耗客户操作系统的内存分配。

http://www.vfrank.org/2013/09/18/understanding-vmware-ballooning/

如果您使用的是 VMware,请运行命令

vmware-toolbox-cmd stat balloon

这将显示膨胀的内存量。我大胆猜测,这就是您的 2 GB 内存所在的位置,这就是您其他内存使用位置的答案。您的 VM 主机正在使用它。

其他来源:从受影响的虚拟机内部检测内存膨胀

关闭膨胀内存来验证问题。

消除记忆膨胀:“消除”被 VMware 过度膨胀的 RAM

答案3

向@Ereli 致歉

您可以使用此命令查看哪些内容占用了您的内存。

ps krss -e -orss=,args=

其中krss表示按驻留集大小(实际使用内存)排序,-e表示显示所有进程,-orss=,args=表示打印 rss 和命令参数。

产生非常相似的输出的另一种方法,但在(例如)MacOS 上,可能是

ps mexOrss

其中m表示按内存使用情况排序,e表示包含其他人的进程,x表示包含不控制终端的进程,Orss表示将驻留集大小添加到输出中。

相关内容