Оптимизация настроек 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, отвечает за использование оперативной памяти.