SNMP 内存值与“free”不匹配

SNMP 内存值与“free”不匹配

比较一下

# 免费 -m
             已使用的、可用的、缓存的共享缓冲区总数
内存:72363 68035 4328 0 522 66294
-/+ 缓冲区/缓存:1218 71145
交换:12291 0 12291

和这个:

# snmpwalk -c public -v 2c 本地主机 .1.3.6.1.4.1.2021.4
UCD-SNMP-MIB::memIndex.0 = 整数: 0
UCD-SNMP-MIB::memErrorName.0 = 字符串:交换
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 = 字符串:

为什么 free 显示“cache”为 66294MB,而 snmp 显示“memCached”为 44238MB?难道不应该一样吗?

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

目标是通过 snmp 找出真正可用的物理内存(即这里所示的 71145 free)。


更多信息

# 猫/proc/meminfo
内存总量:74100516 kB
可用内存:4422092 kB
缓冲区:542168 kB
缓存:44239460 kB
交换缓存:4 kB
活动:16455504 kB
不活动:28707308 kB
交换总量:12586888 kB
可用交换空间:12586784 kB
脏:2536 kB
回写:0 kB
匿名页面:381088 kB
映射:252132 kB
板坯:23961488 kB
可回收:23648768 kB
取消回收:312720 kB
页表:7812 kB
NFS_不稳定:0 kB
跳出率:0 kB
回写时间:0 kB
提交限制:49637144 kB
已承诺的 AS:4 kB
Vmalloc总计:34359738367 kB
已使用 Vmalloc:264124 kB
VmallocChunk:34359474191 kB
大页面总数:0
HugePages_Free:0
HugePages_Rsvd:0
HugePages_Surp:0
大页面大小:2048 kB
DirectMap4k:7936 kB
DirectMap2M:75481088 kB

答案1

来自的手册页free(1)

缓存 页缓存和 slab 使用的内存(/proc/meminfo 中的 Cached 和 Slab)

free包括缓存中的 slab 分配;UCD-SNMP-MIB 不包括。如果添加 slab 分配,则可获得:

UCD-SNMP-MIB::memCached.0 + slab = 44238560 + 23961488
                                 = 68200048 KB

free这与报告的结果 (67885056 KB)更加接近。


至于获取真正的可用物理内存,您可以使用此 MIB 做的最好的事情就是获得一个粗略的估计:

totFree = memAvailReal.0 + memBuffer.0 + memCached.0
        = 4429580        + 534804      + 44238560
        = 49202944 KB

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

请注意,HOST-RESOURCES-MIB 并没有什么改进;参见我的答案在 Stack Overflow 上有一个类似的问题。


较新的内核实际上提供了更好的衡量标准。再次引用free(1)手册页:

可用的

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

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

相关内容