比较一下
# 免费 -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。