Интерпретация результатов нагрузочного тестирования – что корректировать, где и как Сербул Александр Руководитель направления контроля качества интеграции и внедрений 1С-Битрикс Популярные ошибки Нет четкой цели – для чего. Просто: «а давайте нагрузим…» Нередко проводят нагрузочное тестирование – неправильно, выводы - кривые Получают кучу результатов – и не могут их растолковать Неправильно представляют клиенту результаты нагрузочного тестирования Популярные ошибки - DDOS Нагрузили систему, все вдруг стало колом, что делать? Оказалось – безнадежно «задедосили» с ab. Создаем разумную, похожую на боевую, нагрузку. Очереди в nginx/php-fpm – не должны расти! Система должна свободно дышать: top iostat –xm 5 Популярные ошибки – грузим одну страницу Грузили только главную страницу (с включенным кэшем). Пришли реальные пользователи и … система стала колом. При нагрузке: Нужно обращаться к разным страницам веб-системы. Нужно загрузить демо-данные (реальный объем). Важно авторизовывать хиты. Проверяем производительность загрузки статики. Подготовка – логи Собираем логи: Лог jmeter – latency запроса, код http Лог nginx – latency общее, latency к upstream Лог apache/php-fpm – latency, код http, system/user time, memory Лог ошибок php Лог медленных запросов php-fpm - трейсы Данные sar или atop – что творилось на сервере в это время Подготовка – рисуем графики Важно наблюдать картину в динамике на графиках: munin/cacti/pnp4nagios: Апач – запросы Nginx – запросы MySQL – запросы, потоки Процессор – user/system/iowait Память – использование и распределение Своп – использование Диски – latency, %util Сеть – tcp, трафик Подготовка - скрипты Полезно написать несколько скриптов обработки логов: - Гистограмма времени запросов - Гистограмма ошибок - Гистограмма расхода памяти Технологии: awk, bash, php. Скрипты - в блоге Битрикс на Хабре или пишите нам. cat /var/log/www.access.log | awk -F# '{ zone = int($10/100)*100; hits[zone]++; } \ END { for (z in hits) {printf("%8s ms: %8s,%6.2f% ",z,hits[z],hits[z]/total*100);{s="";a=0;while(a++<int(hits[z]/total*100)) s=s"*";print s} } }' \ total="$TOTAL" - | sort -n Понимание сценария выполнения хита Очень важно понять, как проходит хит клиента к PHP: 1. Браузер клиента делает HTTP-запрос к nginx 2. nginx проксирует запрос к apache/php-fpm 3. PHP обращается к БД 4. PHP строит страницу и возвращает ее nginx 5. nginx в http-ответе возвращает ответ в браузер клиента Будет понятно что «подкручивать». Понимание сценария выполнения хита 1. Браузер клиента делает HTTP-запрос к nginx Статика отдается, как правило, очень быстро или ищем причину. nginx проксирует запрос (к upstream), ждет и возвращает: 200 ОК 500 Internal Server Error 502 Bad Gateway 503 Service Unavailable 504 Gateway Timeout Понимание сценария выполнения хита 1. Браузер клиента делает HTTP-запрос к nginx Нужно понять и вызубрить, какие статусы ошибок когда возвращаются: - PHP выполнятся слишком долго (подкручиваем таймауты, смотрим трейс php-fpm slow log …) - PHP остановился с fatal error - nginx не смог «достучаться» до apache/php (БД держит хит, сокет наружу открылся …): Apache mod_status, php-fpm pm.status_path, ps/top Понимание сценария выполнения хита 2. nginx проксирует запрос к apache/php-fpm Выбор upstream и время отработки запроса в нем – в лог Недоступность upstream – забита очередь? /server-status netstat atop/sar Тормоза в БД = забивание очереди между nginx и apache/php-fpm Понимание сценария выполнения хита 3. PHP обращается к БД Логируем ошибки в БД: define("ERROR_EMAIL", "[email protected], [email protected]"); Лог медленных запросов к БД – анализируем. График числа потоков в БД – максимум. Траффик к БД – график. График числа медленных запросов к БД. Percona Server. Понимание сценария выполнения хита 4. PHP строит страницу и возвращает ее nginx Ошибки в логе PHP. Лог медленных запросов php-fpm. Поставьте pinba и рисуйте графики выполнения частей страницы php – где тормозит? Понимание сценария выполнения хита 5. nginx в http-ответе возвращает ответ в браузер клиента Проверяем размер и сжатие в логах. Проверяем статику – идет через nginx, в логах php – пусто. Заглушка «200 ОК» вместо страницы? Бывает. 404 страница – статика или динамика? Пошла нагрузка … жжж Система работает в штатном режиме? Не перегружена ли текущая веб-система? /server-status (Apache mod_status) Число ошибок и таймаутов в логах Перегруженная текущая веб-система – не готова к нагрузке! Система работает в штатном режиме? nginx http_stub_status_module apachetop –f <лог nginx>, <лог apache> Число потоков в БД – разумное Лог медл. запросов к БД – не растет mysql: show processlist – пусто (почти) CPU – нагрузка адекватная Память – не уходит в swap Трафик к клиенту и БД Нагрузка на диск Перегруженная текущая веб-система – не готова к нагрузке! Трактуем результаты - nginx Считаем процент ошибок в логах: nginx 200 – 95% 50x – 5% - почему? «подкручиваем» Latency (200 OK) для статики: среднее, 90%, 99%, распределение. Время соед. с upstream > 1 сек? Трактуем результаты – apache/php-fpm % ошибок в логах apache/php-fpm: segfaults – бывает, но интересно почему? Ищем причины. fatal errors – ?? warnings - ?? php-fpm slow log latency (200 OK): cреднее, 90%, 99%, распределение Исп. памяти > 500МБ?? Связываем с логом nginx Трактуем результаты – БД Число медл. запросов – откуда? Пики числа потоков в БД Анализ медленных запросов, оптимизация Связываем с логом nginx Трактуем результаты – для клиента Число хитов (10 млн.) Продолжительность тестирования (сутки) Время построения страницы: среднее, 90%, 99% (0.3, 1.1, 1.8) Распределение времени - гистограмма Процент ошибок (0.2%) – клиенты получили страницу об ошибке Красивые графики Что и где «подкручивать» Берем/подсматриваем в виртуальную машину Битрикс Читаем курсы 1С-Битрикс Сбалансированная конфигурация nginx->apache/php-fpm Nginx – отдает статику, php - динамику Адекватно настроенная БД Оптимальные настройки PHP – прекомпилятор и др. (проверка в админке Битрикс) Аккуратная разработка на PHP, станд. компоненты, «Монитор качества» Спасибо за внимание! Вопросы? Александр Сербул [email protected] AlexSerbul