Open file limits

Часто при использовании какой-либо программы, при открытии большого количества файлов она сваливается, т.к. упирается в ограничение (по умолчанию 1024 открытых файла), выводя ошибку: failed (24: Too many open files). Текущее использование открытых файлов программой можно узнать так:

lsof -u процесс | wc -l

Многие программы умеют изменять ограничения самостоятельно, поэтому задать ограничение на количество открытых файлов можно в конфигурационном файле. Например, используя параметр open_files_limit в конфигурационном файле my.cnf сервера MySQL, или параметр worker_rlimit_nofile для Nginx.
Однако, заданные значения в конфигурационных файлах этих программ могут не применяться при перезапуске. В этом случае ограничение накладывается системой.
Можно узнать ограничение системы для текущего пользователя с помощью команды:

ulimit -a

А для всей системы в целом:

sysctl fs.file-max

Установить же новое значение для ограничения по файлам для текущего пользователя можно так:

ulimit -n значение

Если новые ограничения устанавливаются пользователем root и им же перезапускается Ваша программа, то, несмотря на то, что программа работает от имени другого пользователя, у неё должны вступить в силу новые настройки. Перезапустив программу, можно проверить, применились ли новые значения. Например, выполнить в MySQL команду:

show variables like ‘open_files_limit';

Однако, новые значения ограничений, устанавливаемые утилитой ulimit действуют в рамках одной сессии. Это означает, что при следующем подключении, настройки ограничений системы вернуться к исходным. Чтобы не использовать каждый раз данную утилиту, можно задать параметры ограничений в файле /etc/security/limits.conf. Например, для снятия ограничения на количество одновременно открытых файлов (до 65к, чего хватает в большинстве случаев) для всех пользователей, добавить в конец файла строки:

* soft nofile 65536
* hard nofile 65536

Также следует знать, что файл limits.conf является конфигурационным файлом PAM. А далеко не все программы при запуске используют PAM. Если Ваша программа из числа тех, что не используют PAM, то перед правкой файла limits.conf следует проверить директорию /etc/default/ на наличие конфигурационных файлов Вашей программы. И, если таковые имеются, добавить в конец её конфигурационного файла команду «ulimit -n 65536». Если же в /etc/default/ конфигурационных файлов Вашей программы нет, то можно принудить использовать настройки limits.conf для всех, добавив в конец файлов /etc/pam.d/common-session и /etc/pam.d/common-session-noninteractive (при наличии оного) строку:

session required pam_limits.so

После чего перезагрузить систему.