我们通常会使用free命令,来查看当前内存的使用情况,但是其中有一个available值,对其计算方式及代表意义不太清晰,今天来分析下。
查看free命令的定义函数,可知available在代码中代表值为kb_main_available。
通过代码分析,可知kb_main_available的计算及获取,是在meminfo函数中进行的。
分析meminfo函数,可知该值是取自/proc/meminfo中的MemAvailable。
分析内核代码,可知该值是通过si_mem_available函数计算出来的。
下面分析si_mem_available函数。
下面按照图片中标记的段来分析代码的实现。
代码段1:统计各个LRU链表上面的页数目;
代码段2:累加各个zone上面low水位线的数目;
代码段3:available = free_pages - totalreserve;
代码段4:估算可以释放的pagecache占用的内存量,available += pagecache;
代码段5:估值可以回收的slab内存,available += slab_reclaimble;
代码段6:获取可以释放的内核使用内存kernel_reclaimable。
所以availble = free_pages - totalreserve + pagecache + slab_reclaimable + kernel_reclaimable;
该值是对可以使用内存的一个估算值,其中包含了内存回收的动作。