Должны ли мы использовать сборку мусора на "рабочей станции" или сборку мусора на "сервере"? - PullRequest
30 голосов
/ 10 ноября 2009

У меня большое многопоточное приложение C #, работающее на многоядерном 4-стороннем сервере. В настоящее время мы используем сборку мусора в «режиме сервера». Однако тестирование показало, что режим рабочей станции GC быстрее.

MSDN говорит :

Приложения с управляемым кодом, использующие серверный API, получают значительные преимущества от использования оптимизированного сервером сборщика мусора (GC) вместо рабочей станции GC по умолчанию.

Рабочая станция - это режим GC по умолчанию, который доступен только на однопроцессорных компьютерах. Рабочая станция GC размещается в консольных приложениях и приложениях Windows Forms. Он выполняет полные (поколение 2) коллекции одновременно с запущенной программой, тем самым сводя к минимуму задержки. Этот режим полезен для клиентских приложений, где воспринимаемая производительность обычно более важна, чем необработанная пропускная способность.

Сервер GC доступен только на многопроцессорных компьютерах. Он создает отдельную управляемую кучу и поток для каждого процессора и выполняет коллекции параллельно. Во время сбора все управляемые потоки приостанавливаются (потоки, выполняющие собственный код, приостанавливаются только после возврата собственного вызова). Таким образом, режим GC сервера максимизирует пропускную способность (количество запросов в секунду) и повышает производительность по мере увеличения числа процессоров. Производительность особенно велика на компьютерах с четырьмя или более процессорами.

Но мы не видим блеска производительности !!!! Кто-нибудь получил совет?

Ответы [ 3 ]

17 голосов
/ 10 ноября 2009

Это не очень хорошо объяснено, но, насколько я могу судить, режим сервера является синхронным для каждого ядра, а режим рабочей станции - асинхронным.

Другими словами, режим рабочей станции предназначен для небольшого числа долго работающих приложений, которым требуется постоянная производительность. Сборщик мусора пытается «остаться в стороне», но в результате менее эффективен в среднем.

Режим сервера предназначен для приложений, в которых каждое «задание» относительно недолговечно и обрабатывается одним ядром (редактирование: например, многопоточный веб-сервер). Идея состоит в том, что каждая «работа» получает всю мощность процессора и выполняется быстро, но иногда ядро ​​перестает обрабатывать запросы и очищает память. Таким образом, в этом случае надежда состоит в том, что GC в среднем более эффективен, но ядро ​​недоступно во время работы, поэтому приложение должно быть в состоянии адаптироваться к этому.

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

Но это всего лишь оправдание. Измеряйте производительность вашей системы (как сказал ammoQ, не производительность GC, а то, насколько хорошо ваше приложение ведет себя) и используйте то, что вы измеряете, чтобы быть лучшим.

6 голосов
/ 02 ноября 2012

.NET 4.5 представляет параллельную сборку мусора на сервере.

http://msdn.microsoft.com/en-us/library/ee787088.aspx

specify <gcServer enabled="true"/> 
specify <gcConcurrent enabled="true"/> (this is the default so can be omitted)

И есть новый SustainedLowLatencyMode;

В .NET Framework 4.5 режим SustainedLowLatency доступен как для рабочей станции, так и для GC сервера. Чтобы включить его, установите для свойства GCSettings.LatencyMode GCLatencyMode.SustainedLowLatency.

3 голосов
/ 09 августа 2018

Сервер : Ваша программа является единственным значимым приложением на компьютере и требует минимальной задержки для ГХ.

Рабочая станция : у вас есть пользовательский интерфейс или вы используете компьютер совместно с другим важным процессом

...