Я настраиваю сервер и нуждаюсь в руководстве. Этот сервер предоставляет следующие функции:
- страница ASPX с вызовом БД, которая загружается примерно каждые 3 минуты на несколько тысяч машин
- простой веб-сайт администратора ASP.NET, используемый небольшим количеством людей, но он должен быть высокодоступным
- служба WCF, которая обеспечивает синхронизацию файлов с несколькими тысячами клиентов с помощью сообщений BasicHttpBinding и Streamed.
Когда обновление доступно для клиентов синхронизации файлов (# 3), они нападают на сервер, требуя новых данных. Без агрессивного регулирования они поглощают все доступные рабочие потоки ASP.NET и приводят к зависанию №1 и №2. Это, как говорят дети, sux0rs.
Я воспроизвел эту проблему на сервере 4-proc. С тестовым клиентом, создающим 100 одновременных загрузок, я вижу, что одновременно выполняется 48 загрузок; в perfmon я вижу остаток в очереди в ASP.NET-> Запросы в очереди приложений. Это соответствует стандартной настройке «12 одновременных потоков на процессор», описанной в этой статье . Процессор и память выглядят нормально; это действительно просто перемещение байтов без обработки.
На мой взгляд, есть пара вещей, которые я мог бы сделать, возможно, на концерте.
- Увеличение maxIOThreads и maxWorkerThreads в machine.config
- Настройка веб-сада
- Повторите клиент, чтобы загрузки обрабатывались напрямую, а не через WCF (например, ссылка непосредственно на файл вместо потоковой передачи в сообщении).
Мои вопросы:
- Помимо проб и ошибок, каковы хорошие рекомендации по увеличению количества потоков, учитывая, что каждый из них будет использоваться в течение довольно длительного времени при низком использовании ЦП / памяти? Если я пойду по этому пути, как мне обеспечить, чтобы переключение задач для увеличенного числа потоков не перегружало систему и не вызывало больше проблем?
- Может ли веб-сад помочь в этой ситуации?
- Увижу ли я гораздо лучшую производительность, если я получу загрузку из WCF и позволю IIS полностью ее обработать?
Best, roufamatic