修复 ulimit:打开文件:无法修改限制:不允许操作

Ole*_*nge 15 linux file-descriptors limit ulimit

我在不同的 GNU/Linux 安装上对此进行了测试:

perl -e 'while(1){open($a{$b++}, "<" ,"/dev/null") or die $b;print " $b"}'
Run Code Online (Sandbox Code Playgroud)

系统 A 和 D

我遇到的第一个限制是 1024。通过将其放入 /etc/security/limits.conf 可以轻松提高:

*                hard    nofile          1048576
Run Code Online (Sandbox Code Playgroud)

然后运行:

ulimit -n 1048576
echo 99999999 | sudo tee /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)

现在测试转到 1048576。

但是,似乎我无法将其提高到 1048576 以上。如果我将 1048577 放在limits.conf 中,它就会被忽略。

这是什么原因造成的?

系统B

在系统 BI 上甚至无法到达 1048576:

echo 99999999 | sudo tee /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)

/etc/security/limits.conf:

*                hard    nofile          1048576
Run Code Online (Sandbox Code Playgroud)

在这里我得到:

$ ulimit -n 65537
bash: ulimit: open files: cannot modify limit: Operation not permitted
$ ulimit -n 65536
#OK
Run Code Online (Sandbox Code Playgroud)

那个限制是从哪里来的?

系统C

该系统在limits.conf 中还有1048576 的限制,在/proc/sys/fs/file-max 中有99999999 的限制。

但这里的限制是 4096:

$ ulimit -n 4097
-bash: ulimit: open files: cannot modify limit: Operation not permitted
$ ulimit -n 4096
# OK
Run Code Online (Sandbox Code Playgroud)

我如何将其提高到(至少)1048576?

(自我提醒:不要做:echo 18446744073709551616 | sudo tee /proc/sys/fs/file-max

Ole*_*nge 11

检查/etc/ssh/sshd_config包含:

UsePAM=yes
Run Code Online (Sandbox Code Playgroud)

其中/etc/pam.d/sshd包含:

session    required   pam_limits.so
Run Code Online (Sandbox Code Playgroud)

在下面的评论中 @venimus 指出 1M 限制是硬编码的:

内核 2.6.x 源代码声明 ./fs/file.c:30:int sysctl_nr_open __read_mostly = 1024*1024; 这是 1048676

1048576 是每个进程。因此,通过多个进程可以克服这个限制。

  • 如果这确实是您自己问题的解决方案,我认为最好在问题和上述解决方案之间建立更多联系。 (6认同)
  • 回复:1048576(= 2^10 * 2^10 = 1024^2,供参考)。这里的答案可能有一些相关信息:/sf/answers/84914861/ (2认同)
  • ssh 跟它有什么关系? (2认同)