Я проверил это на разных установках GNU/Linux:
perl -e 'while(1){open($a{$b++}, "<" ,"/dev/null") or die $b;print " $b"}'
Система А и D
Первое ограничение, с которым я столкнулся, — 1024. Его легко увеличить, добавив в /etc/security/limits.conf следующее:
* hard nofile 1048576
и затем запустите:
ulimit -n 1048576
echo 99999999 | sudo tee /proc/sys/fs/file-max
Теперь тест переходит к 1048576.
Однако, похоже, я не могу поднять его выше 1048576. Если я укажу 1048577 в limits.conf, то он просто проигнорируется.
Что является причиной этого?
Система Б
В системе 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
Откуда взялся этот предел?
Система С
В этой системе также установлено ограничение 1048576 в limits.conf и 99999999 в /proc/sys/fs/file-max.
Но здесь предел — 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 утверждает, что ограничение в 1 МБ жестко запрограммировано:
В исходном коде ядра 2.6.x указано ./fs/file.c:30:int sysctl_nr_open __read_mostly = 1024*1024; что равно 1048676
На каждый процесс приходится 1048576. Таким образом, имея несколько процессов, этот предел можно преодолеть.