Вы не можете обработать больше запросов, чем у вас процессорных ядер. «Быстрые» масштабируемые решения включают настройку пулов потоков, где количество активных (не заблокированных в IO) потоков == количество ядер ЦП. Поэтому создание 100 потоков из-за того, что вы хотите обслуживать 100 запросов MSMQ, не очень хороший дизайн.
Windows имеет механизм пула потоков, называемый IO Completion Ports .
Использование портов завершения ввода-вывода действительно подталкивает проект к одному процессу, так как в многопроцессном проектировании каждый процесс будет иметь свой собственный пул потоков порта завершения ввода-вывода, которым он будет управлять независимо, и, следовательно, вы можете получить гораздо больше потоков, конкурирующих за Ядра процессора.
«Основная» идея порта завершения ввода-вывода заключается в том, что он является очередью режима ядра - вы можете вручную отправлять события в очередь или автоматически получать асинхронные завершения ввода-вывода, связывая дескрипторы файлов (файлов, сокетов, каналов). с портом.
С другой стороны, механизм IO Completion Port автоматически распределяет события по ожидающим рабочим потокам, но он НЕ удаляет очереди из заданий, если обнаруживает, что текущие «активные» потоки в пуле потоков> = число ядер ЦП.
Использование портов завершения ввода-вывода потенциально может значительно увеличить масштабируемость службы, однако обычно выигрыш намного меньше ожидаемого, поскольку другие факторы быстро вступают в действие, когда все ядра ЦП конкурируют за другие ресурсы служб.
Если ваши службы разрабатываются на c ++, вы можете обнаружить, что сериализованный доступ к куче является большим минусом производительности - хотя в версии 6.1 Windows, похоже, реализована куча с низким уровнем конкуренции, так что это может быть меньше проблем.
Подводя итог - теоретически ваш наибольший прирост производительности был бы за счет проектирования с использованием пулов потоков, управляемых в одном процессе. Но вы сильно зависите от библиотек, которые вы используете, чтобы не сериализовать доступ к критически важным ресурсам, что может быстро лишить вас всех теоретических приростов производительности.
Если у вас есть библиотечный код, сериализующий службу с хорошим пулом (как в случае сериализации создания и уничтожения объектов c ++ из-за конфликта в куче), вам нужно изменить использование библиотеки / switch на версию библиотеки с низким уровнем конкуренции или просто масштабировать к нескольким процессам.
Единственный способ узнать это - написать контрольные примеры, которые по-разному влияют на работу сервера, и измерить результаты.