Transcript Document

Интерпретация результатов нагрузочного
тестирования – что корректировать, где и как
Сербул Александр
Руководитель направления контроля
качества интеграции и внедрений
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