Высокопроизводительный сайт ASP.NET(> 1000 запросов/второй)

Я пишу высокопроизводительный ASP.NET Json API со скоростями > 1000 запросов/вторых. Вся моя логика и обработка выполняются в IHttpHandler. Я измерялся через Секундомер, а обработчик заканчивал запрос примерно 0,1 - 0,5 миллисекунды.

Но похоже, что IIS и/или другие HTTPHandlers (Модули?) отнимают много производительности. Могу ли я это измерить? Сколько накладных расходов будет производиться в IIS при настройке для максимальной производительности?

Удалит все эти HTTPHandlers, или есть другие трюки, чтобы ускорить его? Мне не нужна большая часть ASP.NET-функций, кроме Session (может даже обойти это, если это даст значительное повышение производительности).

Ответы

Ответ 1

Измерение производительности веб-сервера не является тривиальной задачей. Несколько вещей, которые следует учитывать:

  • Найдите фактическое узкое место. Это может быть память, доступ к диску, кэширование, доступ к базе данных, латентность сети и т.д. Чтобы узнать, используйте профилировщик памяти или другой профайлер производительности.
  • Используйте WireShark, чтобы узнать разницу между тем, как долго длится запрос на вашем компьютере и как долго выполняется ваш код.
  • Попробуйте другие конфигурации. Дайте ASP.NET больше памяти. Обновите тестовую систему. I.e., переход от 8 ГБ /2,5 ГГц с 600 запросами/сек до 16 ГБ /3,0 ГГц может дать 6500 запросов/сек. Рост производительности часто не является линейным. См. этот документ из Microsoft.
  • Рассмотрим добавление дополнительной машины. Это может привести к повышению производительности на 50 или даже выше в зависимости от того, как вы его настроите. См. Снова этот документ из MS.
  • Проверьте эти подсказки Jon Skeet. В потоке комментариев также обнаруживаются некоторые неочевидные потенциальные узкие места.

ПРИМЕЧАНИЕ 1. Знайте свои инструменты. ASP.NET запускает каждый запрос в своем потоке. Обмен потоками происходит быстрее, чем процесс обмена, но он все еще требует времени. Если другие обработчики занимают время, потому что они находятся в цепочке запросов, полезно отключить их.

ПРИМЕЧАНИЕ 2: одной из исходных сторонних задач stackoverflow было создание сайта в ASP.NET, который имел большую производительность на серверах с максимальным количеством 2 и мог обрабатывать > 1Mln посетителей в час. Им это удалось. Я считаю, что они написали на нем несколько блогов, но я не помню, где они находятся.

Ответ 2

Это очень хороший вопрос. Я заметил то же самое, как только вы попали в один миллисекундный диапазон откликов, накладные расходы ASP.NET начинают заметны. Я могу подтвердить ваше наблюдение.

Что я сделал успешно, так это выяснить, какие HttpModules зарегистрированы (с помощью диспетчера IIS) и отключить все из них, от которых я мог бы избавиться. Стандартный конвейер ASP.NET имеет множество модулей и функциональных возможностей.

Если вам нужна максимальная производительность, вы, конечно, можете использовать крошечную библиотеку HTTP-сервера и избавиться от почти всех накладных расходов. Это было бы так невероятно быстро.