首页 > linux 资源限制,软限制可以超出硬限制么?

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源码)还尝试什么?


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


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

            /* 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。。

【热门文章】
【热门文章】