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 предназначен для использования больше.