Jak oceniasz ile pamięci kupić?

10

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.

Martin Brown
źródło
Byłbym bardzo ostrożny w prognozowaniu użycia pamięci na podstawie 2 punktów danych tak blisko siebie. Miałem poważne wątpliwości, czy użycie pamięci (i we / wy, jeśli chodzi o tę kwestię) będzie skalowane liniowo. Może, ale podejrzewam, że zmierza w kierunku nieliniowych, gdy przechodzisz do dużych liczb. Testowałbym z wieloma punktami danych, przechodząc od małych do dużych, aż wydajność stanie się problematyczna (stronicowanie, nasycenie we / wy itp.) I stamtąd wyświetlał. Jeśli możliwe jest stopniowe uaktualnianie maszyny i kontynuowanie symulacji z większą liczbą klientów, robiłbym to, dopóki nie poczuję dobrego kształtu krzywej.
Evan Anderson
Musisz także lepiej zrozumieć, co to jest. Czy to jest sieć? aspx? php? Coś z domu? Zadania wsadowe? Zachowanie asp.net różni się od wielu plików exe działających na pudełku. Potrzebujesz podstawowej wiedzy o tym, z czego system korzysta na użytkownika - ok. dane - a potem stara koperta. Sposób uzyskania tych liczb zależy od tego, jak działa system.
Ian Murphy
@Evan. Zawsze zamierzałem wziąć więcej niż dwa punkty danych.
Martin Brown
@Ian: „Kilka podstawowych informacji na temat tego, czego system używa na użytkownika”, jest tym, co staram się znaleźć. Gdybym to wiedział, nie musiałbym zadawać pytania. Zaktualizowałem pytanie, aby spróbować opisać twoje inne punkty.
Martin Brown

Odpowiedzi:

8

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:

  1. 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)

  2. 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)

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

  4. 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ć).

  5. Kupowanie dziś zbyt dużej ilości pamięci RAM jest tańsze niż jutro.

    • Pierwsza konsekwencja: jeśli kupisz nieco większy serwer, niż potrzebujesz, jesteś prorokiem, który utrzymywał firmę. Będziesz w dużej mierze ignorowany i niedoceniany.
    • Druga konsekwencja: jeśli maszyna jest zbyt mała i występują problemy, jesteś niekompetentnym bufonem, który nie mógł przewidzieć 500% wzrostu i wszyscy cię nienawidzą.
voretaq7
źródło
Akceptuję następstwa.
mfinni
3
@mfinni It's funny, bo to prawda !
voretaq7
Dziękuję za to. Chociaż mamy ten system na żywo, obecnie obsługuje on bardzo mały okres próbny, co oznacza, że ​​nie mogę uzyskać dobrych wyników.
Martin Brown
0

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:

2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb
1048576Mb / 13000 connections = around 80mb per session

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.

Ian Murphy
źródło