Kilka faktów: Opracowaliśmy usługę wcf, która działa jako warstwa między klientami a bazą danych. Jest selfhosted i działa jako usługa Windows..NET Problemy z Garbagecollector. Bloki na 15-40 minut
Usługa przechowuje kilka pamięci podręcznych, z których największe zajmują około 1-2 GB pamięci. Całkowite zużycie pamięci wynosi zwykle około 5-8 gb. Połączenia są dupleksowe i używają protokołu TCP, a serializacja odbywa się za pomocą protobuf-net. Liczba naszych klientów podłączonych zwykle waha się od 1000-1500. Serwer to 8-rdzeniowy xeon nowszego modelu z 64-bitową pamięcią i nie działa niczym więcej niż usługa.
Problem: po upływie x ilości czasu, od dnia do tygodnia usługa jest bardzo powolna. Prośby, które trwają 0,5 sekundy, mogą zająć ponad minutę. Takie zachowanie trwa od 15 do 40 minut lub do momentu ponownego uruchomienia usługi.
Co zrobiliśmy: Sprawdziliśmy sieć i połączenie sieciowe z serwerem i nie ma problemu. Wykorzystanie procesora rośnie nieco w tym czasie od f.eks. 30% średnio do 40-50% średnio. Zrobiliśmy zrzut pamięci i nie ma logicznych blokad w kodzie, który blokuje użytkowników i niewiele działa. Naszym najnowszym leadem jest Garbage collector. W perfmon widzimy, że "% czasu w gc" stale przekracza 90%, (90-97%), a liczba kolekcji wzrasta. Zarówno GC0 i GC1. Podejrzewamy, że działa blokująca GC2, ale musieliśmy zrestartować usługę, ponieważ jest ona w produkcji, więc nie policzyła się podczas 5minowego okna, w którym uruchomiliśmy perfmon. Wykorzystanie pamięci wyniosło 7,6 GB. Uwaga: Połączenia są wyjątkowe, więc połączenia są dostępne, ale usługa ich nie obsługuje.
Moje pytania brzmią: Czy śmieciarz może się znaleźć w stanie, w którym działa i blokuje się nieprzerwanie przez ponad 15 minut? lub czy problem prawdopodobnie jest związany z jakimś innym problemem?
Nasza usługa uruchomiła GC w trybie stacji roboczej i latencymode: Interactive Teraz zmieniliśmy to na Server i SustainedLowLatency i mamy nadzieję, że to trochę pomoże. Czy możemy coś jeszcze zrobić, jeśli to jest zbieracz śmieci?
Edycja: duże wykorzystanie pamięci jest zgodne z projektem, dane w pamięciach podręcznych są duże i dostępnych jest dużo więcej pamięci.
Zaproponuj, aby dowiedzieć się podstawową przyczyną wysokiego wykorzystania pamięci ... np. spróbuj dodać blok "używając", aby zwolnić pamięć po skończeniu używania tego obiektu. – User2012384
Po prostu z ciekawości, ile wątków masz? Sprawdź w Menedżerze zadań. Przynajmniej kilka lat temu pojawił się problem, że im więcej wątków miałeś (nawet bezczynności), tym wolniej GC – xanatos
"Czy odśmiecacz może uzyskać stan, w którym działa i blokuje się nieprzerwanie przez ponad 15 minut"? Absolutnie, jeśli ciągle musi zwolnić pamięć, ale nie jest w stanie, ponieważ trzymasz się jej. Jak ujął to Raymond Chen, "pamięć podręczna o złej polityce to kolejna nazwa wycieku pamięci". –