Как потоки связаны с запросами через Http.sys, IIS и ASP.NET - PullRequest
20 голосов
/ 30 января 2011

Я сейчас много читаю о node.js.Существует частое сравнение между серверами, использующими традиционную модель потока на запрос (Apache), и серверами, которые используют цикл обработки событий (Nginx, узел, Tornado).

Я хотел бы подробно узнать о том, как выполняется запрособрабатывается в ASP.NET - с момента его получения в http.sys вплоть до его обработки в самом ASP.NET.Я обнаружил, что документации MSDN по http.sys и IIS немного не хватает, но, возможно, мой гугл-фу сегодня слаб.На данный момент лучший ресурс, который я нашел, - это пост в Блог Томаса Марквардта .

Может ли кто-нибудь пролить свет на эту тему или указать мне на другие ресурсы?

(Для целей этого вопроса меня интересует только IIS7 с типичным интегрированным конвейером)

1 Ответ

7 голосов
/ 30 января 2011

По моим исследованиям, насколько я понимаю, когда приходит запрос, он помещается в очередь запросов режима ядра.Согласно this , это позволяет избежать многих проблем с переключением контекста при большом количестве запросов (или процессов или потоков ...), обеспечивая аналогичные преимущества для вечернего ввода-вывода.Цитируется из статьи:

"Каждая очередь запросов соответствует одному пулу приложений. Пул приложений соответствует одной очереди запросов в HTTP.sys и одному или нескольким рабочим процессам."

Таким образом, в соответствии с этим каждая очередь запросов может иметь более одного « рабочего процесса ».(Кеш Google) Подробнее о рабочих процессах

Насколько я понимаю:

  • IIS Opens создает очередь запросов (см. API http.sys ниже)
  • «Веб-сайт», настроенный в IIS, соответствует одному рабочему процессу
  • Веб-сайт / рабочий процесс разделяет пул потоков.
  • Передается потокзапрос из очереди запросов.

Вот много полезной информации об архитектуре IIS7

Вот еще немного информации о http.sys.

Открытые вопросы, которые у меня все еще есть:

  • Как, черт возьми, IIS меняет заголовок сервера, если он использует HTTP.SYS?( См. Этот вопрос )

Примечание. Я не уверен, соответствует ли / как "очередь запросов режима ядра" порту завершения ввода-вывода , я бы предположил, что у каждого запроса будет свой, но я не знаю, поэтому я искренне надеюсь, что кто-то ответит на этот вопрос более тщательно.Я только что наткнулся на этот вопрос , и кажется, что http.sys фактически использует порты завершения ввода-вывода, которые должны обеспечивать почти все те же преимущества, что и вечерний ввод-вывод (node.js, nginx, lighttpd, C10K,и т.д ...) есть.

...