Pytanie GC w .Net4: Określanie razem gcServer i gcConcurrent


Byłem dostrajany przez nasz serwer i próbowałem określić następującą konfigurację, a także ustawienie GCLatencyMode do LowLatency.

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

To dało mi wzrost wydajności i byłem bardzo zadowolony, dopóki kolega nie wskazał, że te dwa ustawienia wzajemnie się wykluczają w .Net 4.

Jaką konfigurację to rozwiąże? Na pewno, GCSettings.IsServerGC zwraca wartość true, a ustawienie jest bardzo wymierne gcConcurrent do fałszywego.

(Skompilowałem kod, który profilowałem do wiązki testowej, więc chociaż zazwyczaj jest to serwer obsługiwany przez IIS, wszystkie moje czasy były w aplikacji konsoli)


11
2017-11-15 10:13


pochodzenie


Czy otrzymałeś odpowiedź na zapytanie z dowolnego miejsca? Planuję skonfigurować moją aplikację na podobnych liniach. - vibhu
@vibhu - nie, nie ma rozstrzygającej odpowiedzi. Oczywiście .Net 4.5 obsługuje teraz usuwanie śmieci w tle - Rob


Odpowiedzi:


Znalazłem tu twoją odpowiedź: Tryby opóźnienia

Domyślne tryby zbierania śmieci


Jeśli nie określono właściwości LatencyMode, trybem domyślnym jest równoczesne usuwanie śmieci z stacji roboczej. Tryb jest zależny od wartości dwóch ustawień konfiguracji środowiska wykonawczego:

<gcConcurrent>

Jeśli ta opcja jest włączona, to ustawienie określa, że ​​w środowisku wykonawczym wspólnego języka jest uruchamiana funkcja czyszczenia pamięci stacji roboczej w osobnym wątku w celu obsługi operacji współbieżnych. To ustawienie jest domyślnie włączone.

<gcServer>

Jeśli ta opcja jest włączona, to ustawienie określa, że ​​w środowisku wykonawczym wspólnego języka uruchamiane jest zbieranie pamięci serwera; w przeciwnym razie uruchamia zbieranie danych ze stacji roboczej. Możesz włączyć funkcję czyszczenia pamięci serwera tylko na komputerach z co najmniej dwoma procesorami. Domyślnie nie jest włączone. Jeśli to ustawienie jest włączone, gcConcurrent jest automatycznie wyłączany.

Domyślne wartości dla GCLatencyMode są następujące:

Interaktywny, kiedy gcConcurrent jest włączony i gcServer jest niepełnosprawny.

Partia, gdy gcConcurrent jest wyłączone, lub gcServer jest włączony.

Tak więc, gdy gcServer jest włączony, gcConcurrent jest automatycznie wyłączany. Nie trzeba ustawiać gcConcurrent na wyłączone. GCLatencymode działa w trybie wsadowym, co wyjaśnia wzrost wydajności.


7
2018-06-03 15:48





Jeśli jest to teraz pomoc, ustawienie gcConcurrent jest używane zamiennie z GC tła w .NET 4.5. The następujący blog MSDN wyjaśnia ustawienia dostępne w .NET 4.5. Możesz używać wszystkich ustawień razem i są one dostępne zarówno dla stacji roboczej, jak i serwera GC.

Podczas gdy obowiązuje ustawienie SustainedLowLatency, generacja 0,   generacja 1 i kolekcje 2 generacji tła nadal występują i   zazwyczaj nie powodują zauważalnych czasów pauzy. Generacja blokująca 2   kolekcja dzieje się tylko wtedy, gdy w pamięci jest mało pamięci lub w aplikacji   indukuje GC, wywołując GC.Collect ().

Również,

W .NET Framework 4.5, tryb SustainedLowLatency jest dostępny dla   zarówno stacja robocza, jak i serwerowa GC. Aby go włączyć, ustaw opcję   Właściwość GCSettings.LatencyMode na GCLatencyMode.SustainedLowLatency.   .NET Framework 4 zawiera tryb LowLatency dla stacji roboczych GC;   jednak ustawienie to jest przeznaczone tylko do krótkotrwałych   czasie, podczas gdy tryb SustainedLowLatency jest przeznaczony do użycia w znacznym stopniu   dłużej.


2
2018-01-20 06:30



Uważam, że pytanie dotyczy .Net Framework 4, a nie 4.5 - Amit Bens