HTTPListener против собственной производительности HTTP - PullRequest
9 голосов
/ 16 декабря 2010

Краткая справка: я понимаю, что HTTPListener использует драйвер ядра http.sys, который якобы делает его отличным исполнителем. Однако при выполнении некоторых тестов производительности между управляемым http-сервером и нативным сервером vc ++ я наблюдаю увеличение примерно на 15 МБ / с на нативной стороне. Тестовая установка - две лабораторные машины, недавно отформатированные с 1-гигабитной сетью. На нативной стороне я вижу около 110 МБ / с, что близко к 100% от суммы «минус», при использовании HTTPListener я вижу ~ 94 МБ / с (максимум 100).

Тесты от яблок к яблокам,

  • оба отправляют одинаковую полезную нагрузку (~ 120 МБ)
  • Я использую одно и то же управляемое клиентское приложение для тестирования обоих серверов
  • Для Managed я отключил Nagle (но тестировал оба способа, результат один и тот же)
  • Я запускаю серию тестов и вычисляю пропускную способность. Интересно отметить, что отклонение управляемой стандартизации больше, то есть результаты не такие согласованные по сравнению с нативными.

В целом, я ожидаю, что смогу приблизиться к 110 МБ / с собственного сервера через HTTPListener, 15 МБ / с кажется довольно дорогостоящим.

Вопросы: 1. Есть ли другие оптимизации для управляемого, которые мне не хватает? 2. Каковы некоторые потенциальные узкие места, я посмотрел на HTTPResponseStream через отражатель, похоже, что происходит некоторое маршалинг, но нет явных проблем. На самом деле, при использовании чанкинга он создает такой же массив чанков, что и мой собственный сервер.

Любые идеи приветствуются,

1 Ответ

1 голос
/ 21 января 2011

Тот факт, что он использует Http.sys, не означает, что нет перехода от нативной к управляемой.Из вышеупомянутой статьи MSDN:

HTTP.sys обеспечивает управление подключениями, регулирование пропускной способности и ведение журнала веб-сервера.

Благодаря тому, что вы работаетеуправляемый код, у вас есть взаимодействие (родное для управляемого, не путать с COM-взаимодействием), у вас есть сборка мусора и т. д. Он никогда не будет таким быстрым, как чистая нативная реализация c ++.

РЕДАКТИРОВАТЬ: Комусделайте это более понятным, вы все еще запускаете процесс .NET, вы просто подключаетесь к IIS в режиме ядра, а не в режиме пользователя.Отличная статья по этому вопросу находится здесь: http://www.west -wind.com / presentation / howaspnetworks / howaspnetworks.asp

...