Есть ли способ протоколировать использование потоков пула потоков IIS? - PullRequest
1 голос
/ 11 февраля 2012

Я хочу увидеть, когда именно поток из пула будет введен в игру и когда он будет освобожден.

Мне нужно изучить поведение сторонней библиотеки, чтобы решить, следует ли мневозиться с его асинхронными методами.Если эти методы блокируют потоки из общего пула, то их использование не даст никаких преимуществ для приложений ASP.NET.Библиотека запутана, поэтому я не хочу искать ответ с помощью декомпилятора.

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Если вы надеетесь на какое-либо событие или публичный хук, который расскажет вам о том, что делают потоки ThreadPool, к сожалению, такого нет.

Я могу подумать о двух других подходах, которые могут помочь:

Во-первых, вы можете проверить значение результата workerThreads из ThreadPool.GetAvailableThreads() до и после вызова вашей библиотеки. Если значение изменяется, библиотека может быть виновником. Скорее всего, это имеет смысл в тестовой среде, где вы обрабатываете только один запрос. Вы также можете сохранить число workerThreads в пользовательском счетчике производительности Windows и отслеживать его с течением времени - возможно, используя его для сравнения одного подхода с другим.

Вот ссылка на статью, описывающую подход счетчика производительности:

http://msdn.microsoft.com/en-us/library/ff650682.aspx

Если вы используете IIS 7+, другой возможностью является отключение MaxConcurrentRequestsPerCPU (через HostingEnvironment в .NET 4.0+ или через файл aspnet.config в .NET 3.5 или более поздней версии), установив его на ноль. и установите MaxConcurrentThreadsPerCPU на относительно небольшое число и измерьте производительность вашего приложения под нагрузкой, используя один интерфейс в вашей библиотеке по сравнению с другим. Если запросы попадают в очередь из-за нехватки потоков, время отклика соответственно увеличивается. Детали того, как это сделать, и какие измерения, к сожалению, нужно выполнить, зависят от структуры вашей библиотеки и веб-запросов.

1 голос
/ 14 февраля 2012

То, как вы задаете вопрос, похоже на то, что вам нужен отладчик, который контролирует вашу программу.

Теперь внутри вашей программы вы знаете, когда вызываете поток из пула и когда вы его освобождаете - не так ли?

Если вы не управляете программой, вы хотите видеть ипроследить другие программы, то это звучит как общий отладчик.Это можно сделать с помощью хуков, использующих c / c ++ и много кода.

Обозреватель процессов из sysinternals может предоставить вам открытые потоки в режиме реального времени, если вы нажмете на пул и увидите свойства.

С другой стороны, я думаю, что ThreadPool.GetAvailableThreads может дать вам информацию, которую вы запрашиваете, в тот момент, когда вам это нужно.

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getavailablethreads.aspx

Если вы можете датьеще немного информации о том, что вы действительно пытаетесь заархивировать и сузить свой вопрос, от обычной программы отладки до более целенаправленной потребности.

...