最近一个项目需要统计设备的剩余内存,之前都是用/proc/meminfo里面的MemFree,发现MemFree实际上统计得少了,因为那些可清理的page cache,实际上是可用的内存。于是改成了MemAvailable,但是在另外一个项目发现,MemAvailable竟然比MemFree还少一大截。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | root@XiaoQiang:/tmp# cat /proc/meminfo MemTotal: 246768 kB MemFree: 90588 kB MemAvailable: 53592 kB Buffers: 280 kB Cached: 36572 kB SwapCached: 0 kB Active: 57928 kB Inactive: 26892 kB Active(anon): 51964 kB Inactive(anon): 9860 kB Active(file): 5964 kB Inactive(file): 17032 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 48008 kB Mapped: 22864 kB Shmem: 13884 kB Slab: 22060 kB SReclaimable: 3084 kB SUnreclaim: 18976 kB KernelStack: 1560 kB PageTables: 892 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 123384 kB Committed_AS: 93648 kB VmallocTotal: 1048372 kB VmallocUsed: 0 kB VmallocChunk: 0 kB |
搜索一番发现,MemAvailable表示application可用内存的一个估计,这个值是不准确的。他大概等于free加上可回收的内存减去水线。
Currently, the amount of memory that is available for a new workload, without pushing the system into swap, can be estimated from MemFree, Active(file), Inactive(file), and SReclaimable, as well as the "low" watermarks from /proc/zoneinfo.
原来是设备的水线设置的太高了
root@XiaoQiang:/tmp# cat /proc/sys/vm/min_free_kbytes
32768
将其设置为3000之后,
# echo 3000 > /proc/sys/vm/min_free_kbytes
available就非常多了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | root@XiaoQiang:/tmp# cat /proc/meminfo MemTotal: 246768 kB MemFree: 85148 kB MemAvailable: 105204 kB Buffers: 2228 kB Cached: 39244 kB SwapCached: 0 kB Active: 63480 kB Inactive: 26480 kB Active(anon): 52680 kB Inactive(anon): 9708 kB Active(file): 10800 kB Inactive(file): 16772 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 48512 kB Mapped: 22864 kB Shmem: 13900 kB Slab: 22348 kB SReclaimable: 3232 kB SUnreclaim: 19116 kB KernelStack: 1544 kB PageTables: 892 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 123384 kB Committed_AS: 94472 kB VmallocTotal: 1048372 kB VmallocUsed: 0 kB VmallocChunk: 0 kB |
参考:
https://stackoverflow.com/questions/30869297/difference-between-memfree-and-memavailable
https://unix.stackexchange.com/questions/500400/memavailable-higher-than-expected