Swap触发机制是什么?
我已经找到答案了,
http://unix.stackexchange.com/questions/134202/when-is-swap-triggered-or-how-to-calculate-swap-tendency
-------Update-------------
声明:本人只写过点Python,对内核只是知道……(我读书少,不要骗我)
在内核的mm/vmpressure.c的第111行中的reclaim/scanned参数是怎么来?
如何从/proc中获得参数以便进行监控和计算?
static enum vmpressure_levels vmpressure_calc_level(unsigned long scanned,
unsigned long reclaimed)
{
unsigned long scale = scanned + reclaimed;
unsigned long pressure;
/*
* We calculate the ratio (in percents) of how many pages were
* scanned vs. reclaimed in a given time frame (window). Note that
* time is in VM reclaimer's "ticks", i.e. number of pages
* scanned. This makes it possible to set desired reaction time
* and serves as a ratelimit.
*/
pressure = scale - (reclaimed * scale / scanned);
pressure = pressure * 100 / scale;
pr_debug("%s: %3lu (s: %lu r: %lu)\n", __func__, pressure,
scanned, reclaimed);
return vmpressure_level(pressure);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
单就你提到的这个源文件做一个简单分析,可能也不是最终的结果,希望能促进这个问题的解答。
(我书也读的少,不敢骗你,怕被拆穿)
1.你提到的
vmpressure_calc_level
这个函数是在139行函数vmpressure_event
中调用,而这两个参数在这里是直接传进去的。2.
vmpressure_event
在162行函数vmpressure_work_fn
中调用。这两个参数是该函数中产出的。3.分析代码发现这连个参数是结构体
struct vmpressure *vmpr
的两个子成员的值(180和181行可以看到)。这个结构是work_to_vmpressure(work);
这个函数返回的。4.继续回到函数
vmpressure_work_fn
,这个函数是在函数vmpressure_init
中被调用或者注册(363行)。如果
INIT_WORK(&vmpr->work, vmpressure_work_fn);
是调用简单,如果是注册也就是供系统事件调用。到这里基本就分析清楚了。
函数
vmpressure_init
调用了函数vmpressure_work_fn
,看355和356行这个注释:这时候应该就明白这个函数什么时候会被调用了,在每次分配vmpressure结构的时候都会调用。
针对你提的问题总结一下:
每次生成vmpressure结构的时候(此时也就是内存变更吧,猜的)都会调用
vmpressure_init
,这就是触发的开始。vmpressure_init
这个函数调用vmpressure_work_fn
,vmpressure_work_fn
中调用work_to_vmpressure
返回一个vmpressure
结构体这个结构体中有你要的那两个参数,也就是reclaim和scanned(见上面的3)。我想关于参数的问题应该就算基本明白了。再往下探究就看高手了。
你写个脚本不就可以了?用shell可以,用python肯定也没问题的嘛,你会python我就不细说了。不会的话,其他人愿意了帮你写一个吧。