Как увеличить количество потоков, используемых .NET Remoting через TCP?

Мы пытаемся увеличить количество потоков, используемых .NET Remoting over TCP. Мы попытались изменить ThreadPool.SetMinThreads, но наши стресс-тесты показывают, что .NET Remoting может обрабатывать только около 100 одновременных запросов. (Однако это не является жестким пределом). В диспетчере задач мы видим, что процесс Remoting Server увеличивается с 11 до 80, а затем после стресс-теста падает до 11. Мы запускаем приложение ASP.NET 4.0.

Ответ 1

Подводя итог. Удаленный сервер размещается службой Windows и удаленным клиентом IIS. Для проведения стресс-тестов вы используете Apache Bench, который вызывает удаляющего клиента, который вызывает удаленный сервер. Вы заметили, что на удаленном сервере обрабатывается не более 100 одновременных запросов, хотя вы увеличиваете максимальное количество потоков в пуле потоков на удаленном сервере.

Если все, что я сказал, верно, я думаю, что здесь ничего не происходит, то есть IIS также имеет ограничение на потоки, которые могут использоваться для обработки запросов. Вы можете отправить 1000 запросов от Apache Bench к удаленному клиенту, но только, например, 100 из них будут обрабатываться одновременно. Я подозреваю, что это может быть причиной.

Чтобы увеличить количество потоков для IIS, я предлагаю вам попробовать:

  • Проверьте конфигурацию (см. question).
  • Попробуйте использовать SetMinThreads в IIS.

Последний комментарий с моей стороны заключается в том, что вы должны помнить, что ни слишком малое количество потоков, ни слишком большое количество потоков в пуле потоков не являются хорошими. Обе ситуации могут повредить производительность.

Ответ 2

Проверьте возвращаемое значение в SetMinThreads.

Если вы укажете отрицательное число или число, большее максимального количества потоков потоков активных потоков (полученных с использованием GetMaxThreads), SetMinThreads возвращает false и не изменяет ни одно из минимальных значений. (ссылка)

Ответ 3

Вы уверены, что узким местом являются потоки, а не сетевые соединения..? По умолчанию, у сети есть довольно ограниченное количество сокетов, доступных для удаленного IP-адреса. Это относится к удалению, http (WCF, клиенты веб-сервиса) и т.д.

Вы можете переопределить это под управлением system.net/connectionManagement в вашем app config/web.config, если это то, что вы видите, например:

<configuration>
...
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="1000"/>
    </connectionManagement>
  </system.net>

Подробнее об этом параметре конфигурации можно найти здесь: https://msdn.microsoft.com/en-us/library/fb6y0fyc%28v=vs.110%29.aspx