производительность HttpClient
От: Codealot Земля  
Дата: 10.08.23 22:58
Оценка:
            const int maxCount = 0x1000;
            ThreadPool.SetMaxThreads(maxCount, maxCount);

            var socketsHttpHandler = new SocketsHttpHandler
            {
                MaxConnectionsPerServer = 0x200,
            };
            var httpClient = new HttpClient(socketsHttpHandler);

            Parallel.ForEachAsync(items, new ParallelOptions { MaxDegreeOfParallelism = 0x200 }, async (item, token) =>
            {
                try
                {
                    var url = "https://localhost:7065/weatherforecast";
                    using var response = await httpClient.GetAsync(url, token);
                }
                catch (Exception exc)
                {
                    errors.Add((item.Name, exc.ToString()));
                }
            }).Wait();

Получается около 40-50 запросов в секунду. И хотя я не ожидал миллионов, но это — вообще курам на смех.
Я что-то упускаю?
Ад пуст, все бесы здесь.
Re: производительность HttpClient
От: pilgrim_ Россия  
Дата: 10.08.23 23:25
Оценка: -1
Здравствуйте, Codealot, Вы писали:

C>Получается около 40-50 запросов в секунду. И хотя я не ожидал миллионов, но это — вообще курам на смех.

C>Я что-то упускаю?

Если влоб — используй при каждом запросе свой HttpClient (вместе с хэндлером) (не забывая вызывать Dispose), можно создать пул HttClient'ов размером с MaxDegreeOfParallelism, и при каждом запросе юзать свой HttClient.
Когда юзаешь при многопотоке один HttpClient для всех запросов (что типа рекомендуется во всём инете), наблюдается что внутри явно есть какие-то блокировки при запросе к одному адресу, что вырождается чуть ли не в последовательное выполнение запросов.
Re: производительность HttpClient
От: vmpire Россия  
Дата: 10.08.23 23:33
Оценка: +1
Здравствуйте, Codealot, Вы писали:

C>Получается около 40-50 запросов в секунду. И хотя я не ожидал миллионов, но это — вообще курам на смех.

C>Я что-то упускаю?
А сервер не может тормозить? Вдруг это всё в него упирается?
Я бы порекомендовал инструментировать код и записать статистику распределения количества запросов по времени выполнения.
Плюс записать на сервере сколько реально выполняется параллельных запросов. Это может дать информацию для дальнейшего поиска.
Re: производительность HttpClient
От: bnk СССР http://unmanagedvisio.com/
Дата: 11.08.23 00:16
Оценка: +1
Здравствуйте, Codealot, Вы писали:

C>
C> const int maxCount = 0x1000;
C> ThreadPool.SetMaxThreads(maxCount, maxCount);

У тебя на компе 4000 ядер что ли? Какой здесь вообще смысл в SetMaxThreads?
Отредактировано 11.08.2023 0:16 bnk . Предыдущая версия .
Re[2]: производительность HttpClient
От: pilgrim_ Россия  
Дата: 11.08.23 00:38
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Какой здесь вообще смысл в SetMaxThreads?


Если бы использовался ThreadPool.SetMinThreads, то это повлияло бы на увеличение потоков в пуле без задержек до указанного предела, дальнейшее увеличение будет идти с задержками.
Re[2]: производительность HttpClient
От: Codealot Земля  
Дата: 11.08.23 02:01
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>У тебя на компе 4000 ядер что ли?


Сеть не в ядра упирается. Ты что, реально думаешь, что один тред — одно ядро?

bnk>Какой здесь вообще смысл в SetMaxThreads?


На всякий случай, чтобы хватило с гарантией.
Ад пуст, все бесы здесь.
Re[3]: производительность HttpClient
От: bnk СССР http://unmanagedvisio.com/
Дата: 11.08.23 02:08
Оценка:
Здравствуйте, Codealot, Вы писали:

bnk>>У тебя на компе 4000 ядер что ли?


C>Сеть не в ядра упирается. Ты что, реально думаешь, что один тред — одно ядро?


Я не специалист по многопоточности, просто наивный вопрос — какой смысл разрешать 4000 потоков если реально выполнятся будет столько, сколько поддерживает проц?
На 4000 потоков же памяти уйдет прорва (на стек для каждого по мегабайту?) Плюс на переключение расходы?

bnk>>Какой здесь вообще смысл в SetMaxThreads?


C>На всякий случай, чтобы хватило с гарантией.


Можно ссылку, чтобы понять почему это лучше, чем 16 (ну или сколько у тебя ядер?)
Re[4]: производительность HttpClient
От: Codealot Земля  
Дата: 11.08.23 04:24
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Я не специалист по многопоточности, просто наивный вопрос — какой смысл разрешать 4000 потоков если реально выполнятся будет столько, сколько поддерживает проц?


Потому что в данном случае они упираются во ввод-вывод, а не в процессор.

bnk>На 4000 потоков же памяти уйдет прорва (на стек для каждого по мегабайту?)


Всего лишь. Не цена, если нужна скорость. Но здесь это просто для уверенности, что проблема не в этом.
Ад пуст, все бесы здесь.
Re: производительность HttpClient
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 11.08.23 04:55
Оценка: +1
Здравствуйте, Codealot, Вы писали:

C>Я что-то упускаю?

А ты что хочешь проверить?

Сделай просто цикл, без всяких parallel, чтобы посчитать время запроса-ответа. Если сравнишь с таймингом сервера, то получишь чистые накладные расходы httpclient.

Сделай пачку GetAsysnc, а потом сразу все Task.WhenAll, чтобы узнать при каком количестве одновременных запросов сервер начинает проседать.
Re: производительность HttpClient
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.08.23 06:14
Оценка:
Здравствуйте, Codealot, Вы писали:
Используй WhenAll
https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task.whenall?view=net-7.0
Ознакомься с https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern

Используй разные адреса. Могут быть ограничения на сервере
и солнце б утром не вставало, когда бы не было меня
Отредактировано 11.08.2023 6:29 Serginio1 . Предыдущая версия .
Re[5]: производительность HttpClient
От: bnk СССР http://unmanagedvisio.com/
Дата: 11.08.23 09:46
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Всего лишь. Не цена, если нужна скорость. Но здесь это просто для уверенности, что проблема не в этом.


Я не понимаю как создание 4000 потоков на процессоре который поддерживает 16 (для примера), может в принципе что-то ускорить?
Мне кажется что ты только замедлишь этим? Ты пробовал убрать эту строчку и измерить время без нее?
Re[6]: производительность HttpClient
От: rudzuk  
Дата: 11.08.23 12:45
Оценка: +1
Здравствуйте, bnk, Вы писали:

bnk> Я не понимаю как создание 4000 потоков на процессоре который поддерживает 16 (для примера), может в принципе что-то ускорить?


Элементарно! Пока все 16 потоков висят ожидая сеть, другие занимаются полезным делом. Потом следующие 16 и так далее. Наращивать потоки можно до исчерпания полосы пропускания. После, влияния на скорость уже не будет. Вообще, это глупая мантра, что число потоков должно быть равно числу ядер/потоков исполнения процессора. Все зависит от того чем эти потоки занимаются.
avalon/3.0.2
Re[7]: производительность HttpClient
От: bnk СССР http://unmanagedvisio.com/
Дата: 11.08.23 13:00
Оценка: +2
Здравствуйте, rudzuk, Вы писали:

bnk>> Я не понимаю как создание 4000 потоков на процессоре который поддерживает 16 (для примера), может в принципе что-то ускорить?


R>Элементарно! Пока все 16 потоков висят ожидая сеть, другие занимаются полезным делом. Потом следующие 16 и так далее. Наращивать потоки можно до исчерпания полосы пропускания. После, влияния на скорость уже не будет. Вообще, это глупая мантра, что число потоков должно быть равно числу ядер/потоков исполнения процессора. Все зависит от того чем эти потоки занимаются.


Там же Async/Await (Parallel.ForEachAsync)?! Никто там не "висеть ожидая сеть" не должен. NODEJS вообще "однопоточная" например?
Re[8]: производительность HttpClient
От: rudzuk  
Дата: 11.08.23 13:12
Оценка:
Здравствуйте, bnk, Вы писали:

bnk> Там же Async/Await (Parallel.ForEachAsync)?! Никто там не "висеть ожидая сеть" не должен. NODEJS вообще "однопоточная" например?


Точно, блин
avalon/3.0.2
Re[7]: производительность HttpClient
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.08.23 13:29
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, bnk, Вы писали:


bnk>> Я не понимаю как создание 4000 потоков на процессоре который поддерживает 16 (для примера), может в принципе что-то ускорить?


R>Элементарно! Пока все 16 потоков висят ожидая сеть, другие занимаются полезным делом. Потом следующие 16 и так далее. Наращивать потоки можно до исчерпания полосы пропускания. После, влияния на скорость уже не будет. Вообще, это глупая мантра, что число потоков должно быть равно числу ядер/потоков исполнения процессора. Все зависит от того чем эти потоки занимаются.


При async/await потоки не ожидают сеть. Они выполняются только при отправке запроса и получении ответа. За этим следит посредством портов ввода/вывода.
https://habr.com/ru/articles/470830/

https://habr.com/ru/articles/59282/
и солнце б утром не вставало, когда бы не было меня
Отредактировано 11.08.2023 16:41 Serginio1 . Предыдущая версия .
Re[8]: производительность HttpClient
От: Codealot Земля  
Дата: 11.08.23 16:16
Оценка: -1 :)
Здравствуйте, bnk, Вы писали:

bnk>Там же Async/Await (Parallel.ForEachAsync)?! Никто там не "висеть ожидая сеть" не должен. NODEJS вообще "однопоточная" например?


Ну в теории да, но лучше перепроверить.
Ад пуст, все бесы здесь.
Re[6]: производительность HttpClient
От: Codealot Земля  
Дата: 11.08.23 16:16
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Ты пробовал убрать эту строчку и измерить время без нее?


Однофигственно.
Ад пуст, все бесы здесь.
Re[6]: производительность HttpClient
От: Gt_  
Дата: 11.08.23 19:36
Оценка:
bnk>Я не понимаю как создание 4000 потоков на процессоре который поддерживает 16 (для примера), может в принципе что-то ускорить?
Что ты слышал про зеленые потоки?
GarryIV, ты не в себе
От: Codealot Земля  
Дата: 11.08.23 23:43
Оценка:
Никто в здравом уме не станет спорить с тем, что любые важные допущения надо проверять.
Ад пуст, все бесы здесь.
Re[7]: производительность HttpClient
От: bnk СССР http://unmanagedvisio.com/
Дата: 12.08.23 00:04
Оценка:
Здравствуйте, Gt_, Вы писали:

bnk>>Я не понимаю как создание 4000 потоков на процессоре который поддерживает 16 (для примера), может в принципе что-то ускорить?


Gt_>Что ты слышал про зеленые потоки?


Ничего практически (в контексте .net по крайней мере).
То есть, вообще я термин такой слышал, но что он означает я не совсем в курсе.
Насколько я понял это типа эмуляция потоков? Типа недоделанный async/await, или?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.