Apache jMeter – нагрузочное тестирование веб-сервера

Автор: | 08/04/2013

jmeter_logoApache jMeter представляет собой утилиту для тестирования Apache-сервера и связанных с ним сервисов. Аналог – Apache Benchmark, о котором рассказано в статье Apache Bench: тестируем работу веб-сервера. Однако jMeter предоставляет намного больше возможностей, потому на нём оставимся подробнее.

Для его работы требуется Java и x-server на машине, с которой будет проводиться тестирование.

Загружаем архив со страницы http://jmeter.apache.org/download_jmeter.cgi

Распаковываем:

$ tar xpf apache-jmeter-2.9.tgz
$ cd apache-jmeter-2.9

Содержимое выглядит так:

# ls -l
total 168
drwxr-xr-x 3 root root   4096 Apr  5 12:45 bin
drwxr-xr-x 5 root root   4096 Apr  5 12:45 docs
drwxr-xr-x 2 root root   4096 Apr  5 12:45 extras
drwxr-xr-x 4 root root   4096 Apr  5 12:45 lib
-rw-r–r– 1 root root 138299 Jan 24 13:21 LICENSE
-rw-r–r– 1 root root   1632 Jan 24 13:21 NOTICE
drwxr-xr-x 6 root root   4096 Apr  5 12:45 printable_docs
-rw-r–r– 1 root root   5731 Jan 24 13:21 README

Для запуска выполняем:

$ ./bin/jmeter.sh

Нагрузочное тестирование сервера с помощью Apache jMeter

Переименуем наш тест в KZ test 1.

Кликаем правой кнопкой на KZ test 1 и добавляем новую группу тестов и способов просмотра/анализа – Add > Treads(Users) > Thread group:

Нагрузочное тестирование сервера с помощью Apache jMeter

Добавим простой тест – HTTP request.

Для этого кликаем правой кнопкой на Thread Group -> Add -> Sampler -> HTTP Request:

Нагрузочное тестирование сервера с помощью Apache jMeter

Теперь добавляем в тест средства отображения:

  • Thread Group->Add->Listener->View Results in Table
  • Thread Group->Add->Listener->View Results in Tree
  • Thread Group->Add->Listener->Graph Results
  • Thread Group->Add->Listener->Aggregate Report

Выбираем View Results in Table и в поле Write results to… укажем путь к нашему log-file /home/setevoy/jmeter.log – полезно при сбоях и для последующего анализа проблем:

Нагрузочное тестирование сервера с помощью Apache jMeter

Сохраняем эту схему – Ctrl+S или File -> Save:

Нагрузочное тестирование сервера с помощью Apache jMeter

Очистим всё (на первый раз можно не выполнять) что бы удалить резултаты предыдущих тестов Run -> Clear all или Ctrl+E.

Для интереса откроем просмотр лога Apache на тестируемом сервере:

# tail -f /var/log/apache2/access.log

Запускаем тест – Run -> Start.

Видим в логе поток записей типа:

194.***.***.214 – – [05/Apr/2013:14:07:59 -0400] “GET / HTTP/1.1” 200 515363 “-” “Apache-HttpClient/4.2.3 (java 1.5)”

Перейдём в View results in Table в окне jMeter-a:

Нагрузочное тестирование сервера с помощью Apache jMeter

Смотрим Status колонку – должно быть OK.

Всё работает, добавим нагрузки. Переходим в Thread Group и установим Number of threads (users)- 20, Ramp-Up period – 60, справа от Loop Count Forever ставим галочку.

С такими настройками будет эмулировано подключение 20-ти пользователей в течении 60-ти секунд:

Нагрузочное тестирование сервера с помощью Apache jMeter

Сохраняем настройки – Ctrl+S и Сtrl+E что бы очистить старые данные. Для запуска нажимаем Ctrl+R:

Нагрузочное тестирование сервера с помощью Apache jMeter

Посмотрим на вывод top сервера:

top – 14:13:54 up 3 days, 5 min,  3 users,  load average: 14.81, 4.03, 1.36
Tasks: 136 total,  21 running, 115 sleeping,   0 stopped,   0 zombie
Cpu(s): 96.8%us,  2.1%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.2%hi,  0.9%si,  0.0%st
Mem:   4063160k total,  1212044k used,  2851116k free,   134872k buffers
Swap:  1740792k total,        0k used,  1740792k free,   389924k cached

Когда считаем что достаточно, останавливаем выполнение – Run -> Stop и идём в  View results in Table:

Нагрузочное тестирование сервера с помощью Apache jMeter

На Graph results можно посмотреть графики “отзывчивости” сервера:

Нагрузочное тестирование сервера с помощью Apache jMeter

Значения предоставлены в миллисекундах:

Data — время отклика на каждый выполненный запрос.
Average — среднее время отклика сервера, объективный график нагрузки.
Median — значение медианы (используется в статистике, этими данными можно не пользоваться).
Deviation — погрешность, стандартное отклонение.
Throughput — скорость выполнения самого запроса.

На странице View results Tree наблюдаем такую картину:

Нагрузочное тестирование сервера с помощью Apache jMeter

Если завис сам jMeter (случается) – убиваем процесс, перезапускаем, правой кнопкой на Test Plan – Open:

Нагрузочное тестирование сервера с помощью Apache jMeter

Кстати, пока jMeter “висит” – процесс тестирования обычно продолжается, что чревато неприятными последствиями, если тестируете рабочий сервер.

Теперь выполним тестирование с помощью access.log файла с сервера, который мы предварительно скачали к себе на компьютер.

Отключим выполнение HTTP Request кликнув правой кнопкой на нём и выбрав Disable.

Добавляем Thread Group->Add->Sampler->Access Log Sampler.

Указываем сервер и путь к лог-файлу:

Нагрузочное тестирование сервера с помощью Apache jMeter

В Thread Group уменьшим Number of Trhreads (users).

Запускаем:

Нагрузочное тестирование сервера с помощью Apache jMeter

Что бы подробнее почитать что за ошибки – переходим на View Results Tree и выделяем нужную строку с ошибкой:

Нагрузочное тестирование сервера с помощью Apache jMeter

Среднее время отклика (Average) растет, а скорость обработки (Throughput) не меняется. Это значит, что где-то на сервере операции становятся в очередь и производительности не хватает, чтобы обслужить все запросы.

Вернёмся к HTTP Request – выполняем Access Log Sampler > Disable, HTTP Request > Enable.

Ещё один вариант работы Apache jMeter – повторять запросы, выполненные именно вами. Мы будем выполнять любые действия через браузер, и при этом все необходимые элементы HTTP Request будут создаваться без нашего участия.

Добавляем Recording Controller (Thread Group -> Add -> Logic Controller -> Recording Controller).

Далее добавим HTTP Cookie Manager (Thread Group -> Add -> Config Element -> HTTP Cookie Manager). С помощью этого элемента будет реализована работа с сессиями через cookie.

Нагрузочное тестирование сервера с помощью Apache jMeter

Добавляем элемент HTTP Proxy Server (UPD: в новом Apache JMeter он называется HTTP(S) Test Script Recorder“) Добавлять его надо в раздел WorkBench (WorkBench -> Add -> Non-Test Elements -> HTTP Proxy Server), так как непосредственно в ходе тестирования этот элемент не будет принимать участия. Он нам нужен только, чтобы создать сценарии тестов.

Нагрузочное тестирование сервера с помощью Apache jMeter

По сути здесь достаточно только изменить номер порта прокси-сервера, если порт по умолчанию 8080 у вас уже занят, например, можно поставить 8089. Если оставить в графе Target Controller значение Use Recording Controller, то все запросы, проходящие через прокси, будут записываться в первый попавшийся Recording Controller в нашем тест-плане. Но так как на данный момент он там всего один, то нас этот вариант устроит.

Настраиваем браузер, в примере – Firefox: Edit -> Preferences -> Advanced, вкладка Network -> Settings.

Устанавливаем localhost 8080:.

jMeter_test20

В окне с настройками HTTP Proxy Server нажимаем на кнопку Start, что бы запустить сам proxy:

Нагрузочное тестирование сервера с помощью Apache jMeter

Идём тестировать – логинимся на какой-либо странице сервера, который тестируем:

Нагрузочное тестирование сервера с помощью Apache jMeter

Выполняем какие-либо действия – переходим по страницам, пользуемся поиском и прочее, после чего останавливаем прокси и идём в Recording Controller, что бы посмотреть что у нас записалось – тут все страницы и действия, которые выполнялись в браузере:

Нагрузочное тестирование сервера с помощью Apache jMeter

В Thread Group у нас уже всё настроено.

Ctrl+S что бы сохранить все действия и настройки.

Можно найти страницу login.php и посмотреть сформированный запрос:

Нагрузочное тестирование сервера с помощью Apache jMeter

Запускаем – Сtrl+R:

Нагрузочное тестирование сервера с помощью Apache jMeter

В целом – тестирование можно считать завершённым. Вообще, возможностей у Apache jMeter действительно много. Все они описаны на оф. странице.

Ссылки по теме:

http://habrahabr.ru

http://habrahabr.ru

http://habrahabr.ru

http://jmeter.apache.org