WCF не может достичь 100% CPU.Что является узким местом? - PullRequest
4 голосов
/ 17 ноября 2011

Я тестирую собственный хост-сервис nettcp WCF, делая запросы из 50 потоков в сервис, расположенный не на том же компьютере Проблема в том, что загрузка процессора никогда не превышает 35% на Xeon E3-1270. Когда я запускаю тот же тест на двухъядерном ноутбуке, он достигает 100%.

Метод WCF ничего не делает, поэтому он не должен ограничиваться IO. Я пытался увеличить количество потоков, но это не помогает. Каждый поток создает сервисный канал и выполняет тысячи вызовов, используя этот экземпляр канала.

Вот класс обслуживания, которым я пользуюсь:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class TestService : ITestService
{
    public void Void()
    {
        // DO NOTHING
    }
}

Configs:

ServiceThrottlingBehavior: MaxConcurrentCalls = 1000 MaxConcurrentInstances = 1000, MaxConcurrentSessions = 1000

NetTcpBinding ListenBacklog = 2000 MaxConnections = 2000

1 Ответ

1 голос
/ 22 ноября 2011

Я бы попробовал изменить ваш InstanceContextMode на PerCall . Я уверен, что ваши текущие настройки конфигурации будут игнорироваться, потому что WFC только когда-либо создает единственный экземпляр вашего класса и обрабатывает их по порядку. С PerCall новый экземпляр будет создаваться для каждого запроса, пока не будет достигнуто максимальное количество потоков или предел вашей конфигурации. Вам также не понадобится настройка netTcpBinding, но сохраняйте поведение Throttling, но убедитесь, что вы правильно настроили пропорции, иначе это может иметь неблагоприятные последствия.

  • MaxConcurrentCalls: 16 * Количество процессоров
  • MaxConcurrentSessions: 100 * Количество процессоров
  • MaxConcurrentInstance: Sum (116 * Количество процессоров)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...