Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WCF - торможения принятия запроса при 100 одноврем 
V
    Опции темы
pasha1
  Дата 15.5.2013, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.5.2013

Репутация: нет
Всего: нет



Добрый день!) Столкнулся со следующей проблемой, при одновременно посылке 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>

Надеюсь кто встречался с такой проблемой и подскажет в чем беда или хоть даст советы куда еще можно копать.
PM MAIL   Вверх
pasha1
  Дата 16.5.2013, 13:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.5.2013

Репутация: нет
Всего: нет



я не учел еще одного фактора это пул потоков ввода-вывода
по умолчанию минимальный пул равен количеству ядер процесора, например у меня он был равен 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/20...15-seconds.aspx
http://msdn.microsoft.com/ru-ru/library/sy...minthreads.aspx
http://stackoverflow.com/questions/7710220...and-scalability

Это сообщение отредактировал(а) pasha1 - 16.5.2013, 14:06
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.