GC in.Net4: указание gcServer и gcConcurrent вместе

Я работал с настройкой производительности нашего сервера и попытался указать следующую конфигурацию, а также установить GCLatencyMode на LowLatency.

<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
  <gcServer enabled="true"/>
  <gcConcurrent enabled="false"/>
</runtime>

Это дало мне увеличение производительности, и я был очень доволен, пока коллега не указал, что эти два параметра являются взаимоисключающими в .Net 4.

Какая конфигурация будет решаться? Конечно, GCSettings.IsServerGC возвращает true, и есть очень измеримое увеличение производительности от установки gcConcurrent до false.

(Я скомпилировал код, который я профилировал в тестовый жгут, поэтому, хотя он обычно является сервером, обслуживаемым IIS, все мои тайминги были в консольном приложении)

Ответ 1

Я нашел ваш ответ здесь: Режимы латентности

Режимы сборки мусора по умолчанию


Если свойство LatencyMode не указано, режим по умолчанию - это одновременная сборка мусора рабочей станции. Режим зависит от значения двух параметров конфигурации времени выполнения:

<gcConcurrent>

Если этот параметр включен, этот параметр указывает, что среда выполнения обычного языка запускает сборку мусора рабочей станции в отдельном потоке для поддержки параллельных операций. Этот параметр включен по умолчанию.

<gcServer>

Если этот параметр включен, этот параметр указывает, что общая среда выполнения языков запускает сборку мусора сервера; в противном случае он запускает сборку мусора рабочей станции. Вы можете включить сборку мусора на сервере только на компьютерах с двумя или более процессорами. По умолчанию он не включен. Если этот параметр включен, gcConcurrent автоматически отключается.

Значения по умолчанию для GCLatencyMode:

Интерактивный, когда включен gcConcurrent и gcServer.

Пакет, когда gcConcurrent отключен, или gcServer включен.

Таким образом, когда gcServer включен, gcConcurrent автоматически отключается. Не нужно устанавливать gcConcurrent для отключения. GCLatencymode работает в пакетном режиме, что приводит к увеличению производительности.

Ответ 2

Если это сейчас какая-либо помощь, настройка gcConcurrent используется взаимозаменяемо с фоновым GC в .NET 4.5. в следующем блоге MSDN объясняет настройки, доступные в .NET 4.5. Вы можете использовать все настройки вместе, и они доступны как для рабочей станции, так и для GC сервера.

Пока действует параметр SustainedLowLatency, генерирование 0, поколение 1 и коллекции генерации фона 2 все еще происходят и обычно не вызывают заметных периодов паузы. Генерация блокировки 2 сбор происходит только в том случае, если машина мала в памяти или приложение индуцирует GC, вызывая GC.Collect().

Кроме того,

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