Нагрузочное тестирование сервера. siege и ab


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



На сервере может использоваться Apache с PHP как модуль mod_php или же с РНР в режиме fastcgi,  может использоваться Nginx + PHP-FPM или связка Nginx + Apache.


Каждый из возможных вариантов будет показывать различные результаты при нагрузочном тестировании и в production при разных версиях РНР (для которых могут применяться или не применяться акселераторы — такие как APC или opcache).



Нагрузочное тестирование сервера с помощью Apache Benchmark


ab — Apache HTTP server benchmarking tool, утилита позволяет определить максимальное количество одновременных запросов, которые сможет обработать веб-сервер в текущей конфигурации.

нагрузочное тестирование сервера

ab является частью пакета Apache и дополнительно устанавливать утилиту не нужно.

В качестве основного аргумента передается url к файлу с расширением .html или .php. При помощи ключа -n задается количество последовательных запросов, которые необходимо выполнить.


ab -n 1000 http://example.com:80/test.html



На выходе имеем примерно следующие результаты:

Concurrency Level: 1
Time taken for tests: 1.600 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 623000 bytes
HTML transferred: 183000 bytes
Requests per second: 666.58 [#/sec] (mean)
Time per request: 1.600 [ms] (mean)
Time per request: 1.600 [ms] (mean, across all concurrent requests)
Transfer rate: 321.14 [Kbytes/sec] received



В первой строке указано, что одновременно был выполнен только один запрос.

В условиях production такая ситуация маловероятна, поэтому утилиту лучше запускать также с ключом -c, определяющим количество клиентов одновременно выполняющих запрос к скрипту или странице и с ключом -k, определяющим необходимость симуляции keepalive соединений (актуально для php скриптов).


ab -n 1000 -k -с 1000 http://example.com:80/test.php


При обработке php результаты будут значительно хуже, потому что содержимое не статическое и у веб-сервера уходит время на обработку программного кода — разница заметна даже если в качестве скрипта использовать phpinfo().



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

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

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



Использование Siege при нагрузочном тестировании сервера


Siege является отдельной утилитой в отличие от ab. Количество обращений к url также можно задавать передавая в команде ключ со значением.


В утилита устанавливается просто  — из репозитория

apt-get install siege

После установки нужно выполнить команду, которая создаст в домашнем каталоге пользователя конфигурационный файл .siegerc. Его в дальнейшем можно редактировать

siege.config

New configuration template added to /home/admin/.siegerc
Run siege -C to view the current settings in that file

 



Часто применяемые опции и флаги Siege:


-g -URL — обеспечит обращение по указанному адресу и вернет заголовки

-v — вывод детальной информации с типом используемого протокола, адресом обращения и кодом ответа сервера

-c — количество пользователей, поведение которых имитируется (более 200-300 для большинства серверов устанавливать не стоит, но допустимы любые значения)

-i — режим имитации интернета, Siege будет случайным образом выбирать адреса из списка заданного администратором и обращаться к ним

-t — время тестирования (секунды — S, минуты — M, часы — H) передается как -t3600S

-d — задержка между последовательными запросами (например, -d1 обеспечит задержку в 1 секунду)



Многие опции можно задать в файле .siegerc, который был сгенерирован сразу после установки пакета.

использование siege


Список адресов, к которым будет обращаться утилита нужно задать в ~/etc/urls.txt. Также можно использовать флаг -f и передать путь к файлу с адресами в виде -f /home/list.txt



Команда запуска тестирования в общем случае может выглядеть так:

siege  -v -d2 -c 100 -i -t3600S -f /home/list.txt



Нагрузочное тестирование сервера при помощи siege дает наиболее близкие к реальным результаты.


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

С их помощью можно подобрать максимально устойчивую архитектуру для оптимальной работы проекта.



Читайте про тестирование с помощью Jmeter.

Сказать спасибо