Увеличиваем лимит открытых файлов в Linux, в Mysql, Nginx

Ограничения на лимит открытых файлов в системе Linux и ограничения на лимит открытых файлов mysql могут принести немало мороки с наладкой серверов и поиском ошибок. Если в случае с mysql тот хотя-бы «пожалуется» ошибкой 24: Too many open files, которую мы можем увидеть в phpmyadmin или в логах ошибок, то в случае с исчерпанным лимитом в системе, проблемы могут проявляться, то с одним сервисом, то с другим, и можно долго метаться между их настройками, не понимая истинных причин неполадок. А проблема банальна, ведь всё сущее в unix есть файл, будь то поток, процесс, бд и даже устройство, такое как жесткий диск ) И что же будет, если система, процессы в системе, не смогут открыть «свой» файл(ы), по причине исчерпания лимита открытых дескрипторов в системе? В большинстве случаев — это будет ожидание высвобождения лимита, когда процесс таки сможет влезть и выполнить свои дела.

Для начала проверим системный лимит открытых файлов:

Не помешает тут же проверить число открытых в текущий момент файлов по системе:

И число открытых дескрипторов файлов:

И если проверенное значение оказалось близко к максимуму, пришло время действовать! Для временного увеличения лимита(до перезагрузки системы):

На постоянной основе лимит настраивается в файле /etc/sysctl.conf добавлением стоки:

для того, чтобы настройка вступила в силу выполняем:

Проверка лимитов для пользователя выполняется командами:

Лимиты эти для пользователей настраиваются в файле /etc/security/limits.conf

Теперь разберемся с лимитом открытых файлов в mysql, посмотрим настройку:

Важно проверять эту настройку именно так, запросом и просмотром переменной, а не значением указанным в какой нибудь панельке управления.

Проверим сколько используется на данный момент:

Mysql открывает файлы таблиц постепенно, по мере использования, и держит их открытыми, поэтому после перезагрузки сервиса проблемы могут уходить, а по достижению лимита проявляться вновь, т.к. количество открытых файлов будет расти.

Традиционным способом в файлах /etc/mysql/* изменение переменной open_files_limit может оказаться бесполезным, как и из настроек панели! Открываем:

И прописываем тут необходимый лимит:

И применяем внесенные настройки:

Ну и на закуску, в nginx лимитом открытых файлов управляет директива worker_rlimit_nofile. Устанавливается она в основном конфиг файле /etc/nginx/nginx.conf