我在不同的 GNU/Linux 安装上对此进行了测试:
perl -e 'while(1){open($a{$b++}, "<" ,"/dev/null") or die $b;print " $b"}'
系统A和D
我达到的第一个限制是 1024。通过将其放入 /etc/security/limits.conf 可以轻松提高它:
* hard nofile 1048576
然后运行:
ulimit -n 1048576
echo 99999999 | sudo tee /proc/sys/fs/file-max
现在测试已达到 1048576。
但是,似乎我无法将其提高到 1048576 以上。如果我将 1048577 放入 limit.conf 中,它就会被忽略。
是什么原因造成的?
系统B
在系统上 BI 甚至无法到达 1048576:
echo 99999999 | sudo tee /proc/sys/fs/file-max
/etc/security/limits.conf:
* hard nofile 1048576
我在这里得到:
$ ulimit -n 65537
bash: ulimit: open files: cannot modify limit: Operation not permitted
$ ulimit -n 65536
#OK
这个限制是从哪里来的呢?
系统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
我如何将其提高到(至少)1048576?
(自我提醒:不要这样做echo 18446744073709551616 | sudo tee /proc/sys/fs/file-max
:)
答案1
检查/etc/ssh/sshd_config
包含:
UsePAM=yes
其中/etc/pam.d/sshd
包含:
session required pam_limits.so
在下面的评论中 @venimus 指出 1M 限制是硬编码的:
内核 2.6.x 源代码声明 ./fs/file.c:30:int sysctl_nr_open __read_mostly = 1024*1024;这是 1048676
1048576 是针对每个进程的。因此,通过多个进程可以克服这个限制。