MySQL - [Warning] Changed limits: max_open_files, table_open_cache

Практически всегда сталкиваюсь с предупреждением 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

Changed limits: max_open_files

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 быть не должно. Смотрим.

Changed limits: table_open_cache

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

5 комментариев

  1. Бубунта

    Для тех, у кого не получилось - проверьте внимательно, создаёте ли вы директорию mysqld.service.d. Я тупанул, и вместо директории файл с таким названием создал, записав в него содержимое. Надо создать именно директорию и в неё закинуть .conf файл.

  2. Здравствуйте
    Сделали как вы указали, но ничего не изменилось.

  3. Evgenii Taiberi

    Мне не удалось решить проблему (может значение слишком большое):

    [Warning] Could not increase number of max_open_files to more than 1048576 (request: 1282047)

  4. у вас опечатка mkdir etc/systemd/system/mysqld.service.d

Добавить комментарий

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

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar