Как выполнить тест производительности веб-сервера?

Знаете ли вы среднее время отклика вашего сайта? Знаете ли вы, сколько одновременных пользователей может обслуживать ваш сайт?

Нагрузочное тестирование необходимо для того, чтобы веб-приложения знали емкость веб-сайта. Если вы собираетесь выбрать веб-сервер, то первое, что вам нужно сделать, это выполнить нагрузочное тестирование и посмотреть, какой из них подходит вам лучше всего.

Сравнительный анализ может помочь вам принять решение;

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

Существует несколько онлайн-инструментов для проведения стресс-теста; однако, если вы ищете собственное решение или хотите оценить только производительность веб-сервера, вы можете использовать ApacheBench и, в качестве альтернативы, некоторые из перечисленных ниже инструментов.

Я использовал веб-сервер Apache и Nginx, размещенный на DigitalOcean чтобы проверить это.

ApacheBench

ApacheBench (ab) — это программа командной строки с открытым исходным кодом, которая работает с любым веб-сервером. В этом посте я объясню, как установить эту небольшую программу и выполнить нагрузочный тест для сравнения результатов.

Апачи

Давайте установим ApacheBench с помощью команды yum.

yum install httpd-tools

Если у вас уже есть httpd-tools, вы можете игнорировать это.

Теперь давайте посмотрим, как он работает для 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

Давайте проверим то, что мы сделали для 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-разрядная версия. Вы можете попробовать несколько комбинаций версии ОС и веб-сервера для достижения оптимальных результатов.

Не нравится ApacheBench по какой-либо причине? Не беспокойтесь, есть много других, которые вы можете использовать для загрузки HTTP.

ОСАДА

ОСАДА — это утилита нагрузочного теста HTTP, поддерживаемая в UNIX. Вы можете поместить несколько URL-адресов в текстовый файл для загрузки тестов. Вы можете установить siege с помощью 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 секунды. Вы можете настроить параметр нагрузочного теста в зависимости от вашей цели.

Али

Али — относительно новый инструмент нагрузочного тестирования для выполнения анализа в реальном времени. Он поддерживает несколько платформ для установки, включая 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, продолжительность теста, ограничение скорости, время ожидания и многое другое. Я сделал быстрый тест с помощью toadmin.ru Tools, и вот результат.

Отчет является интерактивным и предоставляет подробную информацию о задержке.

Гобенч

Гобенч написан на языке Go и представляет собой простую утилиту для нагрузочного тестирования для оценки производительности веб-сервера. Он поддерживает более 20 000 одновременных пользователей, чего нет у ApacheBench.

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.

Вы можете контролировать количество подключений, запросов, продолжительность, рабочих, время ожидания, скорость подключения и предлагать множество вариантов для тестирования ваших веб-приложений.

Curl-погрузчик

кудрявый загрузчик написан на 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-запросов.

Цунг

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

Создание отчета возможно с Tsung.

Вывод

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

Далее, не забывайте следить за производительностью вашего сайта.