WCF сервис под IIS. Проблемы производительности.
От: alex303  
Дата: 30.08.17 15:52
Оценка:
... уже всю голову сломал... Может у кого есть какие соображения?

Вообщем, имеется WCF сервис, который имеет ровно один метод,и этот метод делает Task.Delay(5000).Wait() — ждет пять секунд и возвращает результат.
Сервис хостится под честным IIS (window 10)

Есть клиент, который в 10 потоках, одновременно дергает этот метод.

Наблюдаю такую картину:
1. Запустилось десять потоков, случилось десять запросов к сервису
2. Через пять секунд только ТРИ(!) клиентских потока получили ответ.
3. Еще через пять секунд еще три клиентских потока получили ответ.
4. .. и так далее.

Как с этим бороться? Есть такое ощущение, что во всем виноват IIS, ибо:

1. Если запускать сервис как self-hosted — то все работает как надо — через пять секунд все 10 клиентский запросов получают ответ.
2. Если увеличить число рабочих потоков пула IIS например до 2, до через пять секунд ответ получают уже шесть клиентских запросов. Но webgarden не вариант.

Код примерно такой:

Сервис

    [ServiceContract]
    public interface IService1
    {

        [OperationContract]
        string GetData(string context, int value);
    }

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)]
    public class Service1 : IService1
    {
        private int instance;

        public string GetData(string context, int value)
        {
            Interlocked.Increment(ref instance);
            var debugOutput = string.Format("SERVICE. Context: '{0}' {1}, Thread: {2}, Instance: {3}, Time: {4}", context, value,
                Thread.CurrentThread.ManagedThreadId, instance, DateTime.Now.ToLongTimeString());
            Debug.WriteLine(debugOutput);
           
            Task.Delay(5000).Wait();

            return string.Format("response: {0}", value);
        }
    }


Клиент
    class Program
    {
        static void Main(string[] args)
        {
            ThreadCall(10, 1);
        }

        private static void ThreadCall(int threadCount, int callsPerThread)
        {
            var tasks = new List<Func<Task>>();
            for (var i = 0; i < threadCount; i++)
            {
                var context = "thread_" + i;
                tasks.Add(() => Task.Factory.StartNew(() => SequentalCall(context, callsPerThread)));
            }
            Task.WaitAll(tasks.Select(x => x()).ToArray());
        }

        static void SequentalCall(string context, int count)
        {
            for (var i = 0; i < count; i++)
            {
                using (var client = new TestServiceReference.Service1Client())
                {
                    Console.WriteLine("thread: {0}", Task.CurrentId);
                    var sw = Stopwatch.StartNew();
                    var r = client.GetData(context, i);
                    WriteResult(sw.ElapsedMilliseconds, context, i, r);
                }
            }
        }

        private static void WriteResult(long elapsedMs, string context, int value, string result)
        {
            Console.WriteLine("[{0}: {1} ms] call ({2}) = '{3}'", context, elapsedMs, value, result);
        }
    }



конфиги стандартные.
добавлял в behavior

<serviceThrottling maxConcurrentCalls="100" maxConcurrentInstances="100" maxConcurrentSessions="100"/>


не помогло
net wcf iis
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.