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

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

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

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

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

Я столкнулся с неожиданным поведением сервера, на котором работал сайт на битриксе. Длительное время он работал, занимая всю доступную оперативную память. Я получал об этом уведомления от заббикса, но не обращал большого внимания на сервер, так как в целом это нормальная ситуация, когда у тебя 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, либо ставить статическую память виртуальной машине.

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

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

Автор Zerox

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

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

  1. недавно разбирался в вопросе и сделал заметку по тюнингу mysql
    если интересно, буду рад комментариям, ну и статью можно дополнить - сайт хороший его много читают, пусть будет информация
    https://www.notion.so/breakneck/tuning-55c471ebde4a442abf8d17770d37e0e5

  2. Добрый день. Спасибо за отличные статьи. Очень помогают. Проблема в том, что пришлось заниматься сложными вещами без нужной предварительной подготовки, к сожалению. Сайт работает на выделенном сервере. Все было неплохо до последнего времени. Но в последнее время сервер начал сыпать 500-ми ошибками. Стал вопрос оптимизации. И пришлось делать самому. Вот сижу и разбираюсь. Спасибо еще раз! Ваши статьи очень помогают.
    Вопрос связан вот с чем. Настоятельно везде рекомендуют параметр innodb_flush_log_at_trx_commit сделать равным 0 (сейчас он = 2), ну или хотя бы единице.
    После этого стал вопрос внесения изменений в конфигурацию mysql. И насколько я понял фай my.cnf теперь в bitix env менять бессмысленно и еще и затруднительно из-за службы bvat.
    Все изменения вносить нужно через файл который Вы описали в этой статье: /etc/mysql/conf.d/z_bx_custom.cnf
    В связи с этим первый вопрос новичка. Каков протокол таких изменений? Т.е., например, выгружаем через файловый менеджер через SSH редактируем файл, заливаем назад. Обновляем настройки через консоль. Либо это какая-то другая процедура.
    Так же буду благодарен за разъяснения как должна выглядеть запись фала /etc/mysql/conf.d/z_bx_custom.cnf, потому что простой записью параметра в этот файл так, как она выглядела в my.cnf привело к такому ответу Found option without preceding group относительно этого фала после выполнения команды mysqladmin variables -pPASSWORD

    • Искренний совет. Не занимайтесь тюнингом этого сервера. Судя по вопросам, у вас вообще нет понимания, как все это работает в линуксе. С большой долей вероятности, вы сделаете хуже. Хотя бы потренируйтесь на каком-то другом сервере. Помочь вам в рамках комментариев к статье я не смогу.

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

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

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