在尝试设置nofile
有关我的用户(当然具有sudo
特权)的硬限制和软限制时,我注意到一种奇怪的行为。
我的整体系统限制是 2^22,即使将其设置为 2^23 后,我也尝试执行以下操作。
我成功地将软限制和硬限制完美地设置为 2^20,没有任何问题。 (这意味着在我使用它们进行采样后,ulimit -Sn,and -Hn
我得到了我刚刚设置的值)。
当我将它们设置为 2^21 或更高时,在重新登录用户(为了应用更改)后,硬限制和软限制都分别减少到 4096 和 1024 。
我在网上找不到任何关于它的信息,我怀疑它与用于存储这些值的变量的类型有关(我个人预计它约为 2^32 甚至 2^33如果它们被定义为uint
,但绝对不是这种情况)。
答案1
似乎有两个系统范围的限制,记录在文档/sysctl/fs.txt
fs.file-max
是整个系统上打开的文件(文件句柄)的最大数量。fs.nr_open
是每个进程打开文件数的全局上限,它限制了 的值RLIMIT_NOFILE
,这是所ulimit -n
设置的。不出所料,默认值为 1024*1024,即 2^20。
所以:
# sysctl fs.nr_open
fs.nr_open = 1048576
# ulimit -Hn 1048577
-su: ulimit: open files: cannot modify limit: Operation not permitted
# sysctl fs.nr_open=$[ 2**22 ]
fs.nr_open = 4194304
# ulimit -Hn 4000000 # now it can be set
但file-max
似乎并没有阻止设置每个进程的限制,我一直这样设置:
# sysctl fs.file-max
fs.file-max = 262144
因此,无论设置什么限制(pam_limits.so
?),由于 sysctl 设置的限制,它可能会获取并忽略系统调用上的错误。或者它可能会在某处记录错误,请检查您的日志。