Mamy około 200 serwerów, Hyper V, klaster plików i IIS, z których każdy ma ten sam problem, zdarzenie występuje na serwerze podczas normalnego użytkowania, które maksymalnie zwiększa lub prawie maksymalizuje pamięć RAM na serwerze. Kiedy to się stanie, usługa SVCHOST / Workstation, w szczególności (wyeliminowana przez izolację usługi Workstation do jej własnego SVCHOST) przestaje zwalniać uchwyty / wątki, a pamięć używana przez tę usługę nigdy nie jest zwalniana. W niektórych ekstremalnych przypadkach mamy usługi stacji roboczej, które zużywają aż 40 GB pamięci RAM na serwerze 255 GB. W niektórych przypadkach znajduje się także ponad 40 milionów uchwytów.
Po ponownym uruchomieniu problem oczywiście znika i nie pojawia się ponownie, dopóki cała pamięć nie zostanie wykorzystana, powiedzmy przez proces W3 lub maszyny wirtualne HyperV, po czym usługa stacji roboczej zaczyna pobierać całą pamięć RAM. Proces ten jest bardzo powolny i może potrwać tygodnie / miesiące w zależności od ilości pamięci RAM na serwerze.
Zarówno nasze serwery Hyper V, jak i serwery IIS uzyskują dostęp do udziałów dla działających plików, udziały te znajdują się w pamięci SSD, więc są bardzo wydajne. Zainstalowaliśmy wszystkie obecne łatki, ale nie przenieśliśmy się do R2, ponieważ mamy wiele narzędzi, które sprawią, że będzie to znaczący krok i nie znajdzie żadnego wyraźnego wskazania, że zostanie to naprawione w R2.
Uruchomiliśmy ProcMon i inne narzędzia, ale na najbardziej problematycznych serwerach te narzędzia nawet nie działają. Z drugiej strony przedstawione przez nich wyniki pokazują po prostu, że w tym procesie rzeczywiście występuje wyciek pamięci.
Czy istnieje sposób na zwolnienie pamięci z tego procesu lub całkowite uniknięcie błędu? Nie chcemy ponownie uruchamiać komputera i nie możemy ponownie uruchomić procesu, gdy jest w stanie błędu. Proces zostaje zamrożony.
Staramy się unikać regularnych restartów, aby „naprawić” ten problem, więc wszelkie odpowiedzi będą mile widziane.
Odpowiedzi:
Miałem niesamowicie podobny problem, gdy svchost niszczył wydajność serwera.
Rozwiązanie: Okazuje się, że miałem pełny dziennik zdarzeń. Wyczyściłem to i wszystko wróciło do normy, jak gdyby nigdy nic.
(Polecam również zmianę rozmiaru dziennika zdarzeń z domyślnego, patrz poniżej)
Aby ustawić maksymalny rozmiar dziennika za pomocą interfejsu systemu Windows
- Uruchom Podgląd zdarzeń.
- W drzewie konsoli przejdź do dziennika zdarzeń, którym chcesz zarządzać, i wybierz go.
- W menu Akcja kliknij polecenie Właściwości.
- W polu Maksymalny rozmiar dziennika (KB) użyj pokrętła, aby ustawić żądaną wartość, i kliknij OK.
Brzmi dokładnie tak, jak tu się dzieje, ale okazało się, że jest to naprawdę łatwa naprawa. Ponowne uruchomienie tymczasowo rozwiązałoby problem, ale gdy tylko cokolwiek spróbowało zapisać w dzienniku, wszystko wymknęło się spod kontroli i po prostu pochłaniało zasoby.
Mam nadzieję że to pomoże!
źródło
Nie ma możliwości, aby zewnętrznie (poprawnie) zwolnić przydzieloną pamięć lub obsłużyć zasoby bez zabijania niewłaściwej aplikacji.
Występuje wyciek pamięci i zasobów. Jedynym sposobem rozwiązania problemu jest znalezienie wycieku i uniknięcie jego wyzwalacza (jeśli to możliwe) lub usunięcie wycieku na poziomie kodu źródłowego; W ostatnim przypadku potrzebujesz pomocy Microsoftu przy tworzeniu łatki, ale wygląda na to, że oczekują, że powiesz im „dokładnie”, gdzie tak naprawdę jest problem.
Możesz spróbować znaleźć winowajcę, wskazując wyciek pamięci / zasobów, używając np. MS Application Verifier
źródło
Tworzenie pamięci RAM jest łatwe, ale nie ma rozwiązania.
Sugeruję Sysinternals RAMMAP lub VMMAP do głębszego zbadania. Dzięki tym narzędziom możesz lepiej zobaczyć, co się dzieje. bardzo często jest to problem z metaplikami.
Od wersji Server 2008 mamy ten problem ze wszystkimi serwerami terminali, którym kończy się pamięć z niewiarygodnym zużyciem pamięci w czasie podczas uruchamiania aplikacji z udziału.
Naszym obejściem jest hostowanie tych aplikacji na osobnym serwerze terminali i często zerowanie zużycia pamięci.
Robimy to za pomocą samodzielnie zaprojektowanej aplikacji wiersza polecenia c ++ za pomocą
SetProcessWorkingSetSize () z SeDebugPrivilege we wszystkich procesach
Zdecydowanie zaleca się, aby nie robić czegoś takiego;)
źródło