Mam niestandardową aplikację serwera działającą w systemie Windows 2008 R2. Jest to domowa usługa Windows napisana w .Net, obsługująca wiele niestandardowych terminali. Mam maszynę testową, która ma podobną specyfikację jak serwer na żywo i mam zestaw symulatorów klienta, których mogę użyć do wytworzenia obciążenia, które jest rozsądnym przybliżeniem rzeczywistego systemu. Muszę być w stanie obsłużyć 12 000 z nich, a obecnie na serwerze brakuje pamięci (stronicowanie przechodzi przez dach).
Moim planem było uruchomienie tylko 100 symulatorów, zmierzenie zużycia pamięci, a następnie ponowne uruchomienie 100 dodatkowych pomiarów pamięci i powtarzanie do momentu, gdy stronicowanie zacznie rosnąć (w rzeczywistości zajmę więcej niż trzy punkty danych.) To powinno dać mi wartość dla ilość dodatkowej pamięci wymaganej dla 100 symulatorów i umożliwia mi wyświetlenie wymaganej ilości pamięci. Potrzebuję tylko wstępnego pomysłu +/- 30 Gb, aby uniknąć zakupu pełnych 2 TB (o wartości 150 000 USD), które zabierze serwer. Moje pytanie brzmi, czy jest to rozsądna metoda, a jeśli tak, to które liczniki wydajności monitorujesz, aby podać ilość faktycznie używanej pamięci?
Mówię tu konkretnie o pamięci, ponieważ dezorientują mnie różnice między zestawem roboczym, prywatnymi bajtami, zaangażowanymi, współdzielonymi, wirtualnymi i wszystkimi innymi warunkami pamięci. Myślę, że potrafię samodzielnie monitorować procesor, operacje we / wy i sieć. Inną rzeczą, którą zauważyłem, jest to, że pamięć .NET Cache dostosowuje zużycie pamięci w zależności od tego, co jest dostępne, co utrudnia dostrzeżenie trendu.
źródło
Odpowiedzi:
Szczerze? I NIE .
Określając serwer, który będzie widział rzeczywiste obciążenie pracą, napycham tyle pamięci RAM, na ile jestem w stanie sobie pozwolić (systemy są bardziej narażone na ograniczenie pamięci RAM niż procesora lub dysku - jedynym innym gwarantowanym wąskim gardłem jest strona frontowa autobus).
Jeśli chcesz dowiedzieć się, ile pamięci RAM aplikacja może korzystać z podstawowego testu obciążenia jakbyś proponowany jest początek dobre, ale jeśli już mają ten system produkcji (to brzmi jak to zrobić) i system produkcji jest zamiana swoje zadanie jest łatwiejsze: dowiedz się, ile zużywasz przestrzeni wymiany -> Dodaj przynajmniej 2x tyle pamięci RAM (zaokrąglij w górę, aby zmieściła się w ograniczeniach wielkości DIMM twojego systemu).
Jeśli wykonujesz test obciążenia, aby uzyskać przybliżone liczby i ekstrapolować stamtąd, pamiętaj o uwzględnieniu kilku rzeczy:
Krzywa pamięci będzie prawdopodobnie składać się z dwóch odrębnych segmentów
(początkowe gwałtowne przyspieszenie w miarę buforowania szkieletów / bibliotek współużytkowanych, a następnie nieco mniej stroma krzywa, gdy kod nowej aplikacji jest niepodzielny)
Nadal potrzebujesz wolnej pamięci RAM na buforowanie dysku i bibliotek współdzielonych oraz na system operacyjny.
(To powinno być co najmniej kilka koncertów ponad to, czego potrzebuje Twoja aplikacja)
WSZYSTKIE oprogramowanie przecieka pamięć (przynajmniej wszystkie praktyczne oprogramowanie to robi), więc uważaj na to podczas testów i upewnij się, że masz miejsce na poradzenie sobie z wyciekiem.
Twoje obciążenie prawdopodobnie wzrośnie w trakcie życia serwera. Zaplanuj odpowiednio.
(Jeśli nie masz dobrych numerów planowania wydajności, podwoj dzisiejsze obciążenie i planuj sobie z tym poradzić).
Kupowanie dziś zbyt dużej ilości pamięci RAM jest tańsze niż jutro.
źródło
Dzięki, aktualizacja przynajmniej daje wszystkim wskazówkę. To, że rozważasz 2 TB pamięci, oznacza, że grasz w innym boisku niż zwykłe konfiguracje. Duży system. nienawidzę myśleć o tym, ile ciepła będzie gasić.
Biorąc pod uwagę, że jest to proces wewnętrzny serwera i kończy się pamięć (nie mówisz, na jakim poziomie zaczynasz stronicować), ale chciałbym wyeliminować możliwość, że proces serwera zużywa coraz więcej pamięci przed przejściem dalej. Jeśli to nastąpi, nie ma znaczenia, co zrobisz, system zatrzyma się w pewnym momencie.
Nie znam żadnych ogólnych narzędzi, których można by użyć, aby zapewnić znacznie więcej niż podstawowy przegląd tego, co się dzieje ... co jest związane z systemem Windows. Sam proces serwisowy to czarna skrzynka, a zespół programistów musi zapewnić narzędzia do monitorowania.
Szybki powrót do obliczenia koperty:
Nie byłoby to poza zasięgiem normalnego zestawu roboczego exe .net.
Czy usługa ma wiele wątków? Jeśli uruchamiają wątek dla każdego połączenia, warto zastanowić się, jak to robią. ProcExp.exe z Microsoft jest łatwym sposobem na sprawdzenie, czy masz wiele wątków i ile one zużywają. Nie wie o .net, ale da ci liczniki win32.
Czy możesz wskazać, ile pamięci i ile połączeń miałeś podczas testowania przed rozpoczęciem stronicowania?
Jak więc ustalić, czy proces serwera ma problemy z wyciekiem pamięci? Może gromadzić więcej pamięci z każdą połączoną sesją lub gromadzić pamięć i nigdy jej nie zwalniać.
Co możesz zrobić - wybierz liczbę sesji, które nie wywołują stronicowania i symuluj tę liczbę połączeń. - Uruchom symulację przez kilka godzin i użyj perfmon do oglądania podstawowych liczników pamięci. - Powtórz te testy z sesjami, które łączą się na krótko i rozłączają.
Chodzi o to, aby sprawdzić, czy usługa zużywa coraz więcej pamięci z każdą sesją, czy też sesje otwarte powodują coraz większe zużycie pamięci.
źródło