Увеличение времени выполнения при многопотоке

id0777

Client
Регистрация
22.09.2019
Сообщения
30
Благодарностей
5
Баллы
8
Здравствуйте!
Подскажите люди добрые =)
Сделал шаблон суть такая идет запрос к API получаю данные после провожу разбор во время которого имеем несколько обращений к БД т.е. разносим данные по БД далее повторяем , все это дело в цикле 100 повторений , еще есть кубик C задержка 200мс т.к. API не позволяет более 5 обращений в секунду (защита).

Так вот запускаю, все работает так как нужно при этом отслеживаю время выполнения цикла (100 повторений) выходит один поток справляется за 0.8 мин меня все устраивает, подключаю потоки и тут такая картина

5 потоков = 0.9 мин.
10 потоков = 1 мин.
15 потоков = 1.05 мин.
20 потоков = 1.1 мин.
25 потоков = 1.2 мин.
30 потоков = 1.3 мин.
35 потоков = 1.8 мин.
40 потоков = 2 мин.
45 потоков = 2.2 мин.
50 потоков = 2.4 мин.
60 потоков = 3.5-4 мин.

я подумал что дело в БД оптимизировал как мог увеличил количество соединений памяти и прочее есть небольшой прирост производительности но при оптимальном количестве потоков при дальнейшем увеличении всеравно идет увеличение времени выполнения

5 потоков = 0.75 мин.
10 потоков = 0.9 мин.
15 потоков = 1 мин.
20 потоков = 1 мин.
25 потоков = 1.1 мин.
30 потоков = 1.1 мин.
35 потоков = 1.5 мин.
40 потоков = 2 мин.
45 потоков = 2.2 мин.
50 потоков = 2.4 мин.
60 потоков = 3.5-4 мин.

Делал трассировку вижу что проскакивает увеличение времени выполнения некоторых кубиков к примеру 350мс при этом это кубик присвоения значения переменной далее норм и так по всем .

Прочитал что может быть сеть не дает у меня показывает максимум соединений 1600 использовано 350

Вот сижу не понимаю неужели я уперся в железо ?
При работе 30 потоков ЦП 35% ОЗУ 10Гб , при работе 60 потоков ЦП 75 - 100% ОЗУ 11Гб

У меня по железу:
Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz 2.80 GHz
ОЗУ 32 GB
SSD

Подскажите в чем может быть проблема или я действительно упёрся в железо ?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 703
Баллы
113
нормальная ситуация для многопотока.
почитай как работает распаралеливание в винде и как выделяется квант времени на задачи. если в кратце, то чем больше задач, тем дольше они будут выполняться.
еще есть момент связанный с зенкой. в ней есть моменты когда многопоток будет тупить. обычно это проявляется в местах где происходит лок выполнения операции.
в твоем случае, по фразе "увеличение времени выполнения некоторых кубиков " совершенно не понятно что и почему.
я часто пользуюсь самописной утилитой, выложенной тут на форуме, которая проводит статический анализ тормозов многопотока, сравнивая работу 5 потоков и 50-ти потоков. очень показательно находит виновников тормозов в многопотоке. воспользуйся ей.
 

id0777

Client
Регистрация
22.09.2019
Сообщения
30
Благодарностей
5
Баллы
8
Большое спасибо!
Воспользовался утилитой, в итоге все таки БД при увеличении количества потоков начинают тормозить запросы к БД , наверное с этим уже ничего не сделать, плюс ко всему ожидаю постепенное увеличение времени отклика в связи с заполнением базы , на данный момент 2кк записей , буду думать...
 

id0777

Client
Регистрация
22.09.2019
Сообщения
30
Благодарностей
5
Баллы
8
И так провел манипуляции с БД сделал больше таблиц и убрал узкие места, провел дополнительные тесты и в итоге оказывается что при увеличении количества потоков дольше начинают отрабатывать кубики на C# а именно в каждом шаблоне есть место где после выполнения одного цикла шаблон переходит к двум кубикам C# первый удаляет все данные из переменных , второй добавляет данные к переменным (есть переменные у которых должны быть значения по умолчанию) , тесты выполнял сравнивая 10 потоков и 50 .

Вопрос тот же получается это уже дело в мощности самого железа ?
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 066
Благодарностей
556
Баллы
113
И так провел манипуляции с БД сделал больше таблиц и убрал узкие места, провел дополнительные тесты и в итоге оказывается что при увеличении количества потоков дольше начинают отрабатывать кубики на C# а именно в каждом шаблоне есть место где после выполнения одного цикла шаблон переходит к двум кубикам C# первый удаляет все данные из переменных , второй добавляет данные к переменным (есть переменные у которых должны быть значения по умолчанию) , тесты выполнял сравнивая 10 потоков и 50 .

Вопрос тот же получается это уже дело в мощности самого железа ?
Ну так вроде сверху правильно сказали, когда работает многопоток это не значит что у тебя все задачи выполняются одновременно, у тебя на выполнение каждого потока выделяется квант времени и процессор так быстро переключается между твоими потоками что создаётся иллюзия того что задачи выполняются одновременно, так вот чем больше потоков, тем больше времени требуется процессору что бы пройтись по всем этим задачам
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
483
Благодарностей
185
Баллы
43
В целом увеличение нагрузки увеличивает время выполнения. Тут я соглашусь с тем что описано выше. И на это по сути не повлиять, но если говорить о том на что можно повлиять, то меня смущает это описание в работе вашего шаблона.
получаю данные после провожу разбор во время которого имеем несколько обращений к БД

Получается у вас на один проход несколько обращений к БД, А через кубик зенки вы при каждом обращении открываете и закрываете соединение с БД. Это не то же самое что один раз открыть соединение и накидывать информацию, а по завершении работы шаблона один раз закрыть соединение. На форуме видел тему в которой описывали как обойти это на c#.

Помимо этого я бы на вашем месте отправлял данные в БД пакетом, а не одиночными запросами. То есть копите информацию за один цикл и отправляете одним запросом. Или, если это возможно, копите за условных 10 циклов информацию и отправляете разом.

Это все ускорило бы работу с БД. Но увеличивается ли у вас в многопотоке время работы с БД вы можете понять по трассировке
 

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)