WCF хостинг и производительность - PullRequest
2 голосов
/ 07 марта 2011

У меня есть сервис WCF. Я провел некоторое тестирование с привязкой basichttp и tcp.

В консольном клиенте я создал сотни потоков и запустил службу с привязкой tcp и http. Оказалось, что TCP в два раза быстрее, чем http.

Затем я создал веб-клиент, который работает на IIS и запускает службу. Оказалось, что http быстрее, чем TCP.

Как это происходит? Разве TCP не должен быть быстрее, чем basichttp? Код похож на приведенный ниже. похоже.

stopwatch start here

Thread[] ts = new Thread[100];  
for(int i= 0; i< ts.lenght;i++){  
  ts[i] = new Thread(foo);  // replace with bar for the second test.
  ts[i].start();  
}

for(int i 0;i< ts.lenght;i++){  
  ts[i].join();  
}  

stopwatch stop here.

public static void foo(){  
MyServiceClient myclient = new MyServiceClient("netTcpBinding");  
myclient.GetResult(1);  
} 

public static void bar(){
MyServiceClient myclient = new MyServiceClient("basicHttpBinding");
myclient.GetResult(1);
}

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

Знаете ли вы, что в WCF включено регулирование по умолчанию . Перед запуском этих тестов вы должны отключить его, используя этот бит конфигурации в разделе serviceModel вашего web.config:

<behaviors>
  <serviceBehaviors>
    <behavior> <!-- can omit name in .NET 4 -->
      <serviceThrottling 
        maxConcurrentCalls="10000" 
        maxConcurrentSessions="100000" 
        maxConcurrentInstances="100000" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Значения по умолчанию варьируются в зависимости от версии, но составляют примерно 16, 10, 100 или что-то в этом духе в .NET 4. Эти более низкие значения по умолчанию применяются , даже если у вас нет записи регулирования в вашем файле web.config /. app.config.

Удачи.

0 голосов
/ 09 июля 2011

Я думаю, что проблема в хостинге . По умолчанию в .NET используется определенное количество рабочих потоков в пуле потоков , которое может быть переопределено процессом перед созданием задач потока. учитывая, что ваш второй тест находится в IIS , который до WCF4 в сочетании с AppFabric по умолчанию HTTP, IIS из-за природы зверя вполне может изменить число рабочих по умолчанию резьб.

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

Как правило, вы не должны создавать больше рабочих потоков, чем количество ядер на машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...