2009-11-10 20 views
24

Mam dużą wielowątkową aplikację C# działającą na wielordzeniowym czterokierunkowym serwerze. Obecnie korzystamy z funkcji czyszczenia pamięci w trybie serwera. Jednak testy wykazały, że tryb stacji roboczej GC jest szybszy.Czy powinniśmy używać "śmieci" do zbierania śmieci "stacji roboczej" lub "serwera"?

MSDN says:

zarządzanych aplikacji kod korzystające z interfejsu API serwera otrzymują znaczne korzyści z korzystania z kolektora serwera zoptymalizowany śmieci (GC) zamiast GC domyślne stacji roboczej.

Stacja robocza to domyślny tryb GC i jedyny dostępny na komputerach z jednym procesorem. Stacja robocza GC jest hostowana w konsoli i aplikacjach Windows Forms. Wykonuje pełne zbiory (generacji 2) równolegle z uruchomionym programem, minimalizując tym samym opóźnienie. Tryb ten jest przydatny w aplikacjach klienckich, gdzie postrzegana wydajność jest zwykle ważniejsza niż nieprzetworzona przepustowość.

Serwer GC jest dostępny tylko na komputerach wieloprocesorowych. Tworzy oddzielną sterowaną stertę i wątek dla każdego procesora i równolegle wykonuje kolekcje. Podczas kolekcjonowania wszystkie zarządzane wątki są wstrzymywane (wątki z natywnym kodem są wstrzymywane tylko wtedy, gdy zwracane jest wywołanie natywne). W ten sposób tryb GC serwera maksymalizuje przepustowość (liczbę żądań na sekundę) i poprawia wydajność wraz ze wzrostem liczby procesorów. Wydajność szczególnie wyróżnia się na komputerach wyposażonych w cztery lub więcej procesorów.

Ale nie widzimy połysku osiągów !!!! Czy ktoś ma jakieś rady?

+1

DanC. To pierwsze, jakie słyszałem o trybach GC. Czy możesz publikować linki do odpowiednich stron MSDN? – spender

+1

Jakiego rodzaju jest oczekiwany efekt? Czy Twój program jest oparty na interfejsie GUI systemu Windows, czy na jakiejś usłudze sieciowej? –

+0

Dzięki Johannes. – spender

Odpowiedz

15

Nie jest to wyjaśnione bardzo dobrze, ale z tego co wiem, tryb serwera jest synchroniczny na rdzeń, podczas gdy tryb stacji roboczej jest asynchroniczny.

Innymi słowy, tryb stacji roboczej jest przeznaczony dla niewielkiej liczby długo działających aplikacji wymagających stałej wydajności. Zbiórka śmieci stara się "pozostać na uboczu", ale w rezultacie jest mniej wydajna.

Tryb serwera jest przeznaczony dla aplikacji, w których każde "zadanie" jest względnie krótkie i obsługiwane przez jeden rdzeń (edit: think multi threaded web server). Chodzi o to, że każda "praca" otrzymuje całą moc procesora, i robi się szybko, ale czasami rdzeń przestaje obsługiwać żądania i czyści pamięć. Tak więc w tym przypadku nadzieja jest taka, że ​​GC jest bardziej wydajny, ale rdzeń jest niedostępny podczas działania, więc aplikacja musi być w stanie się do niego dostosować.

W twoim przypadku brzmi to tak, ponieważ masz pojedynczą aplikację, której wątki są stosunkowo sprzężone, lepiej pasujesz do modelu oczekiwanego przez pierwszy tryb, a nie drugi.

Ale to wszystko jest po prostu uzasadnieniem. Zmierz wydajność swojego systemu (jak mówi ammoQ, a nie wydajność GC, ale jak dobrze działa twoja aplikacja) i wykorzystuj to, co mierzysz, aby być najlepszym.

+2

Warto dodać, że "serwer" często oznacza różne rzeczy dla różnych ludzi. Być może myślisz, że "serwer" oznacza "moje nowe drogie pole wielordzeniowe", podczas gdy MS może myśleć, że "serwer" oznacza "komputer używany do wielu różnych, niepowiązanych zadań naraz". Są to dwie poprawne, ale całkowicie ortogonalne definicje. –

+0

Dla mnie to byłego ..... –

5

.NET 4.5 wprowadza równoczesne usuwanie pamięci serwera.

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) 

I jest nowa SustainedLowLatencyMode;

W .NET Framework 4.5, tryb SustainedLowLatency jest dostępny dla stacji roboczej i serwera GC. Aby go włączyć, ustaw ustawienia GCSettings.Właściwość LatencyMode na GCLatencyMode.SustainedLowLatency.

+0

W rzeczywistości, wprowadza ** odbiór śmieci ** tła **, ponieważ GC zastępuje współbieżną GC zarówno na serwerze, jak i na kliencie. – i3arnon

+0

@ I3arnon który tryb jest lepszym tłem? Zrobiłem moją aplikację jako tryb serwera i to znacznie wzmocniło – MonsterMMORPG

+0

Serwer GC włączony jest domyślnie tłem w .net 4.5, prawda? – MonsterMMORPG

Powiązane problemy