Исправление ulimit: открытые файлы: невозможно изменить ограничение: Операция не разрешена

Исправление ulimit: открытые файлы: невозможно изменить ограничение: Операция не разрешена

Я проверил это на разных установках 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. Таким образом, имея несколько процессов, этот предел можно преодолеть.

Связанный контент