Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > WCF - торможения принятия запроса при 100 одноврем


Автор: pasha1 15.5.2013, 16:13
Добрый день!) Столкнулся со следующей проблемой, при одновременно посылке 100 запросов сервер начинает тормозить принятия нового запроса первые 100 запросов запускают функцию которая выполняется 1 минуту и ждут окончание выполнение, 101 запросом я посылаю с браузера вызов краткой функции которая выводит строку и количество сколько запросов еще работает паралельно.

так вот после того как все 100 запросов принялись и работают в потоке, то 101 функция выполняется быстро и показывает что 100 потоков сейчас паралельно работают.

Затык именно в приеме запросов, просмотрел очень много информации в интернете, все вроде делаю как надо но все равно результата нет

использую NF 4.5

атрибуты класса установлены в паралельную работу Код C#

Код

[CallbackBehavior(UseSynchronizationContext = false)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, MaxItemsInObjectGraph = 2147483646)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

функция емуляции нагрузки на 1 минуту Код C#

Код

private static int threads11 = 0;

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
public string loadConcurency()
    {
        threads11++;
        var count = 0;
        while (count < 6000)
        {
            count++;
            Thread.Sleep(10);
        }
        threads11--;
        return "1";
    }

функция проверки статистики Код C#

Код

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json)]

public string ReportTest()
    {
        try
        {
            StringBuilder response = new StringBuilder().AppendLine("threads=" + threads11.ToString() + "; ");
            response.AppendLine();

            return response.ToString();
        }
        catch (Exception ex)
        {
            return ex.ToString() + (ex.InnerException == null ? "" : ex.InnerException.ToString());
        }
    }

serviceThrottling установлен очень высокий Код C#

Код

<behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="True" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceThrottling maxConcurrentCalls="3000" maxConcurrentSessions="30000" maxConcurrentInstances="3000" />
    </behavior>

Надеюсь кто встречался с такой проблемой и подскажет в чем беда или хоть даст советы куда еще можно копать.

Автор: pasha1 16.5.2013, 13:56
я не учел еще одного фактора это пул потоков ввода-вывода
по умолчанию минимальный пул равен количеству ядер процесора, например у меня он был равен 4
максимальное значение было 1023, но почему же тогда возникали проблемы когда я пытался сделать 100 потоков???

ответ в том что когда мы переходим за минимальный порог, сервер не сразу выделяет новый поток, а ждет около 0,5 секунды что освободится один из занятых, и только после этого если свободного таки не нашлось выделяет новый поток..
теперь взяв во внимания что я делаю 100 подключений которые нужно держать, то первые 4 принимаются на обработку мгновенно, остальные 96 занимают приблизительно 96 * 0,5 сек = 48 секунд, то есть следующий 101 мой проверочный вызов ждет 48 секунд!!!. Это плохо, но это сделано не просто так, именно такое значение минимального пула обеспечивает хорошую стабильность, и чтобы начинающий программист не боролся сразу с демонами ему обеспечивают такие условия...


решение:
ThreadPool.SetMinThreads(4, 100);

я уверен что мой ответ и мой труд будет кому то полезен, и не дать убить уйму времени smile

полезные ссылки:
http://blogs.msdn.com/b/wenlong/archive/2010/02/11/why-does-wcf-become-slow-after-being-idle-for-15-seconds.aspx
http://msdn.microsoft.com/ru-ru/library/system.threading.threadpool.setminthreads.aspx
http://stackoverflow.com/questions/7710220/wcf-performance-latency-and-scalability

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)