Rosnące użycie ramu tej samej aplikacji na różnych serwerach

Odpowiedz Nowy wątek
2018-12-24 09:05
0

Na kilkunastu różnych serwerach z systemem operacyjnym Windows mam uruchomioną tą samą aplikację. Co 5 sekund odpytuje ona serwis, czy na danym serwerze należy zrobić pewną operację i jeśli tak, to ją wykonuje.

Aplikacja chodzi 24/7, a pseudokod głównej metody wygląda tak:

void Foo()
{
    while (true)
    {
        try
        {
            // sprawdz czy nalezy coś wykonać

            // jesli nalezy, to to wykonaj
        }
        catch (Exception ex)
        {
            LogBuilderHelper.LogBuilder.LogError(ex.Message);
        }
        finally
        {
            Thread.Sleep(TimeSpan.FromSeconds(5));
        }
    }
}

Problem jest taki, że po kilkudziesięciu godzinach na niektórych serwerach rośnie zużycie ramu aplikacji. Dochodzi nawet do kilku gb. Nie mam pojęcia skąd to się bierze - na tych serwerach nawet nie było polecenia wykonania tej operacji - serwer co 5 sekund odpytywał web serwis, ale web serwis odpowiadał, że nie ma nic wykonywać.

Na niektórych serwerach zużycie ramu jest normalne - takie jak przy świeżo włączonej aplikacji - rzędu 10Mb. Restart aplikacji pomaga pozbyć się problemem z ramem, ale to raczej ominięcie problemu niż jego rozwiązanie. Ma ktoś jakiś pomysł co może być nie tak?

#Edit
Uruchomiłem właśnie aplikacje u siebie na komputerze. Po jakimś czasie dostałem wyjątek:

Managed Debugging Assistant 'ContextSwitchDeadlock' : 'Środowisko CLR nie było w stanie przejść od kontekstu COM 0xa5d998 do kontekstu COM 0xa5d8e0 w ciągu 60 sekund. Wątek, do którego należy docelowy kontekst/apartament, najprawdopodobniej jest w stanie oczekiwania lub przetwarzania bardzo długotrwałej operacji bez przekazywania komunikatów systemu Windows. Ta sytuacja ma na ogół negatywny wpływ na wydajność i może nawet doprowadzić do tego, że aplikacja przestanie odpowiadać lub że użycie pamięci będzie stale wzrastać z czasem. Aby uniknąć tego problemu, wszystkie wątki STA powinny używać wartości podstawowych oczekiwania z przekazywaniem komunikatów (takich jak CoWaitForMultipleHandles) i rutynowo przekazywać komunikaty podczas długotrwałych operacji.'
edytowany 1x, ostatnio: west, 2018-12-24 09:20

Pozostało 580 znaków

2018-12-24 10:20
0

A co dokładnie twoja apka robi? Używa wielowatkowosci?

"ContextSwitchDeadlock" - więc raczej tak. - hiimRealgjm 2018-12-24 10:39
Jak nie masz nic sensownego do napisania to po co piszesz cokolwiek? Potrafię czytać stacji trace.. Z powyższego kodu nic nie wynika. - Deltech 2018-12-24 12:18

Pozostało 580 znaków

2018-12-24 11:36
0

Czemu używasz wątków zamiast tasków ? Pokaż cały kod, jak odpytujesz serwis. Co ten serwis zwraca i co robisz ze zwracanymi danymi ?

Pozostało 580 znaków

2018-12-25 04:44
1

Zrób zrzut pamięci na serwerze z dużym zużyciem ramu i sprawdź, co tam siedzi. Czy serwery są jednolite? Może po prostu GC nie widzi potrzeby sprzątania pamięci? Sprawdź metryki i ETW.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0