Использование Web Service клиента в многопоточном приложении?
У нас есть приложение, задача которого в нескольких потоков выполнять запросы к SOAP-сервису. Мы заметили, что при увеличении количества потоков, время на выполнение каждого запроса возрастает на порядок. Чтобы разобраться в чем причина, мы написал SOAP-extension — в результате выяснилось, что уже при 5 потоках на 16-процессорном сервере время на сериализацию составляет примерно 95% от времени запроса, при 10 потоках не дождались выполнения запроса (при 1 потоке время на запрос составляет примерно 150мс).
Кто сталкивался с подобным поведением? Есть подозрение, что внутри web-сервиса, или внутри сериализатора возникают «мертвые» блокировки.
P.S. На каждый поток создается свой отдельный экземпляр web-сервиса.
P.P.S. На десериализацию количество потоков вроде бы не влияет.
Если речь идет об использовании WCF сервиса, то надо учитывать, что по умолчанию без дополнительных аттрибутов сервис работает в PerCall instance режиме, но при этом в Single concurrency режиме. Что при нагрузке ведет к тому, что потоки выстраиваются в очереди. Поэтому чтобы поднять производительность сервиса, рекомендую выставить ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple).