linux - Swap触发机制是什么?
大家讲道理
大家讲道理 2017-04-17 11:45:46
[Linux讨论组]

我已经找到答案了,
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);
}

内核代码

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(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行这个注释:

* 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我就不细说了。不会的话,其他人愿意了帮你写一个吧。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号