最近一个项目需要统计设备的剩余内存,之前都是用/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/meminfoMemTotal: 246768 kBMemFree: 90588 kBMemAvailable: 53592 kBBuffers: 280 kBCached: 36572 kBSwapCached: 0 kBActive: 57928 kBInactive: 26892 kBActive(anon): 51964 kBInactive(anon): 9860 kBActive(file): 5964 kBInactive(file): 17032 kBUnevictable: 0 kBMlocked: 0 kBSwapTotal: 0 kBSwapFree: 0 kBDirty: 0 kBWriteback: 0 kBAnonPages: 48008 kBMapped: 22864 kBShmem: 13884 kBSlab: 22060 kBSReclaimable: 3084 kBSUnreclaim: 18976 kBKernelStack: 1560 kBPageTables: 892 kBNFS_Unstable: 0 kBBounce: 0 kBWritebackTmp: 0 kBCommitLimit: 123384 kBCommitted_AS: 93648 kBVmallocTotal: 1048372 kBVmallocUsed: 0 kBVmallocChunk: 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/meminfoMemTotal: 246768 kBMemFree: 85148 kBMemAvailable: 105204 kBBuffers: 2228 kBCached: 39244 kBSwapCached: 0 kBActive: 63480 kBInactive: 26480 kBActive(anon): 52680 kBInactive(anon): 9708 kBActive(file): 10800 kBInactive(file): 16772 kBUnevictable: 0 kBMlocked: 0 kBSwapTotal: 0 kBSwapFree: 0 kBDirty: 0 kBWriteback: 0 kBAnonPages: 48512 kBMapped: 22864 kBShmem: 13900 kBSlab: 22348 kBSReclaimable: 3232 kBSUnreclaim: 19116 kBKernelStack: 1544 kBPageTables: 892 kBNFS_Unstable: 0 kBBounce: 0 kBWritebackTmp: 0 kBCommitLimit: 123384 kBCommitted_AS: 94472 kBVmallocTotal: 1048372 kBVmallocUsed: 0 kBVmallocChunk: 0 kB |
参考:
https://stackoverflow.com/questions/30869297/difference-between-memfree-and-memavailable
https://unix.stackexchange.com/questions/500400/memavailable-higher-than-expected