Mgun - это инструмент тестирования нагрузки HTTP сервера.
Mgun создает заданное количество параллельных конкурентных сессий, затем выполняет HTTP запросы и аггрегирует результаты в таблицу. Параллелизм зависит от количества ядер процессора, чем больше ядер, тем выше параллелизм выполнения HTTP запросов.
Mgun позволяет создавать GET, POST, PUT, DELETE запросы.
Принципиальное отличие mgun от других инструментов тестирования нагрузки в том, что он позволяет создать сценарий из произвольного количества запросов, имитируя реальное поведение пользователя. Например, сценарий может иметь вид:
- Зайти на главную страницу сайта
- Авторизоваться
- Зайти в личный кабинет
- Изменить данные о себе
- Выйти
Запросы в таком сценарии будут выполняться последовательно, как если бы это делал пользователь.
Для создания сценариев используется конфигурационный файл в формате YAML.
Кроме последовательности запросов в конфигурационном файле можно указать таймаут и заголовки. Таймаут и заголовки могут быть, как глобальными для всех запросов, так и частными у каждого запроса.
Mgun написан на Go, поэтому для начала необходимо установить Go.
cd /path/to/gopath
export GOPATH=/path/to/gopath/
export GOBIN=/path/to/gopath/bin/
go get github.com/byorty/mgun
go install src/github.com/byorty/mgun/mgun.go
./bin/mgun -f example/config.yaml
1000 / 1000 [=============================================================================================================================================================] 100.00 %
Server Hostname: example.com
Server Port: 80
Concurrency Level: 100
Loop count: 1
Timeout: 30 seconds
Time taken for tests: 89 seconds
Total requests: 1000
Complete requests: 997
Failed requests: 3
Availability: 99.70%
Requests per second: ~ 2.99
Total transferred: 183MB
# Request Compl. Fail. Min. Max. Avg. Avail. Min, avg, max req. per sec. Content len. Total trans.
1. GET / 100 0 1.047s. 9.285s. 5.166s. 100.00% 1 / ~ 9.09 / 24 131KB 13MB
2. POST /signin 100 0 0.831s. 8.277s. 4.554s. 100.00% 1 / ~ 5.88 / 16 72B 7.2KB
3. GET /basket/ 100 0 0.268s. 22.094s. 11.181s. 100.00% 1 / ~ 1.67 / 4 61KB 15MB
4. GET /orders/ 100 0 0.390s. 31.168s. 15.779s. 100.00% 1 / ~ 1.82 / 5 58KB 17MB
5. GET /shoes?category=${categories} 98 2 1.089s. 31.546s. 16.318s. 98.00% 1 / ~ 1.72 / 6 476KB 49MB
6. GET /shoes?search=${search.shoes} 100 0 1.580s. 17.007s. 9.293s. 100.00% 1 / ~ 1.67 / 5 136KB 16MB
7. GET /shoes?id=${shoes.ids} 100 0 0.659s. 14.873s. 7.766s. 100.00% 1 / ~ 1.92 / 6 202KB 20MB
8. GET /friends/ 99 1 0.289s. 30.010s. 15.149s. 99.00% 1 / ~ 1.96 / 6 61KB 17MB
9. POST /friends/say?id=${frind.ids} 100 0 0.535s. 25.595s. 13.065s. 100.00% 1 / ~ 1.96 / 7 240KB 16MB
10. GET /friend?id=${frind.ids} 100 0 2.534s. 17.051s. 9.792s. 100.00% 1 / ~ 2.22 / 6 132KB 19MB