私はこれをさまざまな 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 より上に上げることはできないようです。limits.conf に 1048577 を入力しても、単に無視されます。
何が原因なのでしょうか?
システム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 はプロセスあたりです。したがって、複数のプロセスを持つことでこの制限を克服できます。