none
WCF сервис и конкурентные потоки RRS feed

  • Вопрос

  • Вопрос следующий.

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

    Нашел такой параметр конфигурации как maxconcurrentcalls, установил его равным 4 и вроде как сервис стал работать так как мне надо. Т.е. действительно только 4 запроса обрабатываются одновременно.

    Однако, заметил такую вещь, в taskmgr видно что количество потоков постоянно увеличивается , т.е. такое ощущение что когда запросы приходят в  WCF сервис он не просто кладет их в очередь а ещё и создает поток для каждого запроса, но не запускает их на исполнение.

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

    Такая ситуация не особо нравится поскольку на создание потока расходуется память, а этого бы не хотелось.

    Кроме того, такая ситуация наблюдается только если поместить службу в ASP.Net приложение. Т.е. кога служба размещена в консольном приложении - такой ситуации нет.

    Кто знает подскажите что не так.


    6 марта 2013 г. 9:05

Ответы

  • При работе сервиса потоками управляет ThreadPool. Пул сам динамически определяет свой размер исходя из потребностей. Если необходимо вмешаться в этот процесс есть методы ThreadPool.SetMaxThreads и ThreadPool.SetMinThreads. Это позволяет установить диапазон количества выделяемых потоков.
    8 марта 2013 г. 10:10

Все ответы

  • Почитайте про Очереди в Windows Communication Foundation, может вам как раз подойдет.
    6 марта 2013 г. 9:35
  • "Хочется сделать WCF сервис который будет последовательно обрабатывать запросы. Т.е. хочется ограничить количество одновременно обрабатываемых запросов. Например приходит 100 запрос , а WCF сервис берет только скажем 4 и обрабатывает их в параллельных потоках, в то время как остальные стоят в очереди и ждут." - количество обрабатываемых в данный момент запросов понятие немного условное. И реально зависит от числа процессоров (ядер, виртуальных ядер). Т.е. у вас они одновременно будут обработаны ели есть 4 процессора. Если один процессор, то эти четыре потока будут чередоваться между собой (как и между другими потоками системы), пока не выполнятся.

    "Нашел такой параметр конфигурации как maxconcurrentcalls, установил его равным 4 и вроде как сервис стал работать так как мне надо. Т.е. действительно только 4 запроса обрабатываются одновременно." - ответил высше. Вот вам две полезные ссылки: первая и вторая. Вообще если нет острой необходимости, то лучше не вмешиваться в этот процесс. CRL очень грамотно управляет пулом потоков, поэтому необходимось вмешиваться в этот процесс возникает крайне редко. А в целях повышения производительности, можно использовать асинхронные запросы.

    6 марта 2013 г. 14:38
    Модератор
  • Про параллельность обработки потоков, которая зависит от количества реально присутствующих ядер - это все ясно).

    Просто забыл написать что имел ввиду именно это - т.е. ситуацию когда например есть реально 4 ядра и я хочу чтобы параллельно обрабатывались только 4 запроса.

    Но дело то как раз в том , что WCF действительно обрабатывает 4 запроса одновременно ( не больше и не меньше) , но почему то при этом создает много потоков. Т.е. такое ощущение что WCF берет первые 4 запроса , отдает их 4 потокам, потом когда запросы обрабатываются , WCF берет следующие 4 запроса и зачем-то создает новые потоки. вот. Таким образом (монитора эту ситуацию при помощи taskmgr) я заметил что количество потоков растет и это странно...

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

    Спасибо за ссылки, посмотрю. Однако вопрос пока остается открытым.

    7 марта 2013 г. 15:49
  • При работе сервиса потоками управляет ThreadPool. Пул сам динамически определяет свой размер исходя из потребностей. Если необходимо вмешаться в этот процесс есть методы ThreadPool.SetMaxThreads и ThreadPool.SetMinThreads. Это позволяет установить диапазон количества выделяемых потоков.
    8 марта 2013 г. 10:10
  • Разобрался , короче говоря ситуация возникала , если тестировать без настоящего IIS'а (т.е. с тем что встроен в VS) а вот в настоящем IIS никаких лишних потоков не создается и все круто.

    Кроме того использовать SetMinThreads и SetMaxThreads не обязательно , есть специальный раздел конфигурации - throttling

    25 марта 2013 г. 13:50
  • "Разобрался , короче говоря ситуация возникала , если тестировать без настоящего IIS'а (т.е. с тем что встроен в VS) а вот в настоящем IIS никаких лишних потоков не создается и все круто." - тут скорее всего дело в ваших конфигах, а то без разницы. Он называется немного иначе serviceThrottling, и вам ещё тогда дал ссылки на ответы, вы видимо не посмотрели.
    25 марта 2013 г. 14:05
    Модератор