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

Ограничения на лимит открытых файлов в системе 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

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *