SNMP 内存值与“free”不匹配

Mar*_*rki 4 linux memory-usage net-snmp

比较这个

#免费-m
             缓存的已用空闲共享缓冲区总数
电话:72363 68035 4328 0 522 66294
-/+ 缓冲区/缓存:1218 71145
交换:12291 0 12291

和这个:

# snmpwalk -c public -v 2c localhost .1.3.6.1.4.1.2021.4
UCD-SNMP-MIB::memIndex.0 = 整数:0
UCD-SNMP-MIB::memErrorName.0 = STRING:交换
UCD-SNMP-MIB::memTotalSwap.0 = 整数:12586888 kB
UCD-SNMP-MIB::memAvailSwap.0 = 整数:12586784 kB
UCD-SNMP-MIB::memTotalReal.0 = 整数:74100516 kB
UCD-SNMP-MIB::memAvailReal.0 = 整数:4429580 kB
UCD-SNMP-MIB::memTotalFree.0 = 整数:17016364 kB
UCD-SNMP-MIB::memMinimumSwap.0 = 整数:16000 kB
UCD-SNMP-MIB::memBuffer.0 = 整数:534804 kB
UCD-SNMP-MIB::memCached.0 = 整数:44238560 kB
UCD-SNMP-MIB::memSwapError.0 = INTEGER: noError(0)
UCD-SNMP-MIB::memSwapErrorMsg.0 = 字符串:

为什么免费为“缓存”显示 66294MB 而snmp 为“memCached”显示大约 44238MB?不应该是一样的吗?

查看 MIB,我看到“memCached”是用于缓存的“物理或虚拟”内存。(不要告诉我它会将磁盘缓存放入交换区)^^

目标是free通过snmp找出真正的空闲物理内存(即此处为 71145,如 所示)。


更多信息

# cat /proc/meminfo
内存总量:74100516 kB
MemFree:4422092 KB
缓冲区:542168 kB
缓存:44239460 kB
交换缓存:4 kB
活跃:16455504 kB
非活动:28707308 KB
交换总计:12586888 kB
SwapFree:12586784 kB
脏:2536 KB
写回:0 kB
AnonPages:381088 kB
映射:252132 kB
板块:23961488 KB
SReclaimable:23648768 kB
太阳回收:312720 kB
页表:7812 kB
NFS_不稳定:0 kB
弹跳:0 kB
写回时间:0 kB
提交限制:49637144 kB
Committed_AS:4 kB
Vmalloc 总计:34359738367 kB
Vmalloc 使用:264124 kB
VmallocChunk:34359474191 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
超大页面大小:2048 kB
DirectMap4k:7936 KB
DirectMap2M:75481088 KB

小智 5

从联机帮助页free(1)

缓存 页缓存和平板使用的内存(/proc/meminfo 中的缓存和平板)

free包括缓存中的slab分配;UCD-SNMP-MIB 没有。如果添加slab分配,你会得到:

UCD-SNMP-MIB::memCached.0 + slab = 44238560 + 23961488
                                 = 68200048 KB
Run Code Online (Sandbox Code Playgroud)

这更接近于free报告的内容 (67885056 KB)。


至于获得真正的空闲物理内存,你可以用这个 MIB 做的最好的事情是粗略估计:

totFree = memAvailReal.0 + memBuffer.0 + memCached.0
        = 4429580        + 534804      + 44238560
        = 49202944 KB
Run Code Online (Sandbox Code Playgroud)

这仍然明显低于报告的 free + buffers/cache 的值free

请注意,HOST-RESOURCES-MIB 也好不到哪里去;请参阅在 Stack Overflow 上对类似问题的回答


较新的内核实际上为此提供了更好的指标。再次从free(1)联机帮助页:

可用的

估计有多少内存可用于启动新应用程序,无需交换。与 cache 或 free 字段提供的数据不同,该字段考虑了页面缓存,并且由于项目正在使用,并非所有可回收的内存块都将被回收(/proc/meminfo 中的 MemAvailable,在内核 3.14 上可用,在内核 2.6.27+,否则与免费相同)

该值将低于 free + buffers/cache 的总数,并且可以更好地衡量可用内存,但我在您的中没有看到它,/proc/meminfo也没有找到使用它的 MIB。