производительность 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, или?
Re[8]: производительность HttpClient
От: Gt_  
Дата: 13.08.23 19:04
Оценка: :))) :)
bnk>>>Я не понимаю как создание 4000 потоков на процессоре который поддерживает 16 (для примера), может в принципе что-то ускорить?

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


bnk>Ничего практически (в контексте .net по крайней мере).

bnk>То есть, вообще я термин такой слышал, но что он означает я не совсем в курсе.
bnk>Насколько я понял это типа эмуляция потоков? Типа недоделанный async/await, или?

это async/await недоделанный зеленый поток, а зеленый поток это полностью автоматизированный async/await без засирания языка не нужными конструкциями. так вот, с зелеными потоками простенький сервак с рест сервисом способен чуть ли не миллион запросов в секунду держать, что на несколько больше процессорных threads.
вся фишка в том, что пока одни потоки ждут и/о другие могут утилизировать cpu.

Gt_
Re: производительность HttpClient
От: UniqueGuid Канада  
Дата: 14.08.23 03:02
Оценка:
Здравствуйте, Codealot, Вы писали:

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

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

Да, упускаешь. Этот код показывает не быстродействие HttpClient, а сколько можно запросов выполнить в синхронном режиме с настроенной параллелизацией. HttpClient может легко держать тысячи реквестов в секунду
Re: производительность HttpClient
От: Codealot Земля  
Дата: 15.08.23 00:34
Оценка:
Странно, но это как-то связано с компьютером. Запускаю на одном, и получаю жалкие крохи. Запускаю на другом, и влегкую 3-4 тысячи.
Ад пуст, все бесы здесь.
Re[2]: производительность HttpClient
От: vmpire Россия  
Дата: 15.08.23 07:56
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Странно, но это как-то связано с компьютером. Запускаю на одном, и получаю жалкие крохи. Запускаю на другом, и влегкую 3-4 тысячи.

firewall? Антивирус?
Re[3]: производительность HttpClient
От: Codealot Земля  
Дата: 15.08.23 14:36
Оценка:
Здравствуйте, vmpire, Вы писали:

V>firewall? Антивирус?


Одинаково — Defender. Разница в том, что где тормозит — винда 11, а где нет — 10. Но это вряд ли объясняет проблему.
Ад пуст, все бесы здесь.
Re[2]: производительность HttpClient
От: UniqueGuid Канада  
Дата: 20.08.23 21:18
Оценка: +1
C>Странно, но это как-то связано с компьютером. Запускаю на одном, и получаю жалкие крохи. Запускаю на другом, и влегкую 3-4 тысячи.

Это связано с тем, что

using var response = await httpClient.GetAsync(url, token);


делает следующее:

1. (в первый раз) устанавливает сооединение (DNS, etc.)
2. [HttpClient] Посылает сообщение
3. Сообщение пересылается по сети
4. Сервер обрабатывает сообщение
5. Ответ пересылается по сети
6. [HttpClient] Ответ обрабытывается HttpClient

Здесь HttpClient почти ничего не делает по сравнению с другими пунктами
Re[4]: производительность HttpClient
От: Разраб  
Дата: 21.08.23 04:10
Оценка:
Здравствуйте, Codealot, Вы писали:

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


V>>firewall? Антивирус?


C>Одинаково — Defender. Разница в том, что где тормозит — винда 11, а где нет — 10. Но это вряд ли объясняет проблему.

Маршрут везде одинаковый? пинги?
tracert ya.ru
ping -n 100 ya.ru
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: производительность HttpClient
От: Codealot Земля  
Дата: 21.08.23 14:30
Оценка: +1
Здравствуйте, Разраб, Вы писали:

Р>Маршрут везде одинаковый? пинги?


Это ж локалхост.
Ад пуст, все бесы здесь.
Re[3]: производительность HttpClient
От: Codealot Земля  
Дата: 22.08.23 15:05
Оценка:
Здравствуйте, UniqueGuid, Вы писали:

UG>Здесь HttpClient почти ничего не делает по сравнению с другими пунктами


Ну а где тогда тормозит и почему?
Ад пуст, все бесы здесь.
Re[4]: производительность HttpClient
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.08.23 15:27
Оценка:
Здравствуйте, Codealot, Вы писали:

V>>firewall? Антивирус?


C>Одинаково — Defender. Разница в том, что где тормозит — винда 11, а где нет — 10. Но это вряд ли объясняет проблему.


Можно на сервере посмотреть очередь запросов. Скорее всего ServicePointManager.DefaultConnectionLimit не работает

ServicePointManager.DefaultConnectionLimit = 4;

или

Uri uri = new Uri("http://www.contoso.com/");
ServicePoint sp = ServicePointManager.FindServicePoint(uri);
sp.ConnectionLimit = newLimit;
и солнце б утром не вставало, когда бы не было меня
Отредактировано 22.08.2023 15:30 Serginio1 . Предыдущая версия .
Re[5]: производительность HttpClient
От: Codealot Земля  
Дата: 22.08.23 16:03
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Можно на сервере посмотреть очередь запросов.


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

C>Это ж локалхост.


но ведь не 127.0.0.1
Re[6]: производительность HttpClient
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.08.23 16:22
Оценка:
Здравствуйте, Codealot, Вы писали:

S>> Можно на сервере посмотреть очередь запросов.


C>Нет, проблема не в сервере.

Так ServicePointManager это про клиента
https://learn.microsoft.com/ru-ru/dotnet/api/system.net.servicepointmanager?view=net-7.0

Мало того, ты можешь регулировать и постоянные соединения
https://learn.microsoft.com/ru-ru/dotnet/api/system.net.servicepointmanager.defaultpersistentconnectionlimit?view=net-7.0#system-net-servicepointmanager-defaultpersistentconnectionlimit

https://stackoverflow.com/questions/31735569/what-is-httpclients-default-maximum-connections
и солнце б утром не вставало, когда бы не было меня
Отредактировано 22.08.2023 16:36 Serginio1 . Предыдущая версия . Еще …
Отредактировано 22.08.2023 16:24 Serginio1 . Предыдущая версия .
Re[7]: производительность HttpClient
От: Codealot Земля  
Дата: 22.08.23 20:22
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>но ведь не 127.0.0.1


Без разницы. Кстати, http/https тоже ничего не меняет.
Ад пуст, все бесы здесь.
Re[7]: производительность HttpClient
От: Codealot Земля  
Дата: 23.08.23 01:45
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Так ServicePointManager это про клиента


Не, на клиенте уже пробовал. Однофигственно.
Ад пуст, все бесы здесь.
Re[8]: производительность HttpClient
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.08.23 07:44
Оценка:
Здравствуйте, Codealot, Вы писали:

S>> Так ServicePointManager это про клиента


C>Не, на клиенте уже пробовал. Однофигственно.

Интересно, а что выдает
var url = "https://localhost:7065/weatherforecast";
Uri uri = new Uri(url);
ServicePoint sp = ServicePointManager.FindServicePoint(uri);
sp.ConnectionLimit??

Там явно проблема с количеством соединений с сервером
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.08.2023 9:05 Serginio1 . Предыдущая версия .
Re[9]: производительность HttpClient
От: Codealot Земля  
Дата: 25.08.23 19:45
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Интересно, а что выдает


Одинаково в обоих случаях.
Ад пуст, все бесы здесь.
Re[10]: производительность HttpClient
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.08.23 20:32
Оценка:
Здравствуйте, Codealot, Вы писали:


S>> Интересно, а что выдает


C>Одинаково в обоих случаях.

200?
и солнце б утром не вставало, когда бы не было меня
Re[11]: производительность HttpClient
От: Codealot Земля  
Дата: 25.08.23 20:53
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> 200?


Если я его не устанавливаю, то 2
Если устанавливаю, то 0x200. Но скорость от этого заметно не меняется.
Ад пуст, все бесы здесь.
Re: производительность HttpClient
От: Codealot Земля  
Дата: 13.09.23 23:59
Оценка:
Поковырявишсь выяснил, что скорость радикально меняется в зависимости от того, запускается прога под отладчиком или без. И без него, скорость на "медленном" компе уже намного лучше.
Но хотел бы я знать, почему это так сильно влияет на один комп, но не на другой.
Ад пуст, все бесы здесь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.