site-speed-2
При разработке веб приложений, будь то личные блоги, интернет магазины или многофункциональные порталы, полезно знать, какую нагрузку они смогут выдерживать. Основной задачей любого тестирования производительности сайта является понимание его устойчивости к нагрузкам, которые могут появляться не только из-за большого количества посетителей онлайн, но и являться следствием некорректной настройки сервера, неправильной работы скриптов или действиями злоумышленников (DOS, DDOS).
В рамках текущей статьи я познакомлю вас с начальным уровнем тестирования без симуляции поведения реальных пользователей, зато быстрого и дающего общие представления о производительности сайта. Для этого мы будем использовать ab (Apache Benchmark).

Ab — небольшая утилита, входящая в пакет apache2-utils, но предустановленная во многих современных дистрибутивах. Она не требует привилегированного доступа к системе и на фоне более гибких конкурентов крайне неприхотлива.
Если в вашей системе ab еще не установлен, самое время сделать это:
 

Синтаксис команды следующий:
 

Список всех опций (ключей) будет внизу статьи, а сейчас мы познакомимся с реальными примерами работы утилиты.
Самыми важными ключами для любого тестирования являются ключ n — количество запросов страницы и ключ c — количество конкурентных запросов. Запустим утилиту с этими ключами.
 

После завершения работы утилиты мы увидим подобный вывод:
Рассмотрим вывод построчно:

Server Software — информация о frontend сервере, переданая в http head.
Server Hostname — имя тестируемого хоста.
Server Port — порт подключения.Document Path — относительный путь без названия хоста.
Document Length — длина возвращенного документа.Concurrency Level — количество конкурентных запросов из ключа c.
Time taken for tests — время, затраченное на тест.
Complete requests — количество выполненных запросов. Если тест прошел без обрывов, значение совпадает с ключом n.
Failed requests — количество запросов с ошибками. В рамках теста ошибки разделяются на четыре типа — ошибки соединения, ошибки передачи, ошибки длины возвращенных данных, исключения). Про ошибки длины стоит добавить, что если тестируемая страница меняет свое содержимое при обновлении, т.е. является динамической, добавляйте ключ -l.Write errors — ошибки записи. Сюда также часто сыпятся ошибки Broken pipe.
Non-2xx responses — ответы с не 2хх кодами. Т.е. ошибочные либо умышленно, либо в результате проблем на сервере.
Total transferred — общий объем переданных данных
HTML transferred — объем переданных HTML данных
Requests per second—  среднее количество обработанных в секунду запросов.
Time per request — среднее время обработки запроса.
Time per request — среднее время обработки запроса учитывая конекурентность.
Transfer rate — скорость передачи данных.Connection Times (ms)  — время соединения в миллисекундах
Столбцы: min — минимальное время, mean[+/-sd] — среднеквадратическое отклонение, median — среднее время, max — максимальное время.
Строки: connect — время соединения с сервером, processing — время обработки запроса, waiting — полное время ожидания, включая processing и время ожидания в очереди, total — общее время выполнения запроса.
Percentage of the requests served within a certain time (ms) — доля запросов, выполненных в определенное время. В нашем случае   50% всех запросов было обработано за 19 миллисекунд, а интервал до 27 миллисекунд выолнились все 100% запросов.
  50%     19
  66%     20
  75%     20
  80%     20
  90%     24
  95%     25
  98%     26
  99%     27
 100%     27 (longest request)
Основными показателями эффективности работы сайта я бы выделил Requests per second, Time per request и не сильный разрыв в графике доль запросов. Важно помнить, что географическая удаленность до сервера играет важную роль при анализе показаний, так что если ваш сервер располагается в дальних и не очень странах, не стоит расстраиваться времени выполнения до 200 мс, главное — отсутствие странных перекосов последней секции.
Ниже представлен список поддерживаемых опций ab. Их использование во многом способствует конкретизации тестов, так что не стоит ими пренебрегать.
 

Стандартный сценарий тестирования — последовательный запуск теста ab с увеличением конкурентных запросов и мониторинг зависимости полученных значений. Если вы хотите просто протестировать работу вашего PHP, достаточно создать файл с содержанием <?phpinfo();?> и натравить тест на него.
Если при наращивании конкурентных запросов вы получаете ошибку
достаточно выполнить
и лимит подключений увеличится до 8192.