Приклад тесту навантаження з Apache JMeter

Розробники-початківці досить рідко роблять тестування навантаження сайтів і веб-додатків. І буває так, що при збільшені онлайну сайт в найбільш відповідальний момент починає гальмувати.

Чому б не уникнути цих неприємностей, провівши тест навантаження?

Напевно, когось зупиняє невірне уявлення про те, що тестування навантаження – це дуже складна справа, що вимагає спеціальних знань. Однак, якщо є вибір – тестувати не надто професійно, або не тестувати зовсім, я б обрав перше. Тим більше, що організувати примітивний тест навантаження дуже просто. Можна скористатися онлайн-засобами, а можна виконати все своїми руками, це ненабагато складніше.

Для прикладу візьмемо програму Apache JMeter. JMeter є дуже потужним інструментом навантажувального тестування з можливістю створення великої кількості запитів одночасно завдяки паралельній роботі на декількох комп’ютерах. Підтримує плагіни, за допомогою яких можна значно розширити функціонал. Завантажити JMeter можна за посиланням з офіційного сайту, для запуску потрібно розпакувати і запустити \bin\jmeter.


Запустивши програму, ліворуч бачимо 2 пункти – Test Plan і WorkBench. Додамо Thread Group в Test plan, що дозволить керувати потоками (тобто, симулювати кроситувачів). Для цього потрібно натиснути правою клавішею на Test plan – Add – Threads (Users) – Thread group.

1

Додамо HTTP Request Defaults, який призначений для налаштування запиту для тестування. Зробити це можна, натиснувши правою кнопкою миші по Thread Group і обравши Add – Config Element – HTTP Request Defaults.

В елементі HTTP Request Defaults в поле Server name введемо адресу сайта, який збираємось тестувати. В нашому випадку це “myrasp.com”.

Теперь необхідно додати Recording Controller, що буде записувати наші дії для подальшого відтворення (Thread Group – Add – Logic Controller – Recording Controller)

Виберемо WorkBench і додамо HTTP(S) Test Script Recorder (Add – Non-Test Elements – HTTP(S) Test Script Recorder)


Примітка! Для деяких старих сайтів, що містять явну назву з закінченням .html без переадресації, або для інших потреб необхідно натиснути на кнопку “Add” в розділі “URL Patterns to Include”. Це створить пустий запис, в який потрібно ввести “.*\.html”


Додамо відображення наших результатів запису (HTTP(S) Test Script Recorder – Add – Listener – View Results Tree)

Повернемося до HTTP(S) Test Script Recorder і натиснемо кнопку Start унизу. Цим ми почнемо запис наших дій в браузері.


Тепер необхідно налаштувати браузер для роботи з Apache JMeter. Для цього відкриваємо браузер (в моєму випадку це Mozilla Firefox) і обираємо налаштування. Тут потрібно відкрити налаштування мережі.

В новому вікні необхідно обрати ручні налаштування, ввести в поле адреси “localhost”, а в поле порту – “8080” та відмітити пункт про використання даних налаштувань для всіх протоколів, та зберегти внесені зміни.


Нарешті ми можемо розпочати запис. Для цього в браузері перейдемо за адресою myrasp.com і виконаємо певну активність (попереходимо між сторінками, поклікаємо на різні кнопки тощо). Цей сайт використовує кешування інформації для авторизації, тому немає необхідності застосовувати плагін JMeter-а для цього.

Recording Controller записав нашу активність (більш докладно можна подивитися в View Results Tree) і ми майже готові розпочати тестування навантаження.

Лише додамо елементи для перегляду результатів Summary Report (Thread Group – Add – Listener – Summary Report) і Graph Results (Thread Group – Add – Listener – Graph Results).

Перейдемо до Thread Group. Виберемо кількість потоків (користувачів) – 5, час приєднання нового користувача встановимо значення 10 (секунд), а в кількість циклів поставимо значення 50.

Перед кожним запуском необхідно виконати наступні дії:

  • Ctrl-S для збереження
  • Ctrl-E для очищення минулих результатів
  • Ctrl-R, власне, для запуску (також можна використовувати кнопку Run – Start)

Після виконання тесту можемо подивитися результати. Зайдемо в Graph Results і проаналізуємо.

Значення надані в мілісекундах:

  • Data – час відповіді кожної окремої одиниці даних тобто кожного перевіреного url.
  • Average – усереднений час відгуку, об’єктивний графік зміни навантаження.
  • Median – значення медіани (використовується в статистиці).
  • Deviation – похибка, стандартне відхилення.
  • Throughput – пропускна здатність виконуваних запитів.

Для роботи досить значень Average і Throughput, які відобразять навантаження на веб-сервер і пропускну здатність запитів. За графіком вище видно, що час відповіді приблизно 400мс і не росте, тобто, сервер нормально витримує навантаження в 5 віртуальних користувачів. А ось що вийде, якщо їх буде 50:

Час відгуку значно збільшується.

Summary Report може відобразити статистику по кожному індивідуальному url окремо.

У стовпці Average бачимо середній час відгуку, логічно припустити, що чим час більший – тим більше навантаження на даний url. Часто виявляється що є кілька важких сторінок, які в першу чергу і створюють навантаження на систему, і якщо їх оптимізувати, загальна продуктивність багаторазово збільшується (краще всього починати оптимізацію зі сторінок, які за статистикою викликаються часто, а відпрацьовують довго).

View Result in Table відобразить результат у вигляді таблиці, тут вказано час, а також статус (успішно / неуспішно).

При виникненні помилки причину можна перевірити в View Result Tree. Необхідно зайти туди і знайти цей рядок. Там можна побачити причину помилки. В нашому випадку помилок немає, а інформація зображається там в наступному виді:

На цьому тестування завершено. В ході нього ми перевірили сайт на навантаження і отримали дуже наочні результати.

  1 коментар до “Приклад тесту навантаження з Apache JMeter

  1. Влад
    9 Червня, 2015 at 02:42

    Гарна інфа, раніше не міг знайти такого наочного прикладу)

We #StandWithUkraine.
Learn how you can help too!

#Stand­With­Ukraine

We don't know how long the war will last. But what we do know is that we can't stand aside and watch.

The fastest way you can help too is to support Ukraine financially. The National Bank of Ukraine (NBU) has opened a multi-currency account for that purpose. Learn more

This account accepts donations in US, Canadian and Australian dollars, euros, British pounds, Swiss francs, yuan and yen.

UA823000010000032302338301027

Also accepting cryptocurrency donations – the fastest way to help. Learn more

BTC – 357a3So9CbsNfBBgFYACGvxxS6tMaDoa1P

ETH, USDT (ERC-20) – 0x165CD37b4C644C2921454429E7F9358d18A45e14

Spread the word!