Настройка веб-приложений C#: PerformWaitCallback

Я использую dotTrace Performance 4.5 для профилирования веб-приложения .NET 3.5 C#. Когда я записываю один «пользовательский запрос» (загрузку страницы), я вижу 11 потоков с примерно одинаковым временем, 7644 мс.

  • Большинство описаний цепочек содержат только: 100 % [собственный или оптимизированный код] — 7644 мс.
  • Один говорит: 100% Microsoft.VisualStudio.WebServer.WebServerApp.Main(String[])
  • Last one reads:
    • 86% System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object)
    • 14% PerformWaitCallback (1094 ms) >> 12% = ProcessRequest

Можешь мне ответить:

  • Почему так много тредов? (ресурсы изображений, AJAX, JavaScript)
  • Что такое PerformWaitCallback?
  • Почему 7644 мс всего за 1094 мс работы?

person Francois    schedule 21.11.2011    source источник
comment
Вы измеряете только один запрос? Вы должны запустить приложение и выполнить несколько запросов; есть неотъемлемые накладные расходы, связанные с запуском веб-приложения.   -  person casperOne    schedule 21.11.2011
comment
Я разогреваю приложение перед профилированием одного запроса. Я получаю аналогичные результаты, если запускаю несколько запросов (N x 8 сек).   -  person Francois    schedule 21.11.2011
comment
Вероятно, это зависит от того, используете ли вы IIS, IIS Express или Web Development Server.   -  person Uwe Keim    schedule 22.11.2011
comment
Эта трассировка выполняется с помощью WebDevServer.   -  person Francois    schedule 22.11.2011
comment
для лучшего тестирования используйте IIS, также есть очень полезный профилировщик памяти ANTS Profiler от RedGate, я предпочитаю использовать его   -  person Sleiman Jneidi    schedule 01.12.2011


Ответы (2)


Что касается PerformWaitCallback, вот что говорит справочный источник:

Позвонить помощнику. Эта функция отправляет запросы на пользовательские обратные вызовы. Рабочие элементы извлекаются из очереди для каждого приложения в цикле до тех пор, пока не закончится работа или не истечет квант времени. Квант применяется для обеспечения справедливости среди доменов приложений.

Вы можете увидеть полный код здесь.

Кстати, я не уверен, что вы увидите это в .NET 4.5 - опять же из справочного источника (не удалось найти онлайн-версию, вам придется загрузить ее с http://referencesource)..microsoft.com/):

//This type is necessary because VS 2010's debugger looks for a method named 
///_ThreadPoolWaitCallbacck.PerformWaitCallback 
//on the stack to determine if a thread is a ThreadPool thread or not.  
//We have a better way to do this for .NET 4.5, but
//still need to maintain compatibility with VS 2010.  
//When compat with VS 2010 is no longer an issue, this type may be removed.
internal static class _ThreadPoolWaitCallback
{ 
    [System.Security.SecurityCritical]
    static internal bool PerformWaitCallback() 
    { 
        return ThreadPoolWorkQueue.Dispatch();
    } 
}
person Ohad Schneider    schedule 20.05.2013

Почему так много тредов? (ресурсы изображений, AJAX, JavaScript)

Веб-сервер создает пул потоков для управления входящими запросами, и в пуле есть несколько потоков.

Что такое PerformWaitCallback?

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

Почему 7644 мс всего за 1094 мс работы?

Похоже, что профайлер подсчитывает время, которое некоторые потоки тратят на ожидание новой работы. Я не использовал dotTrace, но у большинства профилировщиков есть способ настроить их, чтобы они могли определить, когда потоки находятся в ожидании, а когда работают — на основе информации, которую вы разместили, я подозреваю, что профайлер настроен не совсем правильно.

person RickNZ    schedule 03.12.2011
comment
Извините за мой поздний ответ, но я работал над проблемами производительности. Если я слежу за IIS с помощью DotTrace, то будет уже не PerformWaitCallback, а System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr, Int32) с той же разницей во времени... - person Francois; 13.03.2012