Работа с несколькими процессорами (не ядрами)

100
02 мая 2021, 12:30

Есть какое-то большое .Net приложение-служба, которая делает очень много повторяющихся вычислений, вычисления объемные, но не суть важно. Главное их очень много. Ну и мы начали использовать многопоточный код и действительно увидели очень сильный прирост производительности.

Поставили это дело клиентам, они счастливы, все хорошо. У них мощный сервак с процессором на 24 ядра, почти все эти ядра мы задействуем. И вот проходит время, клиенты говорят НУЖНО БОЛЬШЕ ПРОИЗВОДИТЕЛЬНОСТИ. И меняют сервак, на котором появляются ДВА ПРОЦЕССОРА по 24 ядра у каждого. Код нашего .net приложения не менялся.

В итоге, стало работать раза в 3-4 хуже и медленнее. Но стоит только физически отключить ОДИН процессор, и все начинает работать так же быстро.

И вот вопрос, может кто сталкивался. Как в таком случае мне правильно распределять нагрузку уже не по ядрам (это работает вроде), а по процессорам?

Answer 1

Не совсем ответ на вопрос, но все же:

Программе все равно на кол-во процессоров, так как это задача ОС. Именно она планирует на каком ядре какого процессора запустить поток.

Мне видится, проблема в том, что повысив одну характеристику ПК не была повышена другая характеристика ПК.

Например, вы гоняли большие коллекции в многопоточном режиме по 1 гигу на поток и вы расходовали 24 гб памяти(24 ядра), которые имелись на ПК. Теперь вы расходуете 48 гигов, хотя на ПК всего 28 гигов => подкачка и все плохо.

Так же проблема может быть в том, что вы уперлись в IO-операции- сетка не справляется, бд погибает.

В общем, проблема может быть не в процессорах и нужно выполнить профайлинг. Посмотреть в монитор ресурсов, например.

Answer 2

Похоже что это не то. что можно решить изнутри программы. В общем и целом OS будет влиять на скедлинг потоков.

На что можно обратить внимание:

1) Могут ли потоки быть логически завязаны один на второй? То есть могут ли они ждать один другого в любой промежуток времени. Хорошая идея что бы проверить виновата программа или настройки операционной системы - написать программу, которая запускает кучу потоков которые вообще не связаны между собой и просто делают пустое действие(пустой цикл раз на пару секунд). И проверить может ли нагрузка CPU перевалить за 50%. Если может - значит у тебя интерлок потоков. Если не может - значит виноваты настройки операционки.

2) Есть 2 версии .NET runtime, и ты можешь использовать не ту которую нужно. Вот урывочек статьи с MSDN:

.NET Framework applications designated for deployment on multiprocessor machines, such as those using the Intel Xeon MP processors, should make use of the server-optimized runtime implementation (MSCorSvr.dll). This version of the runtime has a modified garbage collector that splits the managed heap into several sections, with one per CPU. Each CPU has its own garbage-collection thread, so they can all participate simultaneously in the collection cycle. (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/dotnetperftechs.asp)

Ответ основан на: https://www.experts-exchange.com/questions/21013405/Multi-Processor-using-with-C-for-max-performance.html

READ ALSO
Сортировка рваного массива

Сортировка рваного массива

То, что у меня получилось, сортирует элементы массива в строкахМне нужно, чтобы сортировались все элементы массива

122
Upload Images , Asp.Net core

Upload Images , Asp.Net core

пытаюсь загрузить images в бд или на сервер , но не получаетсяможет кто нибудь поможет мне

109
MarkdownTextBlock для WPF

MarkdownTextBlock для WPF

Для UWP есть MarkdownTextBlock

95