我的服务器上出现了一个非常奇怪的问题:总使用的内存超过了所有进程的已用内存总和。并且'更多'是28千兆字节!
服务器有128Gb内存。它可用作KVM虚拟化主机。有几个qemu进程,内存分配总和(-m开关)为116784Mb(116Gb),几乎没有其他进程。
但同时有28Gb的使用交换空间,相当繁忙的交换进/出操作。
我为所有进程内存运行计算,它小于70Gb:
ps aux|awk '{a+=$6}END{print a}'
66432908
VSS约为180Gb:
ps aux|awk '{a+=$5}END{print a}'
180574360
这里/ proc / meminfo:
MemTotal: 131988428 kB
MemFree: 1002468 kB
Buffers: 14172 kB
Cached: 396696 kB
SwapCached: 2566436 kB
Active: 14984848 kB
Inactive: 5634948 kB
Active(anon): 14944552 kB
Inactive(anon): 5592652 kB
Active(file): 40296 kB
Inactive(file): 42296 kB
Unevictable: 428476 kB
Mlocked: 151800 kB
SwapTotal: 41947128 kB
SwapFree: 12291740 kB
Dirty: 16 kB
AnonPages: 18074276 kB
Mapped: 19608 kB
Shmem: 46300 kB
Slab: 4617044 kB
SReclaimable: 3296416 kB
SUnreclaim: 1320628 kB
KernelStack: 6424 kB
PageTables: 209028 kB
CommitLimit: 107941340 kB
Committed_AS: 124320872 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 739544 kB
VmallocChunk: 34358825808 kB
AnonHugePages: 1236992 kB
Hugepagesize: 2048 kB
系统在augfs / tmpfs上运行,但tmpfs使用大约650Mb ......
我迷失了:那些28GB的内存用于什么?
这个问题在我们所有的服务器上发生到一定程度......
答案 0 :(得分:1)
请注意,使用“VSS”进行简单添加会多次计算内存页数。当共享库加载到进程中时,这些库的内存不会在每个进程中重复 - 如果10个进程加载相同的库,则只有1个库的副本物理上在RAM中。你正在总结的VSS数据,报告每个进程的内存,就好像它有自己的库私有副本一样。因此,如果10个进程加载了相同的库,则计算该库的内存10次。
基本上,不可能通过计算'ps'报告的'VSS'数字来总计总内存使用量。要获得远程准确的使用数据,您需要考虑进程使用多少内存与私有共享 - 这些数据在/ proc / $ PID / smaps中可用,但正确解释它很难。
特别是WRT到KVM,除了访客RAM本身,QEMU还使用内存进行其他一些操作。 BIOS ROMS,视频RAM是两个大的,但也有许多用于磁盘/网络上的I / O操作的瞬态分配。如果guest虚拟机的I / O负载很高,这可能会增加超出-m RAM数字的一些重要内存使用量。很难给出一个很好的答案,确切地知道每个RAM以外的客户有什么样的内存开销,所以你需要对它进行监控。如果你看到虚拟机被推送到交换机,它只是一个迹象表明你试图在主机上放置太多虚拟机,我担心。