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