#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
Комментариев нет:
Отправить комментарий