我有一台 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
表示将驻留集大小添加到输出中。