Для тестирования я изменил свой глобальный лимит открытых файлов на 3000:
#sysctl -w fs.file-max=3000
fs.file-max = 3000
#cat /proc/sys/fs/file-nr
2016 0 3000
Я создал несколько файлов:
i=1; while [ "$i" -le 1000 ]; do : >> "$i"; i=$(($i + 1)); done
Я держал их открытыми:
i=1; while [ "$i" -le 1000 ]; do less "$i" & ; i=$(($i + 1)); done
Я видел только что созданный хаос:
ksh: /bin/less: cannot execute [Too many open files in system]
Я знаю, что достиг предела ...
# cat /proc/sys/fs/file-nr
3008 0 3000
Если я сейчас увеличу лимит открытых файлов (чтобы я мог использовать ssh с другой консолью), и если я проверю одно из последних меньших, которые я создал после установки максимального количества открытых файлов на 3000, я увижу:
# cat /proc/28282/limits | grep 'Max open files'
Limit Soft Limit Hard Limit Units
Max open files 1024 16384 files
«Жесткий предел» по-прежнему установлен на высоком уровне, хотя 3000 не упоминаются. Таким образом, мы достигли системного ограничения, а не ограничения на процесс.
Почему бы не дать вновь созданному процессу наследовать 3000 и 16384?
Я вошел в систему в новом терминале с новой оболочкой, так почему бы моей оболочке не сказать 3000 и не передать это меньше?
Это ядро 2.6.32
По этой ссылке Ограничения файлового дескриптора Ulimit не применяются для определенного процесса
Я цитирую:
"/etc/security/limits.conf является частью pam_limits, поэтому ограничения, установленные в этом файле, читаются модулем pam_limits во время сеансов входа в систему. Сеанс входа в систему может быть через ssh или через терминал"
/etc/sysctl.conf - это глобальная конфигурация всей системы, здесь мы не можем установить конфигурацию для конкретного пользователя. Он устанавливает максимальный объем ресурса, который может быть использован всеми пользователями / процессами вместе взятыми "
/etc/sysctl.conf - неподходящее место для этого.
Мне нужно будет полностью изучить /etc/security/limits.conf и "pam_limits"