Swap触发机制是什么?

发布于 2022-08-29 16:34:07 字数 1310 浏览 9 评论 0

我已经找到答案了,
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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜唯美灬不弃 2022-09-05 16:34:07

单就你提到的这个源文件做一个简单分析,可能也不是最终的结果,希望能促进这个问题的解答。
(我书也读的少,不敢骗你,怕被拆穿)

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行这个注释:

* This function should be called on every allocated vmpressure structure
* before any usage.

这时候应该就明白这个函数什么时候会被调用了,在每次分配vmpressure结构的时候都会调用。

针对你提的问题总结一下:
每次生成vmpressure结构的时候(此时也就是内存变更吧,猜的)都会调用vmpressure_init,这就是触发的开始。
vmpressure_init这个函数调用vmpressure_work_fn,vmpressure_work_fn中调用work_to_vmpressure返回一个vmpressure结构体这个结构体中有你要的那两个参数,也就是reclaim和scanned(见上面的3)。

我想关于参数的问题应该就算基本明白了。再往下探究就看高手了。


如何从/proc中获得参数以便进行监控和计算?

你写个脚本不就可以了?用shell可以,用python肯定也没问题的嘛,你会python我就不细说了。不会的话,其他人愿意了帮你写一个吧。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文