Есть ли способ получить время, проведенное в очереди запросов в Kestrel/ASP.NET Core?

Насколько я понимаю, промежуточное ПО ASP.NET Core запускается, когда запрос готов к обработке. Но если приложение находится под нагрузкой и ASP.NET Core не может обрабатывать все запросы по мере их поступления, они где-то помещаются в «очередь»? Я не знаю, является ли это какой-то управляемой очередью внутри Kestrel или это как-то связано с libuv.

Я хотел бы знать, как долго данный запрос находится в этой очереди. Есть ли что-то в HttpContext, что может сказать мне об этом?

заранее спасибо


person ChrisBellew    schedule 10.02.2017    source источник
comment
Из интереса, почему время в очереди имеет значение?   -  person DavidG    schedule 13.02.2017
comment
Потому что я хочу отнести потерянное время, потраченное на выполнение запроса, к моей службе, чьи журналы в противном случае сообщают о быстром запросе. Например, клиент моего браузера может видеть, что для получения ответа потребовалось 2 секунды, но все журналы промежуточного программного обеспечения сообщают в общей сложности 200 мс. Мне нужны доказательства того, где был этот 1,8-й. Спасибо за внимание :)   -  person ChrisBellew    schedule 13.02.2017
comment
А с чего вы взяли, что пропущенное время связано с очередью запросов?   -  person DavidG    schedule 13.02.2017
comment
Это одна из возможностей. Может и не быть, но я этого не знаю.   -  person ChrisBellew    schedule 13.02.2017
comment
Я бы очень удивился, если бы это было так. Согласно некоторым тестам, Kestrel может обрабатывать 5 миллионов запросов в секунду.   -  person DavidG    schedule 13.02.2017
comment
Но мое приложение не может. Что происходит с запросами, пока мое приложение ожидает их обслуживания?   -  person ChrisBellew    schedule 13.02.2017
comment
Сколько потоков вы ему дали? Сколько запросов в секунду вы на него бросаете?   -  person DavidG    schedule 13.02.2017
comment
Я не изменил количество потоков по умолчанию. Он может обрабатывать около 200 об / с, а иногда случаются всплески и выше, может быть, 300-400. Я предполагаю, что запрос, которому не повезло прийти, когда происходит всплеск, попадет в очередь и будет ждать там.   -  person ChrisBellew    schedule 13.02.2017
comment
@ChrisBellew, тебе удалось что-нибудь получить? Я нахожусь в аналогичном супе, журналы моего сервера показывают, что запрос выполнен за 2 секунды, а клиент показывает, что это заняло 5 секунд. Откуда взялись лишние 3 в сети? Задержка, сетевая трансляция, передача полезной нагрузки, очередь и т. д.   -  person Shabbir    schedule 10.04.2017
comment
Извините, мне ничего не удалось найти   -  person ChrisBellew    schedule 10.04.2017


Ответы (1)


Этот вопрос не так прост.

Если вы хотите отслеживать все времена, вам нужно сделать много шагов. В начале добавьте уникальный штамп или галочки к запросам, чтобы вы могли идентифицировать их один за другим. Во-вторых, создайте обработчик, который перехватывает ваши запросы и регистрирует время. В-третьих, добавьте точку регистрации в каждый метод, связанный с запросом. В-четвертых - это будет сюрпризом - вы не можете сделать ничего серьезного, чтобы сократить это время, кроме конфигурации IIS в отношении многопоточности, параллельных запросов, обработки сеансов и т. д. Пятое - если ваш браузер измеряет 2000 мс, ваш сервер измеряет 200 мс, это не ядро ​​.NET, это ваш код/архитектура/конфигурация. Извините, что сообщаю вам плохие новости.

Используйте класс System.Diagnostics.Stopwatch для измерения времени.

person Dexion    schedule 14.02.2017