Полный цикл в digital

Оптимизация настроек BitrixVM

Если стандартные настройки перестали подходить, на сервере время от времени появляется нехватка оперативной памяти. Приходит OOM Killer и кладет mysql сервер, значит пора занятся оптимизацией.

Чтобы применять наши настройки, нужно их указывать в отдельных конфигурационных файлах:

  • PHP /etc/php.d/bitrixenv.ini
  • MySQL /etc/mysql/conf.d/bvat.cnf
  • Apache /etc/httpd/bx/conf/prefork.conf
  • Nginx /etc/nginx/bx/conf/push-im_settings.conf

Оптимизация настроек Mysql

На подопытном сервере имеется 12 Гб оперативной памяти. Я решил половину этой памяти отдать под mysql. Приступим к тюнингу конфигурации mysql. В общем случае достаточно будет одного параметра, который в основном отвечает за потребление памяти:

innodb_buffer_pool_size = 4G

Иногда этого недостаточно, для более точной настройке mysql, есть неплохой инструмент MySQLTuner, который анализируя работу mysql, выдает некоторые рекомендации по настройке. Оптимальный вариант, если сам не разбираешься в тонкой настройке mysql.

Советы по изменению параметров даются в заключительной секции mysqltuner - Variables to adjust.

Копируем себе на сервер сам скрипт:

wget http://mysqltuner.pl/ -O mysqltuner.pl

Запускаем скрипт:

perl mysqltuner.pl

Для эффективных рекомендаций, служба mysql должна поработать несколько дней. Если накануне перезапускали ее, рекомендую через несколько дней зайти и еще раз прогнать тесты. Будут новые советы по конфигу.

Для оптимизации потребления памяти, достаточно будет прогнать скрипт в любое время. Я вам рекомендую внимательно изучить его возможности. Подробно на них я сейчас не буду останавливаться, а рассмотрю только то, что касается памяти.

У меня все оптимизировано под потребленее не более примерно 6 Гб памяти. Расскажу, какие параметры за это отвечают. Для innodb_buffer_pool_size рекомендуют указывать этот параметр равный 80% доступной памяти сервера. Но это в том случае, если у вас кроме mysql на этом сервере ничего не крутится. А у нас там полно других служб, поэтому нам такой совет не подходит.

Дальше нам нужно выяснить, сколько памяти занимает thread, процесс который порождает соединение и в соотвествии с этим выставить предел числа подключений. Размер thread равен сумме следующих парметров read_buffer_size + sort_buffer_size + join_buffer_size.

Параметр read_buffer_size установлен по-умолчанию в 128КБ, я его не стал трогать. Остальные два я изначально выставил по рекомендациям mysqltuner, а значение max_connections которое отвечает за максимальное количество подключений, выставил такое, чтобы сумма трех буферов, помноженная на количество подключений не превышала 2Гб памяти. Сервер немного поработал в таком режиме и выяснилось, что выставленных подключений не хватает. Тогда я снизил join_buffer_size до 18Мб, а количество подключений увеличил. В итоге остановился на таких настройках:

innodb_buffer_pool_size = 4G
sort_buffer_size = 18M
join_buffer_size = 18M
max_connections = 70

С такими настройками максимальное потребление памяти службой mysql не будет превышать 6.8Гб, о чем подсказывает вывод mysqltuner. Конкретно моему сайту 70 подключений к mysql достаточно.

[OK] Maximum possible memory usage: 6.8G (58.69% of installed RAM)

Приведу список основных параметров mysql, которые влияют на производительность и на которые надо в первую очередь обращать внимание:

  • max_connections
  • log_bin
  • table_open_cache_size
  • table_definitions_cache_size
  • open_files_limit
  • innodb_buffer_pool_size
  • innodb_log_file_size
  • innodb_flush_log_at_trx_commin
  • innodb_flush_method=O_DIRECT

Оптимизация настроек apache

Дальше переходим ко второму основному потребителю оперативной памяти на сервере apache. Службе apache, как и для mysql, служба bvat автоматически выставляет некоторые настройки. Они хранятся в файле /etc/httpd/bx/conf/prefork.conf. Нас будут интересовать настройки, касающиеся количества запущенных процессов.

Чтобы узнать количество запущенных процессов httpd, обслуживающих работу сайта, введите в консоли сервера команду:

ps ax | grep httpd | wc -l

В моем случае bvat выставлял максимально возможное количество процессов httpd равное 60, для меня это было слишком много, сервер не тянул такое количество процессов. Я его уменьшил до 30.

В зависимости от сайта, один процесс httpd будет использовать разное количество памяти, поэтому автоматически невозможно выставить этот параметр корректно для всех сайтов. В данном случае, дефолтный параметр мне не подошел, поэтому я создал свой файл настроек /etc/httpd/bx/custom/z_bx_custom.conf:

z_bx_custom.conf<IfModule mpm_prefork_module> 
  StartServers       30
  MinSpareServers    30
  MaxSpareServers    30
  MaxRequestWorkers  30
  MaxRequestPerChild 3000
</IfModule>

Посмотреть, сколькло памяти занимает один процесс, можно с помощью команды:

ps -o vsz,rss,cmd --pid $(pgrep httpd)

Будет один основной процесс, который занимает больше всего памяти и дальше его форки, которые потребляют примерно одинаково. На них и ориентируйтесь. У меня основной процесс потребляет 500 Мб и 30 форков по 100 Мб. В сумме получается 3.5 Гб.

Итого в пике у меня 6.5 Гб использует mysql и 3.5 Гб использует httpd, итого 10 Гб из доступных 12-ти. На практике, свободной памяти обычно больше, чем 2 Гб, так как mysql чаще всего потребляет ниже максимального предела.

Оптимизация настроек PHP

Из настроек php нужно обратить внимание на следующие параметры:

  • memory_limit максимальное количетсво памяти на выполнение php скрипта
  • sendmail_path управляет параметрами отправки сообщений, хотя к теме текущей статьи и не имеет отношение
  • post_max_size максимальный размер данных для всего POST запроса
  • upload_max_filesize максимальный размер файла для загрузки через POST запрос
  • max_execution_time максимальное время в секундах, в течение которого скрипт должен полностью загрузиться

Оптимизация настроек nginx

В самом nginx настраивать для производительности особо нечего. Он работает в качестве proxy сервера для apache. С помошью proxy_pass он перенаправляет все динамические запросы, а сам отдает только статику. В таком режиме работы он потребляет минимум ресурсов и оптимизировать в нем нечего.

Отдельной настройки требует только модуль Push and Pull, если он у вас используется. Его конфигурация располагается в файле /etc/nginx/bx/conf/push-im_settings.conf. Параметр push_stream_shared_memory_size, отвечает за использование оперативной памяти.

Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг