redis - linux 资源限制,软限制可以超出硬限制么?
迷茫
迷茫 2017-04-17 11:38:39
[Linux讨论组]
while(f > oldlimit) {
            int decr_step = 16;

            limit.rlim_cur = f;
            limit.rlim_max = f;
            if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break;
            setrlimit_error = errno;

            /* We failed to set file limit to 'f'. Try with a
             * smaller limit decrementing by a few FDs per iteration. */
            if (f < decr_step) break;
            f -= decr_step;
        }

网上说软限制不能超出硬限制,为什么不直接把软限制改成和硬限制一样大呢,如上代码(redis源码)还尝试什么?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
天蓬老师

我猜是因为 Redis 不想检查自己有没有更改 rlim_max 的权限,所以直接尝试好了。如果直接把软限制改成和硬限制一样大,那还要判断,如果 maxfiles > rlim_max,自己能不能把 rlim_max 改大,如果不能,再设置 rlim_cur 为 rlim_max。检查和设置之间还有竞态。

PHP中文网

为什么不直接开到最大在这段代码上面就有解释

            /* Try to set the file limit to match 'maxfiles' or at least
             * to the higher value supported less than maxfiles. */

redis所要做的并不是把自己所能打开的fd数量开到最大,而是把它设置到maxfiles。如果设置不到maxfiles,就尽可能达到这个数值。

但是不直接尝试min(硬限制, maxfiles) 这件事我估计是因为考虑到在一些情况下(比如root),软硬限制都是可以改的。
但是,就算这样应该if两次就好了啊,掀桌~。然后可能作者脑洞大开觉得先试试maxfiles行不行,如果不行再调整软上限到硬上线这样太蛋疼,然后就写出了这种代码也有可能吧。。
当然,是不是有可能考虑到在很猎奇的情况(我不知道这是什么情况,比如被人用ptrace卡系统调用了?再比如get之后、set之前被别的进程改了上限?虽然不知道什么时候会发生,但是考虑了总没错吧)下,导致软上限到不了当前硬上线,为了在这个基础下尽可能的抬高软上限而这么做……who knows。。

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

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