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

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

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

Порівняльний аналіз може допомогти вам прийняти рішення;

  • Який веб-сервер працює найкраще
  • Кількість серверів, які потрібно обслуговувати x кількість запитів
  • Яка конфігурація дає найкращі результати
  • Які стеки технологій працюють краще
  • Коли ваш сайт працюватиме повільніше або виходить з ладу

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

Я використовував веб-сервер Apache & Nginx, розміщений на DigitalOcean щоб перевірити це.

ApacheBench

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

Apache

Давайте встановимо 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 секунди.

  11 хороших посібників з Docker для початківців

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

Nginx

Давайте зробимо тест, який ми зробили для Apache, щоб ви могли порівняти, який з них працює краще.

[[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.

ОБЛОГА

ОБЛОГА це утиліта для перевірки навантаження HTTP, яка підтримується в UNIX. Ви можете розмістити кілька 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] ~]#

Щоб розбити параметри.

  Як увімкнути підтримку вікон розкладки в KDE Plasma 5

-q – запустити його тихо (не показуючи деталі запиту)

-t – бігти 5 секунд

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

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

Алі

Алі це відносно новий інструмент тестування навантаження для виконання аналізу в реальному часі. Він підтримує кілька платформ для встановлення, включаючи 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.

  Що таке мікросхема Apple M1 для Mac?

Apache JMeter

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

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

робота

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

За допомогою wrk ви можете вказати виконання навантажувального тесту з кількома потоками.

Розглянемо приклад виконання тесту протягом 5 хвилин із 500 одночасними користувачами з 8 потоками.

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

Автогармата

Натхненний роботою, автогармата написано на Node.js. Ви можете використовувати його програмно, через API або окрему утиліту. Все, що вам потрібно, це встановити NodeJS як передумову.

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

Локон-навантажувач

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

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

httperf

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

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

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

Наведена вище команда тестуватиме 100 запитів на секунду для 1000 запитів HTTP.

Цунг

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

З Tsung можна створити звіт.

Висновок

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

Далі не забувайте стежити за ефективністю свого сайту.