reclaim 开源技术分享:Linux 内核参数 swappiness细解( 二 )


/*
*防止取料机落入缓存陷阱,如下所示
*缓存页面从非活动状态开始,每一个缓存故障都会提示
*文件LRU扫描平衡。根据LRU的档案
*收缩,用于参照旋转的窗口也会收缩。
*这意味着我们有一个失控的反馈回路
*痛打文件LRU变得比
*匿名页面。尝试根据文件LRU大小来检测这一点。
*/
if(global _ recovery(sc)){
无符号长pgdatfile
无符号长pgdatfree
int z;
无符号long total _ high _ wmark = 0;
pgdatfree = sum _ zone _ node _ page _ state(pgdat-& gt;node_id,NR _ FRee _ PAGES);
pgdatfile = node _ page _ state(pgdat,NR_ACTIVE_FILE) +
node_page_state(pgdat,NR _ INACTIVE _ FILE);
for(z = 0;z &lt。MAX _ NR _ ZONESz++) {
struct zone * zone = & amppgdat->node _ zones[z];
if(!托管区域(zone))
继续;
total _ high _ wmark+= high _ wmark _ pages(zone);
}
if(不太可能(pgdatfile+pgdatfree & lt;= total_high_wmark)) {
/*
*如果有足够的非活动状态,则强制扫描
*符合条件的区域中LRU的匿名页面。
*否则,小LRU会被痛打。
*/
if(!inactive_list_is_low(lruvec,false,memcg,sc,false )& amp;& amp
lruvec_lru_size(lruvec,LRU_INACTIVE_ANON,sc->;回收(idx)
&gt。&gt。sc-&gt。优先级){
scan _ balance = SCAN _ ANON
转到外部;
}
}
}
当有足够的非活动缓存页时,只释放文件缓存。
/*
*如果有足够的非活动页面缓存,即如果
*非活动列表大于活动列表*和*
*非活动列表实际上有一些页面需要优先扫描,我们
*现在不要从匿名工作集中回收任何东西。
*如果没有第二个条件,我们可能永远不会扫描
* lruvec,即使它有大量旧的匿名页面,除非
*系统压力很大。
*/
if(!inactive_list_is_low(lruvec,true,memcg,sc,false )& amp;& amp
lruvec_lru_size(lruvec,LRU_INACTIVE_FILE,sc->;recover _ idx)>;&gt。sc-&gt。优先级){
scan _ balance = SCAN _ FILE
转到外部;
}
这里要强调的是,swappiness的一般功能在这里开始涉及。是设置anon_prio为对应的swappiness,file_prio为200-anon_prio。
scan _ balance = SCAN _ FRACT
/*
*交换率为100时,匿名和文件具有相同的优先级。
*这个扫描优先级本质上是IO成本的倒数。
*/
anon _ prio = swappiness
file _ prio = 200-anon _ prio;
这里,anon_prio和file_prio进一步用于获取ap和fp
/*
*匿名页面与文件页面上的压力大小成反比
*与最近扫描的页面比例成比例
*最近引用并正在使用的每个列表。
*/
AP = anon _ prio *(recovery _ stat->;最近_扫描[0]+1);
ap /最近_旋转[0]+1;
FP = file _ prio *(recovery _ stat->;最近_扫描[1]+1);
fp /最近_旋转[1]+1;
其他细节或后续算法留待后续分析。
总结
Swappiness控制模式主要在内存不足时(这里是空闲内存低)触发。具体如下:
1.当swappiness为0时,当可用内存足够时,将仅释放文件缓存,当可用内存不足时,将在swap空之间交换一些内存。
2.swappiness不是0,所以它的值主要控制每次内存不足时切换到Swap和释放文件缓存的比例。
【reclaim 开源技术分享:Linux 内核参数 swappiness细解】注意:大多数人误以为控制剩余内存比例到交换值时,就把内存切换到交换,这是错误的。

推荐阅读