![当未出现在缓存中时跟踪 Linux 内存使用情况](https://linux22.com/image/12198/%E5%BD%93%E6%9C%AA%E5%87%BA%E7%8E%B0%E5%9C%A8%E7%BC%93%E5%AD%98%E4%B8%AD%E6%97%B6%E8%B7%9F%E8%B8%AA%20Linux%20%E5%86%85%E5%AD%98%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5.png)
在你拿出干草叉之前,我很难追踪内存进入 Linux 缓存系统的位置。我见过Linux 吃掉了我的内存!, 和如何通过实际内存使用情况查看排名靠前的进程?, 和正确确定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
我明白了,“已使用”43GB 内存并不是真的,可能大部分都被缓存了。所以深入研究我跑了:
$ free -m
total used free shared buffers cached
Mem: 64428 38845 25582 0 298 1445
-/+ buffers/cache: 37101 27326
Swap: 7371 0 7371
因此,这表明确实使用了 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
因此 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
答案1
我想我找到了我的问题...
我的问题似乎是 VMware 的内存膨胀系统。基本上,这是主机系统向来宾操作系统施加内存压力的一种方式,当其他主机开始使用大量内存时,会消耗来宾内存分配。
http://www.vfrank.org/2013/09/18/understanding-vmware-ballooning/
如果您使用的是VMware,请运行命令
vmware-toolbox-cmd stat balloon
这将显示膨胀的内存量。
为我
#:vmware-toolbox-cmd stat balloon
32425 MB
其他来源: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