在Linux的"free"命令的输出中,有一项是"available"(对应"/proc/meminfo"中的"MemAvailable"),它是对启动一个新应用的“可使用内存”的一个估算。在一次实验中,我偶然发现了它出现的变化。
这篇文章介绍过"watermark_scale_factor",它的默认值是10,当我把它调到1000时,除了"available"这一项产生了巨大的变化,其他几项的数据一点变化都没有:

真的是由于设置watermark的参数引起的吗?我试着把它改回去:

看来还真是,但这是为什么呢?这得从"available"内存的计算方法说起,其对应的函数实现是si_mem_available():
long si_mem_available(void){
// lowmem reserve
available = global_zone_page_state(NR_FREE_PAGES) - totalreserve_pages;
// zone watermark
for_each_zone(zone)
wmark_low += low_wmark_pages(zone);
// page cache
pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];
pagecache -= min(pagecache / 2, wmark_low);
available += pagecache;
reclaimable = global_node_page_state(NR_SLAB_RECLAIMABLE) +
global_node_page_state(NR_KERNEL_MISC_RECLAIMABLE);
available += reclaimable - min(reclaimable / 2, wmark_low);return available;
}
文章转载自术道经纬,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




