Практически всегда сталкиваюсь с предупреждением Mysql сервера, когда оптимизирую работу сайтов на Bitrix, работающих в окружении bitrixenv. Подробно об этом я рассказывал в отдельной статье - оптимизация настроек сервера под сайт на bitrix. Там я забыл описать один важный момент, который относится к параметрам max_open_files и table_open_cache.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
В качестве примера я возьму сервер на базе Centos 7, на котором установлено окружение Bitrixenv. Но принципиального значения это не имеет, так как данная ошибка исправляется примерно одинаково во всех дистрибутивах. Итак, о чем пойдет речь. В настройках Mysql сервера есть два очень важных параметра, которые влияют на его производительность:
- table_open_cache
- open_files_limit
Какие значения нужно выбирать, тема отдельной статьи и сильно зависит от конкретной ситуации, так что сейчас не об этом. Допустим, вы выставили эти значения в 15000 и 30000 соответственно. При запуске Mysql сервера вы увидите в логе для ошибок следующие строки:
[Warning] Changed limits: max_open_files: 5000 (requested 30000) [Warning] Changed limits: table_open_cache: 2452 (requested 15000)
Mysql сервер не может выставить указанные параметры. Причина этого - лимит операционной системы для конкретного процесса, в данном случае mysql. Посмотреть его лимиты можно командой:
# cat /proc/$(pgrep mysqld)/limits
Bitrixenv ставит значение Max open files в 5000 для службы базы данных. По дефолту в Centos 7 оно равно 1024 на процесс. Нам этого мало, поэтому увеличиваем его конкретно для mysql до 65535. Для этого создаем отдельный конфиг в systemd для службы mysql.
# mkdir /etc/systemd/system/mysqld.service.d # touch limit.conf
Содержимое файла очень простое:
[Service] LimitNOFILE=65535
Объясняю, почему мы сделали именно так. По идее, можно было бы просто отредактировать файл /etc/systemd/system/mysql.service. Там уже есть параметр LimitNOFILE и ему указано значение 5000. Но если мы отредактируем его, то изменение будет сброшено при очередном обновлении mysql сервера. А создав отдельный внешний конфиг для службы, мы обезопасили его от изменения. Теперь можно спокойно обновляться, установленный параметр никуда не денется.
Так же можно было изменить системные лимиты для всех процессов разом, через указание нужного параметра в конфигурационном файле /etc/security/limits.conf. До появления systemd так обычно и делали. С появлением последнего управлять лимитами для процессов стало проще, поэтому лучше настраивать все точечно именно там, где это необходимо.
После изменения конфигурационных файлов systemd, надо перечитать настройки:
# systemctl daemon-reload
И перезапускаем Mysql для применения изменений в самой службе.
# systemctl restart mysql
Проверяйте лог mysql. Больше предупреждения на тему Changed limits быть не должно. Смотрим.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Для тех, у кого не получилось - проверьте внимательно, создаёте ли вы директорию mysqld.service.d. Я тупанул, и вместо директории файл с таким названием создал, записав в него содержимое. Надо создать именно директорию и в неё закинуть .conf файл.
Здравствуйте
Сделали как вы указали, но ничего не изменилось.
Мне не удалось решить проблему (может значение слишком большое):
[Warning] Could not increase number of max_open_files to more than 1048576 (request: 1282047)
у вас опечатка mkdir etc/systemd/system/mysqld.service.d
Спасибо, поправил.