Есть какое-то большое .Net приложение-служба, которая делает очень много повторяющихся вычислений, вычисления объемные, но не суть важно. Главное их очень много. Ну и мы начали использовать многопоточный код и действительно увидели очень сильный прирост производительности.
Поставили это дело клиентам, они счастливы, все хорошо. У них мощный сервак с процессором на 24 ядра, почти все эти ядра мы задействуем. И вот проходит время, клиенты говорят НУЖНО БОЛЬШЕ ПРОИЗВОДИТЕЛЬНОСТИ. И меняют сервак, на котором появляются ДВА ПРОЦЕССОРА по 24 ядра у каждого. Код нашего .net приложения не менялся.
В итоге, стало работать раза в 3-4 хуже и медленнее. Но стоит только физически отключить ОДИН процессор, и все начинает работать так же быстро.
И вот вопрос, может кто сталкивался. Как в таком случае мне правильно распределять нагрузку уже не по ядрам (это работает вроде), а по процессорам?
Не совсем ответ на вопрос, но все же:
Программе все равно на кол-во процессоров, так как это задача ОС. Именно она планирует на каком ядре какого процессора запустить поток.
Мне видится, проблема в том, что повысив одну характеристику ПК не была повышена другая характеристика ПК.
Например, вы гоняли большие коллекции в многопоточном режиме по 1 гигу на поток и вы расходовали 24 гб памяти(24 ядра), которые имелись на ПК. Теперь вы расходуете 48 гигов, хотя на ПК всего 28 гигов => подкачка и все плохо.
Так же проблема может быть в том, что вы уперлись в IO-операции- сетка не справляется, бд погибает.
В общем, проблема может быть не в процессорах и нужно выполнить профайлинг. Посмотреть в монитор ресурсов, например.
Похоже что это не то. что можно решить изнутри программы. В общем и целом 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
То, что у меня получилось, сортирует элементы массива в строкахМне нужно, чтобы сортировались все элементы массива
пытаюсь загрузить images в бд или на сервер , но не получаетсяможет кто нибудь поможет мне