Home » Полезные советы » Где хранятся настройки mysql в bitrix env и как их изменять

Где хранятся настройки mysql в bitrix env и как их изменять

Я периодически работаю с сайтами на битрикс, которые работают в готовом web окружении от разработчиков. Сегодня я поделюсь информацией о том, где хранятся и как изменять настройки mysql на сервере с bitrix env. Многие простые вещи становятся очень сложными, если ты не знаком с нюансами работы этого окружения.

Проверяем, кто занимает всю память на сервере

Я столкнулся с неожиданным поведением сервера, на котором работал сайт на битриксе. Длительное время он работал, занимая всю доступную оперативную память. Я получал об этом уведомления от заббикса, но не обращал большого внимания на сервер, так как в целом это нормальная ситуация, когда у тебя mysql и apache трудятся вместе. Где-то пол года он работал нормально, а потом стал сильно деградировать по производительности. В общем, начались настоящие проблемы.

Я пошел на сервер и стал разбираться, в чем дело. Начал с того, что посмотрел, кто занимает оперативную память.

# ps aux --sort -rss

или

# ps aux --sort -vsz

Не удивился, увидев, что mysql. Первое, что сделал — перезапустил его и стал наблюдать. Увидел такую картинку в zabbix.

Mysql занимает всю оперативную память

Дальше сервер кушал весь своп и прибивал процесс mysql с сообщением в системном логе:

kernel: Out of memory: Kill process 30609 (mysqld) score 97 or sacrifice child

Mysql перезапускался автоматом и дальше все продолжалось по кругу. Надо было разбираться в первую очередь с ним.

Где в bitrix env настройки mysql

Для начала нужно было проверить, где на сервере с bitrixenv хранятся настройки mysql. По аналогии с остальными настройками (php, apache, nginx), предвкушал долгие поиски и не ошибся. В итоге выяснил, что хранятся они в файле /etc/mysql/conf.d/bvat.cnf. Но мало узнать, где они хранятся. Как оказалось, этот файл формируется динамически при каждом запуске сервера, в зависимости от доступной оперативной памяти. Тут то я и понял, в чем проблема. Расскажу обо всем по порядку.

В bitrix env есть служба под названием bvat. Она стартует при загрузке сервера через /etc/init.d/bvat. Эта служба определяет количество оперативной памяти на сервере и в зависимости от этого меняет некоторые настройки web окружения. В частности mysql, php, apache. Можно посмотреть этот скрипт, чтобы понять, что он делает. Если кратко, то он запускает скрипт /etc/ansible/library/bx_perf, который подключает некоторые переменные и формирует новые конфиги. Свою работу логирует в файле /opt/webdir/logs/bvat.log.

В моем случае bvat не изменял конфиг для mysql. Я проверил документацию по нему на сайте битрикса. Четко сказано, что он работает при загрузке системы. Я запускал руками те проверки из скрипта, что должны менять именно mysql конфиг. Удалял конфиг, но bvat неизменно создавал новый конфиг, из расчета, что на сервере 16Гб памяти. Это так и было на момент первоначальной установки. Но со временем гипервизор нагрузили и память сделали динамическую, уменьшив максимально доступную.

В какой-то момент всем памяти на гипервизоре стало не хватать и он начал распределять ее по виртуальным машинам. Конкретно подопытному серверу стало доставаться меньше памяти, чем 16 Гб, но все конфиги были заточены под это количество. Из-за этого серверу не хватало памяти и он начинал уходить в своп и аварийно перезапускать службы, пожирающие память.

Когда я все понял, сделал виртуальной машине статическую память (меньше 16Гб) и перезагрузился. Но конфиг mysql не изменился. Тут явно какой-то глюк. bvat по прежнему откуда-то доставал 16Гб памяти и на основе их рисовал конфиг. Я просмотрел весь скрипт. Там используется несколько проверок памяти. Я посмотрел основную, через free -m, она показывает корректное значение, которое меньше 16Гб, но bvat откуда-то берет другое число. Я не стал разбираться с этим, так как налицо баг, который скорее всего либо уже исправлен, либо будет исправлен после какого-нибудь обновления.

Как изменить настройки mysql в bitrixenv

Для того, чтобы руками изменить какие-то параметры в mysql, которые не будут изменяться динамически, необходимо воспользоваться файлом /etc/mysql/conf.d/z_bx_custom.cnf. Основной параметр, который приводит к тому, что mysql занимает всю оперативную память — innodb_buffer_pool_size. В первую очередь следует переназначить именно его. Сделать где-то в треть реальной оперативной памяти. С остальными параметрами надо разбираться отдельно. Я не стал тратить на это время, пока временно отдал серверу первоначальный объем памяти в 16Гб. В ближайшее время обновлю полностью сервер вместе с bitrix env и посмотрю, исчез ли глюк с тем, что память определяется неправильно. Если нет, буду руками выставлять параметры под реальную оперативную память сервера.

Заключение

К bitrixenv у меня неоднозначное отношение. С одной стороны удобно, что все собрано в одном месте, связано друг с другом и быстро устанавливается, настраивается. Но когда нужно дебажить какие-то проблемы, уходит в разы больше времени, чем если бы ты использовал классический веб сервер, настроенный собственноручно. Сейчас я уже неплохо ориентируюсь в bitrixenv, решаю вопросы быстро, но с mysql столкнулся впервые. Обычно там проблемы с конфигами php, apache, nginx, с отправкой почты.

Закономерный вывод в конце — bitrixenv не предназначен для работы на сервере с динамической оперативной памятью. Надо либо отключать bvat, либо ставить статическую память виртуальной машине.

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

Ваш e-mail не будет опубликован.

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