Нагрузочное тестирование сервера необходимо для того чтобы выяснить какой максимальный трафик может выдержать используемая конфигурация веб-сервера.
На сервере может использоваться 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, который был сгенерирован сразу после установки пакета.
Список адресов, к которым будет обращаться утилита нужно задать в ~/etc/urls.txt. Также можно использовать флаг -f и передать путь к файлу с адресами в виде -f /home/list.txt
Команда запуска тестирования в общем случае может выглядеть так:
siege -v -d2 -c 100 -i -t3600S -f /home/list.txt
Нагрузочное тестирование сервера при помощи siege дает наиболее близкие к реальным результаты.
Но полностью доверять им нельзя поскольку поведение пользователей утилитой все таки не симулируется, симулируются только запросы, что не уменьшает ценности этого и других подобных инструментов.
С их помощью можно подобрать максимально устойчивую архитектуру для оптимальной работы проекта.
Читайте про тестирование с помощью Jmeter.