Обзор инструментов нагрузочного тестирования Александр Демидов «1С-Битрикс» Нагрузочное тестирование – определение или сбор показателей производительности и времени отклика программно-технической системы или устройства в ответ на внешний запрос с целью установления соответствия требованиям, предъявляемым к данной системе (устройству). / Википедия Зачем? Проверка и оптимизация конфигурации оборудования, виртуальных машин, серверного программного обеспечения Оценка максимальной производительности, которую способен выдерживать проект с типовыми сценариями нагрузки на доступных ресурсах Влияние модулей проекта на производительность, сценарии обработки пиковой нагрузки Оценка стабильности при максимальных нагрузках при проведении 24-часовых тестов с учетом внешних факторов (импорты, резервное копирование и т.п.) Выявление ограничений конфигурации, определение методов дальнейшего масштабирования и оптимизации А как трактовать результаты? Только определив требования вместе с заказчиком Если сам заказчик не сумеет определиться с требованиями, помогите ему. Количество хитов в сутки Скорость загрузки главной страницы при указанном количестве хитов Скорость загрузки критичных разделов Среднее время загрузки всех страниц в сутки Процент страниц с временем загрузки более n сек. Допустимый процент ошибок Допустимое время простоя ... Начнем с простого… Apache HTTP server benchmarking tool ab [options] [http[s]://]hostname[:port]/path где основные необходимые options: -c concurrency количество одновременных запросов к серверу (по уолчанию 1) -n requests общее количество запросов (по умолчанию 1) ab Concurrency Level: Time taken for tests: Complete requests: Failed requests: Write errors: Total transferred: HTML transferred: Requests per second: Time per request: Time per request: concurrent requests) Transfer rate: 10 0.984 seconds 100 0 0 3725507 bytes 3664100 bytes 101.60 [#/sec] (mean) 98.424 [ms] (mean) 9.842 [ms] (mean, across all 3696.43 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median Connect: 1 2 3.6 1 Processing: 63 94 21.5 90 Waiting: 57 89 21.6 84 Total: 64 96 21.5 92 max 23 173 166 174 ab Плюсы: Есть везде, где есть Apache Не требует никакой дополнительной настройки Очень простой инструмент Минусы: Очень простой инструмент По сути – тестирует только производительность веб-сервера: опрашивает только один URL, не поддерживает сценарии нагрузки Чуть сложнее – Siege Joe Dog Software http://www.joedog.org/siege-home/ Многопоточный Можно задавать как количество запросов, так и продолжительность (время) тестирования Поддерживает простейшие сценарии Siege # cat urls.txt # URLS file for siege # -http://www.bitrix24.ru/ http://www.bitrix24.ru/support/forum/forum1/topic3469/?PAGEN_1=2 http://www.bitrix24.ru/register/reg.php POST domain=test&login=login http://www.bitrix24.ru/search/ POST < /home/www/siege_post_data # siege -f urls.txt -c 10 -r 10 -d 3 Siege HTTP/1.1 HTTP/1.1 HTTP/1.1 HTTP/1.1 200 200 200 200 0.44 0.85 0.85 0.34 secs: secs: secs: secs: 12090 29316 29635 12087 bytes bytes bytes bytes ==> ==> ==> ==> GET GET GET GET [...] done. Transactions: Availability: Elapsed time: Data transferred: Response time: Transaction rate: Throughput: Concurrency: Successful transactions: Failed transactions: Longest transaction: Shortest transaction: 100 100.00 12.66 1.99 0.64 7.90 0.16 5.02 100 0 1.06 0.31 hits % secs MB secs trans/sec MB/sec / /support/forum/forum1/ /support/forum/forum1/ / Боевые сценарии тестирования URL’ы для сценариев можно взять из логов веб-сервера Похожий инструмент - httperf http://www.hpl.hp.com/research/linux/httperf/ 30 Jan 2008: visit our sourceforge page at http://sourceforge.net/projects/httperf http://sourceforge.net/projects/httperf/ As of 2009-12-24, this project may now be found at http://code.google.com/p/httperf/. https://code.google.com/p/httperf/ 2013-05-28 - Ted Bullock Figured out my lost account to access the httperf repository. Although I am not currently doing active development for httperf, you can now submit bug reports and I will be able to receive them. Сложнее… и функциональнее Apache JMeter http://jmeter.apache.org/ Java HTTP, HTTPS, SOAP, Database via JDBC, LDAP, SMTP(S), POP3(S), IMAP(S) Консоль и GUI Распределенное тестирование План тестирования – XML Может обрабатывать лог веб-сервера как план тестирования Визуализация результатов в GUI JMeter JMeter Tsung http://tsung.erlang-projects.org/ Erlang HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP, Jabber/XMPP Консоль (GUI через сторонний плагин) Распределенное тестирование (миллионы пользователей) Фазы тестирования План тестирования – XML Запись плана с помощью Tsung recorder’а Мониторинг тестируемых серверов (Erlang, munin, SNMP) Инструменты для генерации статистики и графиков из логов работы tsung_stats.pl tsung_stats.pl + Gnuplot WAPT http://www.loadtestingtool.com/ Windows Платный (есть триал на 30 дней / 20 виртуальных пользователей) Запись плана тестирования из десктопных и мобильных браузеров Зависимости в планах тестирования (последующий URL в зависимости от ответа сервера) Имитации реальных пользователей (задержки между соединениями, ограничение скорости соединений) WAPT – профили тестирования Название профиля Виртуальных Время на Add users per пользователей “раздумья” second / сессия между кликами (сек) Connection speed Старт, max users, long TT, slow connection 2800 9 - 25 10 256k DSL Старт, mid users, short TT, fast connection 450 0-5 5 Max Authorized users 200 9 - 25 5 256k DSL Non-Authorized users 1800 9 - 25 5 256k DSL WAPT – отчеты Авторизованные сессии Неавторизованные сессии Avg page exec time (PHP), sec Avg response time, sec (with page elements) Pages Pages per second Hits Hits per second Active users Sessions Sessions per second HTTP errors, %, не более По всем сессиям 0,058 0,28 0,075 0,09 0,644 0,105 0,135 616149 8198999 8815149 7,1 94,9 102,0 2 054 456 40 655 930 42 710 386 23,80 471,00 494,33 40 260 300 20 515 341 429 361 944 0,24 3,95 4,19 0,05 Не забываем о родных инструментах Инструменты тестирования в «Битриксе» Нюансы… Полноценные длительные нагрузочные тесты проводите в близких к «боевым» условиях (импорты, бэкапы и т.п.) Проводите тесты на полном наборе данных В идеале – распределенные тесты Совсем в идеале – территориально распределенные Каким бы идеальным не был сценарий – он будет лишь «искусственным» повторением боевой нагрузки Например, влияние «Веб-аналитики» На 12-часовом тесте – значительно падение скорости генерации страниц: • потребление mysqld до 120% ядра CPU • load average – до 12-13 «Веб-аналитика» Максимальное время выполнения у запроса к B_STAT_SESSION, который выполняется по индексу (IP_FIRST_NUMBER,DATE_STAT типа Date). Генерация нагрузки – с одного IP адреса. Соответственно индекс обладал нулевой избирательностью. Для исправления ситуации (приближения к реальной жизни), изменим случайным образом данные в таблице B_STAT_SESSION: mysql > update b_stat_session set IP_FIRST_NUMBER = FLOOR(1520000000 + RAND() * (232669)); Резюме Обязательно проводите полноценное нагрузочное тестирование перед стартом проекта В процессе эксплуатации быстро определить «запас» «узких» мест можно с помощью простых инструментов (ab, встроенный тест «Битрикса») Для полноценных тестов – инструменты, максимально близко имитирующие пользователей Перед выкладыванием апдейтов на «бой» проводите нагрузочные тесты Чем серьезнее меняется логика приложения – тем тщательнее должен быть тест (в идеале – полноценный суточный) Проводите тесты, имея настроенную систему мониторинга Спасибо за внимание! Вопросы? Александр Демидов demidov@1c-bitrix.ru +7-926-521-3700 @demidov http://www.1c-bitrix.ru