Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

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

#c_sharp #net #многопоточность #процессор


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

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

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

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


Ответы

Ответ 1



Не совсем ответ на вопрос, но все же: Программе все равно на кол-во процессоров, так как это задача ОС. Именно она планирует на каком ядре какого процессора запустить поток. Мне видится, проблема в том, что повысив одну характеристику ПК не была повышена другая характеристика ПК. Например, вы гоняли большие коллекции в многопоточном режиме по 1 гигу на поток и вы расходовали 24 гб памяти(24 ядра), которые имелись на ПК. Теперь вы расходуете 48 гигов, хотя на ПК всего 28 гигов => подкачка и все плохо. Так же проблема может быть в том, что вы уперлись в IO-операции- сетка не справляется, бд погибает. В общем, проблема может быть не в процессорах и нужно выполнить профайлинг. Посмотреть в монитор ресурсов, например.

Ответ 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

Комментариев нет:

Отправить комментарий