Як виконати тестування продуктивності веб-сервера?

Оцінка продуктивності веб-сайту: вибір інструментів для тестування навантаження

Чи відомо вам, скільки часу в середньому потрібно вашому веб-сайту для відповіді на запит? Чи можете ви точно сказати, скільки одночасних відвідувачів здатний обслужити ваш ресурс?

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

Проведення порівняльного аналізу дає змогу:

  • Виявити найбільш ефективний веб-сервер.
  • Визначити необхідну кількість серверів для обробки конкретної кількості запитів.
  • Знайти конфігурацію, що забезпечує найкращу продуктивність.
  • З’ясувати, які технологічні стеки працюють найефективніше.
  • Прогнозувати, коли ваш веб-сайт може почати працювати повільніше або навіть вийти з ладу.

Хоча існує чимало онлайн-сервісів для проведення стрес-тестування, використання власних інструментів, таких як ApacheBench, може виявитися більш корисним. Це особливо актуально, якщо вам потрібно порівняти продуктивність різних веб-серверів.

У цьому дослідженні я протестував веб-сервери Apache та Nginx, використовуючи DigitalOcean як хостинг.

ApacheBench: детальний аналіз продуктивності

ApacheBench (ab) – це консольна утиліта з відкритим кодом, сумісна з будь-яким веб-сервером. Далі я продемонструю, як її встановити та використовувати для тестування навантаження, щоб порівняти результати.

Налаштування ApacheBench

Для встановлення ApacheBench скористаємось командою yum:

yum install httpd-tools

Якщо інструменти httpd вже встановлені, цей крок можна пропустити.

Проведемо тест з 5000 запитів при паралельному виконанні 500 запитів:

[[email protected] ~]# ab -n 5000 -c 500 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software:        Apache/2.2.15
Server Hostname:        localhost
Server Port:            80
Document Path:          /
Document Length:        4961 bytes
Concurrency Level:      500
Time taken for tests:   13.389 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Non-2xx responses:      5058
Total transferred:      26094222 bytes
HTML transferred:       25092738 bytes
Requests per second:    373.45 [#/sec] (mean)
Time per request:       1338.866 [ms] (mean)
Time per request:       2.678 [ms] (mean, across all concurrent requests)
Transfer rate:          1903.30 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0   42  20.8     41    1000
Processing:     0  428 2116.5     65   13310
Waiting:        0  416 2117.7     55   13303
Total:         51  470 2121.0    102   13378
Percentage of the requests served within a certain time (ms)
50%    102
66%    117
75%    130
80%    132
90%    149
95%    255
98%  13377
99%  13378
100%  13378 (longest request)
[[email protected] ~]#

Як видно з результатів, Apache обробив 373 запити за секунду, а загальний час виконання тесту склав 13.389 секунди.

Це значення дає початкове розуміння можливостей конфігурації сервера. Порівняння цих результатів з результатами після внесення змін у конфігурацію дозволить оптимізувати продуктивність.

Аналогічне тестування для Nginx

Проведемо ідентичний тест для Nginx, щоб ви могли порівняти їх ефективність:

[[email protected] ~]# ab -n 5000 -c 500 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software:        nginx/1.10.1
Server Hostname:        localhost
Server Port:            80
Document Path:          /
Document Length:        3698 bytes
Concurrency Level:      500
Time taken for tests:   0.758 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      19660000 bytes
HTML transferred:       18490000 bytes
Requests per second:    6593.48 [#/sec] (mean)
Time per request:       75.832 [ms] (mean)
Time per request:       0.152 [ms] (mean, across all concurrent requests)
Transfer rate:          25317.93 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    6  11.0      2      53
Processing:     5   19   8.2     17      53
Waiting:        0   18   8.2     16      47
Total:         10   25  17.4     18      79
Percentage of the requests served within a certain time (ms)
50%     18
66%     21
75%     21
80%     22
90%     69
95%     73
98%     75
99%     76
00%     79 (longest request)
[[email protected] ~]#

Результати вражають! Nginx обробив 6593 запити за секунду. Очевидний переможець.

Просте порівняння двох веб-серверів дозволяє отримати чітке уявлення про їхню продуктивність і допомагає зробити обґрунтований вибір для вашої веб-програми.

Тестування проводилось на CentOS 6.8, 64 bit. Для оптимальних результатів можна експериментувати з різними комбінаціями операційних систем та веб-серверів.

Якщо ApacheBench з якихось причин не підходить, існує велика кількість альтернативних інструментів для тестування HTTP-навантаження.

Альтернативні інструменти для тестування навантаження

Облога (Siege)

Облога – це Unix-утиліта для тестування навантаження HTTP. Вона дозволяє використовувати декілька URL-адрес з текстового файлу. Інсталювати Облогу можна за допомогою yum:

# yum install siege

Запустимо тест з 500 одночасними запитами протягом 5 секунд:

[[email protected] ~]# siege -q -t 5S -c 500 http://localhost/
Lifting the server siege...      done.
Transactions:                       4323 hits
Availability:               100.00 %
Elapsed time:                       4.60 secs
Data transferred:        15.25 MB
Response time:                    0.04 secs
Transaction rate:       939.78 trans/sec
Throughput:                         3.31 MB/sec
Concurrency:                      37.97
Successful transactions:        4323
Failed transactions:                0
Longest transaction:            1.04
Shortest transaction:            0.00
[[email protected] ~]#

Розшифруємо параметри:

-q – тихий режим (без детальної інформації про запит)

-t – тривалість тестування 5 секунд

-c – 500 одночасних запитів

Як бачимо, доступність становить 100%, а час відгуку – 0,04 секунди. Параметри тестування можна налаштувати відповідно до вашої мети.

Алі (Ali)

Алі – це сучасний інструмент для тестування навантаження в реальному часі. Він підтримує різні платформи, включно з Docker.

Після встановлення запустіть ali для перегляду інструкції з використання.

[email protected]:~# ali
no target given
Usage:
  ali [flags] <target URL>

Flags:
  -b, --body string         A request body to be sent.
  -B, --body-file string    The path to file whose content will be set as the http request body.
      --debug               Run in debug mode.
  -d, --duration duration   The amount of time to issue requests to the targets. Give 0s for an infinite attack. (default 10s)
  -H, --header strings      A request header to be sent. Can be used multiple times to send multiple headers.
  -k, --keepalive           Use persistent connections. (default true)
  -M, --max-body int        Max bytes to capture from response bodies. Give -1 for no limit. (default -1)
  -m, --method string       An HTTP request method for each request. (default "GET")
  -r, --rate int            The request rate per second to issue against the targets. Give 0 then it will send requests as fast as possible. (default 50)
  -t, --timeout duration    The timeout for each request. 0s means to disable timeouts. (default 30s)
  -v, --version             Print the current version.

Examples:
  ali --duration=10m --rate=100 http://host.xz

Author:
  Ryo Nakao <[email protected]>
[email protected]:~#

Алі дозволяє налаштовувати HTTP-заголовки, тривалість тестування, обмеження швидкості, час очікування. Для прикладу, нижче представлені результати тестування techukraine.net Tools.

Звіт є інтерактивним та надає детальну інформацію про затримку.

Gobench

Gobench – це простий інструмент тестування навантаження, написаний на Go. Він дозволяє моделювати понад 20 000 одночасних користувачів, що недоступно для ApacheBench.

Apache JMeter

JMeter – один з найпопулярніших інструментів з відкритим кодом для вимірювання продуктивності веб-додатків. Це Java-додаток, який можна використовувати не тільки для веб-серверів, а й для PHP, Java, ASP.net, SOAP, REST тощо.

JMeter має зручний графічний інтерфейс. Остання версія 3.0 вимагає Java 7 або новішу. Якщо ваша мета – оптимізувати продуктивність веб-додатка, JMeter – це чудовий вибір.

wrk

wrk – це ще один інструмент для вимірювання продуктивності. Він надає інформацію про затримку, кількість запитів за секунду, швидкість передачі даних тощо.

wrk дозволяє проводити тестування з використанням кількох потоків. Наприклад, виконаємо тест протягом 5 хвилин з 500 одночасними користувачами в 8 потоках:

wrk –t8 –c500 -d300s http://localhost

Autocannon

Натхненний wrk, autocannon написано на Node.js. Його можна використовувати програмно через API або як окрему утиліту. Для використання потрібен NodeJS.

Autocannon дозволяє керувати з’єднаннями, запитами, тривалістю, робочими потоками, часом очікування, швидкістю з’єднання та надає багато можливостей для порівняння продуктивності веб-сайтів.

curl-loader

curl-loader написано на C для імітації навантаження на додатки та підтримує SSL/TLS. Окрім тестування веб-сторінок, цей інструмент також можна використовувати для FTP-серверів.

Можна створити план тестування з комбінацією HTTP, HTTPS, FTP та FTPS в одній пакетній конфігурації.

httperf

httperf – це інструмент з високою продуктивністю, який фокусується на тестах мікро- та макрорівня. Він підтримує протоколи HTTP/1.1 та SSL.

Якщо ви знаєте орієнтовну кількість одночасних користувачів і хочете перевірити, чи може ваш веб-сервер обробити певну кількість запитів, можна скористатись наступною командою:

httperf --server localhost --port 80 --num-conns 1000 --rate 100

Ця команда протестує 100 запитів за секунду для 1000 HTTP-запитів.

Tsung

Tsung – це багатопротокольний інструмент для розподіленого стрес-тестування. Він може створювати навантаження на HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL. Tsung підтримує HTTP/1.0, HTTP/1.1 та автоматичну обробку файлів cookie.

Tsung може генерувати звіти.

Висновок

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

Не забувайте регулярно відстежувати ефективність вашого веб-сайту.