
Привіт друзі! Як ви могли помітити, мене дуже цікавить тема тестування продуктивності (performance testing). Дуже цікавить тема порівняння тулів для тестування навантаження за різних умов (про що вже готую пости). Поміж іншим, вже деякий час не дає покою питання, наскільки реалізація клієнта впливає на тестування (як тільки прочитав, що в черговій версії Locust буде реалізовано fastHttp клієнт). Тому вирішив провести низку тестів одного продукту одним тулом, але з різними налаштуваннями.
І почати хочу з JMeter – я вибрав для нього 4 тести. Перші 2 – за замовчанням http sampler може використовувати HttpClient4 (має бути по замовчанню) чи Java.

Ще одне питання – якщо ми навантажуємо статичну сторінку, наскільки кешування впливає на результати тесту? В налаштуваннях Thred Group можна відключити опцію за замовчанням – Same user on each iteration:

Тому я розробив простий тест: 1 запит головної сторінки, 3000 користувачів, 150 сек, ніяких затримок між запитами.
Test PC | Target server (NAS) | Network |
CPU AMD Ryzen 7 4800H 2.9 Ghz RAM 16 Gb Windows 10 2004 Pro x64 Java 8 | CPU Intel Celeron J1900 2 Ghz RAM 8 Gb Nginx official docker image | 100 Mbps |
Результати тесту наступні:
Test | Throughput, rps | response time, ms | Errors, % |
HttpClient4 + Same user on | 6139 | 114 | 10 |
HttpClient4 + Same user off | 1130 | 608 | 26 |
Java+ Same user on | 4747 | 506 | 0.46 |
Java+ Same user of | 3577 | 137 | 3.32 |
Які висновки я роблю з тестів?
- Кешування сесії значно впливає на результат. Якщо у вас є необхідність нагенерячити якомога-більше унікальних запитів, а ресурсів на велику кількість користувачів чи розподілене тестування немає, то кешування варто вимкнути, але це призведе до зменшення продуктивності
- Жоден з проведених тестів не дає відповіді на головне питання – яка ж продуктивність сервісу, що тестувався. Тобто, незважаючи на можливості JMeter з навантаження з одного комп’ютера, результати нерепрезентативні. Щоб дійсно дізнатись продуктивність, треба провести розподілений тест з 2-3 машин.
- Java клієнт за одних і тих самих умов може видати менше навантаження, але при цьому в тесті буде менше помилок типу тих, що отримав я: NoHttpResponseException – failed to respond, SocketException – Connection reset, HttpHostConnectException – Connection timed out, BindException – Address already in use
Ще один висновок не слідує напряму з вказаних вище тестів, але пов’язаний з попередньою статтею, що я писав. В ній я тестував продуктивність Flask веб сервісу і він виявився в 10 разів менший за тестування статичної сторінки. Тобто ресурси JMeter фізично дозволяють робити велике навантаження навіть з одного комп’ютера. І воно буде тим більшим, чим продуктивніше працює веб сервіс. В зв’язку з чим в мене тепер є питання до читачів:
- якщо ви проводите тестування навантаження, ви частіше тестуєте веб сервіси чи статику?
- якщо не секрет, який зазвичай продуктивність веб сервісів/систем, що ви тестуєте? З мого досвіду тестування мікросервісів, зазвичай throughput в діапазоні від 1 до 1000 на DEV середовищі
Невеличкий спойлер – нарешті поставив собі другою системою Ubuntu – планую провести ті самі тести там, бо люди кажуть, що там трава зеленіша все працює краще. Вам цікаво?