Home » Полезные советы » MySQL - [Warning] Changed limits: max_open_files, table_open_cache

MySQL - [Warning] Changed limits: max_open_files, table_open_cache

Практически всегда сталкиваюсь с предупреждением Mysql сервера, когда оптимизирую работу сайтов на Bitrix, работающих в окружении bitrixenv. Подробно об этом я рассказывал в отдельной статье - оптимизация настроек сервера под сайт на bitrix. Там я забыл описать один важный момент, который относится к параметрам max_open_files и table_open_cache.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом "Administrator Linux. Professional" в OTUS. Курс не для новичков, для поступления нужно пройти .

В качестве примера я возьму сервер на базе 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

Онлайн курс MS SQL Server Developer

Если у вас есть желание научиться обрабатывать миллиарды данных, рекомендую познакомиться с онлайн-курсом "MS SQL Server Developer" в OTUS. Курс не для новичков, для поступления нужны базовые знания по программированию, работе с БД и SQL. Обучение длится 4 месяца, после чего успешные выпускники курса смогут пройти собеседования у партнеров. После обучения вы сможете:
  • разрабатывать на SQL;
  • проектировать БД и понимать все нюансы;
  • анализировать и оптимизировать производительности запросов;
  • писать сложные хранимые процедуры, функции и триггеры;
  • читать план запроса.
Проверьте себя на вступительном тесте и смотрите подробнее программу по .
Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

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

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

Автор Zerox

Zerox
Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству.

2 комментария

  1. Аватар

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

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

Ваш адрес email не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.