Посредством мониторинга prometheus пытаюсь реализовать мониторинг нагрузки Angie в части кол-ва Active connections по отношению к максимальным (workers*ядра[auto]).
Задача - собирать данные по connections, что бы было понятно, когда их кол-во перегружает допустимые лимиты сервера.
Собрал дашборд и убедился, что метрики отдаются корректно. Данные тяну со страницы status.
Ранее тестировал на Nginx посредством Apache benchmark по нагрузке самого себя на localhost:
ab -n 30000000 -c 1020 http://127.0.0.1:443/
На Nginx active connections считываются корректно (так же тянется со страницы, которая отдается через vts модуль).
Но в Angie он почему при тех же условиям заполняет пул не active connections, а Idle и Accepted connetions.
В чем кардинальная разница между active и idle connections? Почему он нагружает idle в отличии от Nginx?
Есть ли какой то способ нагрузить active connections?
Active connections в nginx - это некорректное название для счетчика вообще всех открытых в настоящий момент соединений. В число active-соединений в nginx входят в том числе keepalive-соединения, которые на самом деле неактивны. Модуль vts возвращает ровно тот же самый счетчик, что не делает его корректным.
Это, кстати, было исправлено только в коммерческой версии nginx plus, там также есть idle отдельно и active считается иначе: Module ngx_http_api_module
И в Angie мы тоже это исправили аналогичным образом. Метрика active в Angie (и в nginx plus) - это число соединений в которых в данный момент происходит обработка запроса, а idle - это число соединений в которых нет активных запросов.
В nginx (и соответсвенно vts) метрика active - это по сути сумма active и idle.
Большие значения в счетчике active в случае Angie можно получить, только если сервер будет действительно нагружен и обработка запроса будет занимать заметное время.
Замечу также, что ab - очень медленный клиент, он работает медленнее чем сам Angie/nginx и просто неспособен с достаточной скоростью отправлять запросы и работать с множеством соединений. Пытаясь тестировать с помощью него Angie/nginx вы на самом деле проводите нагрузочное тестирование самого ab и измеряете производительность ab, а не веб-сервера.
Добавлю ещё, что просто нужно учесть, что если у вас размер ответа очень маленький и это не проксирование, а отдача какого-то статического файла или вообще директива return, то у вас запрос обрабатывается за доли миллисекунды, за одну итерацию цикла обработки событий. Т.е. счетчик active будет увеличен на 1, а через сколько-то тысячных от миллисекунды опять уменьшен на 1, т.к. запрос обработался и соединение перстало быть активным, а затем Angie приступает к обработке следующего запроса и так последовательно один за другим.
В таком случае в active никак не будет больших значений, т.к. во всех соединениях либо запросы были только что обработаны, либо обработка ещё не началась.
Чтобы получить большие значения active - это должна быть отдача по сети (а не через память в localhost) большого (десятки мегабайт) файла или проксирование какого-нибудь Wordpress например, где обработка запросов реально будет занимать какое-то значительное время.