我试图尽可能准确地计算系统在任何给定时间使用的内存量。我想如果我从 MemTotal 中减去 MemAvailable 并将差值除以 1024 以从 kB 转换为 MiB,就可以得到当前正在使用的 ram 总量。根据我运行脚本时 /proc/meminfo 的以下输出,输出为1905.27 MiB
.但是,free -m 和 top 都报告内存用作1154 MiB
.我错过了什么吗?为什么我的输出不同?我的方法不是计算正在使用的总内存的正确方法吗?
/proc/meminfo 的输出:
MemTotal: 16093472 kB
MemFree: 11284772 kB
MemAvailable: 14142472 kB
Buffers: 256672 kB
Cached: 3217852 kB
SwapCached: 0 kB
Active: 1721676 kB
Inactive: 2375840 kB
Active(anon): 3928 kB
Inactive(anon): 1057160 kB
输出来自free -m
:
total used free shared buff/cache available
Mem: 15716 1154 11014 428 3547 13803
Swap: 2047 0 2047
脚本片段:
mem_avail() {
awk 'FNR == 3 {printf "%lu", $2}' "/proc/meminfo"
}
mem_total() {
awk 'FNR == 1 {printf "%lu", $2}' "/proc/meminfo"
}
mem_used() {
echo "| $((($(mem_total)-$(mem_avail))/1024)) MiB"
}
我的输出基于 /proc/meminfo 中的值:1905.27 MiB
答案1
鉴于您声明的目的:
我所说的已用内存是指不再可供任何东西使用的内存,因为它当前已分配在其他地方。所以我的机器上有 16GB 或 RAM,这个脚本的想法是它在我的状态栏上显示当前使用的内存量,作为视觉提醒并警告我即将接近 16GB 总量。
我认为你的计算符合你的意图。MemAvailable
测量可以在短时间内提供多少内存(请参阅“free -m”命令中“available”字段的含义了解详情),因此 和 之间的差异MemTotal
衡量了有多少内存不可用。
您可能会考虑MemAvailable
直接使用,并跟踪它有多接近 0,而不是跟踪您的值有多接近 16GiB — 这样您就不需要任何心理体操或了解安装的内存量。
man free
详细解释了用于确定显示值的计算。