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.'