Ограничения на лимит открытых файлов в системе Linux и ограничения на лимит открытых файлов mysql могут принести немало мороки с наладкой серверов и поиском ошибок. Если в случае с mysql тот хотя-бы «пожалуется» ошибкой 24: Too many open files, которую мы можем увидеть в phpmyadmin или в логах ошибок, то в случае с исчерпанным лимитом в системе, проблемы могут проявляться, то с одним сервисом, то с другим, и можно долго метаться между их настройками, не понимая истинных причин неполадок. А проблема банальна, ведь всё сущее в unix есть файл, будь то поток, процесс, бд и даже устройство, такое как жесткий диск ) И что же будет, если система, процессы в системе, не смогут открыть «свой» файл(ы), по причине исчерпания лимита открытых дескрипторов в системе? В большинстве случаев — это будет ожидание высвобождения лимита, когда процесс таки сможет влезть и выполнить свои дела.
Для начала проверим системный лимит открытых файлов:
cat /proc/sys/fs/file-max
Не помешает тут же проверить число открытых в текущий момент файлов по системе:
lsof | wc -l
И число открытых дескрипторов файлов:
cat /proc/sys/fs/file-nr
И если проверенное значение оказалось близко к максимуму, пришло время действовать! Для временного увеличения лимита(до перезагрузки системы):
sysctl -w fs.file-max=1000000 # либо можно просто записать в файл необходимое значение echo 1000000 > /proc/sys/fs/file-max
На постоянной основе лимит настраивается в файле /etc/sysctl.conf добавлением стоки:
fs.file-max=1000000
для того, чтобы настройка вступила в силу выполняем:
sysctl -p
Проверка лимитов для пользователя выполняется командами:
ulimit -Hn # Hard limit ulimit -Sn # Soft limit
Лимиты эти для пользователей настраиваются в файле /etc/security/limits.conf
Теперь разберемся с лимитом открытых файлов в mysql, посмотрим настройку:
show variables like 'open_files_limit';
Важно проверять эту настройку именно так, запросом и просмотром переменной, а не значением указанным в какой нибудь панельке управления.
Проверим сколько используется на данный момент:
lsof -u root | wc -l
Mysql открывает файлы таблиц постепенно, по мере использования, и держит их открытыми, поэтому после перезагрузки сервиса проблемы могут уходить, а по достижению лимита проявляться вновь, т.к. количество открытых файлов будет расти.
Традиционным способом в файлах /etc/mysql/* изменение переменной open_files_limit может оказаться бесполезным, как и из настроек панели! Открываем:
nano /etc/systemd/system/mysql.service.d/nofile.conf
И прописываем тут необходимый лимит:
[Service] LimitNOFILE=1000000
И применяем внесенные настройки:
systemctl daemon-reload systemctl restart mysql
Ну и на закуску, в nginx лимитом открытых файлов управляет директива worker_rlimit_nofile. Устанавливается она в основном конфиг файле /etc/nginx/nginx.conf