未显示在缓存中时跟踪 Linux 内存使用情况

Kev*_*sko 5 linux memory-leaks memory top

在你把你的干草叉拿出来之前,我在追踪内存进入 Linux 缓存系统的位置时遇到了麻烦。我看到Linux 吃掉了我的 RAM!,以及如何通过实际内存使用情况查看顶级进程?,并正确确定 Linux 中的内存使用情况,但以这些为例,这些数字与我在系统上看到的数字并不完全相同。

对于这个系统,我知道它可能被“缓存”,或者被程序使用,但这些数字对我来说甚至还没有接近加起来。

在上面我看到了。

top - 09:04:09 up 19 days, 20:38,  2 users,  load average: 0.00, 0.10, 0.11
Tasks: 160 total,   1 running, 159 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  65974296k total, 43507804k used, 22466492k free,   305336k buffers
Swap:  7548924k total,        0k used,  7548924k free,  1480836k cached
Run Code Online (Sandbox Code Playgroud)

我明白了,“使用”的 43GB 内存并不是真的,可能大部分都被缓存了。所以深入研究我跑了:

$ free -m
             total       used       free     shared    buffers     cached
Mem:         64428      38845      25582          0        298       1445
-/+ buffers/cache:      37101      27326
Swap:         7371          0       7371
Run Code Online (Sandbox Code Playgroud)

所以这表明确实使用了 37GB 并且只缓存了 1445MB(这是我期望看到 1445 类似于 20000 的地方)。我上面链接的网站显示“缓存”列通常很高。因此,我进一步挖掘并执行以下操作以检查正在使用内存的应用程序。

    sudo smem -t
      PID User     Command                         Swap      USS      PSS      RSS
9468
    21475 root     python /usr/bin/smem -t            0     6212     6234     6984
     2431 root     /opt/OV/lbin/perf/coda             0     7156     8060    12068
     2213 root     /opt/perf/bin/perfd                0    19056    19485    22032
    20849 root     /opt/shiny-server/ext/node/        0    77244    77321    78616
    21325 atpa     /usr/lib64/R/bin/exec/R --n        0  3729836  3733774  3739520
    21287 atpa     /usr/lib64/R/bin/exec/R --n        0  4060136  4064074  4069820
    -------------------------------------------------------------------------------
       63 11     

                                     0  7947984  7970344  8054032
Run Code Online (Sandbox Code Playgroud)

所以 R 的两个应用程序使用了 ~8GB 的​​内存。

我上面链接的其他文章表明 Linux 正在“保留”内存并将其保存在缓存中(例如,free -m 显示缓存在“Mem:”行上的价值很高),而在我的情况下,它似乎实际上正在使用中但实际上似乎没有应用程序报告内存的使用情况,而且我似乎无法追踪 Linux 使用(缓存/保留?)内存的位置。

这段记忆去哪儿了?我假设 Linux 正在使用它,但我无法确定它的使用位置。

/proc/meminfo 显示

MemTotal:       65974296 kB
MemFree:        24191624 kB
Buffers:          305320 kB
Cached:          1480760 kB
SwapCached:            0 kB
Active:          7769776 kB
Inactive:         215532 kB
Active(anon):    6199392 kB
Inactive(anon):      476 kB
Active(file):    1570384 kB
Inactive(file):   215056 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       7548924 kB
SwapFree:        7548924 kB
Dirty:               116 kB
Writeback:             0 kB
AnonPages:       6172696 kB
Mapped:            47400 kB
Shmem:               652 kB
Slab:             255468 kB
SReclaimable:     225620 kB
SUnreclaim:        29848 kB
KernelStack:        1736 kB
PageTables:        18780 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    40536072 kB
Committed_AS:    6455352 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      247288 kB
VmallocChunk:   34359487760 kB
HardwareCorrupted:     0 kB
AnonHugePages:   2586624 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10240 kB
DirectMap2M:    67098624 kB
Run Code Online (Sandbox Code Playgroud)

Kev*_*sko 3

我想我找到了我的问题...

我的问题似乎是 VMware 的内存膨胀系统。基本上,这是主机系统向来宾操作系统施加内存压力的一种方式,当其他主机开始使用大量内存时,会消耗来宾内存分配。

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

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

vmware-toolbox-cmd stat balloon
Run Code Online (Sandbox Code Playgroud)

这将显示膨胀的内存量。

为我

#:vmware-toolbox-cmd stat balloon
32425 MB
Run Code Online (Sandbox Code Playgroud)

其他来源:https://serverfault.com/questions/660080/detect-memory-ballooning-from-within-the-affected-vm

关闭膨胀内存以验证问题

取消内存膨胀:https://serverfault.com/questions/528295/unballooning-ram-thats-been-ballooned-by-vmware