CentOS Ile SWAP na 16 GB pamięci RAM?

11

Ile SWAP dałby instalację CentOS na podwójnym czterordzeniowym XEON z 16 GB pamięci RAM, który będzie działał na stronie php z zapleczem mysql - średnie / duże obciążenie?


źródło

Odpowiedzi:

20

Nie więcej niż jeden lub dwa - chcesz trochę wymiany, na wszelki wypadek i ponieważ pomaga to działać trochę lepiej, ale jeśli kiedykolwiek dojdziesz do punktu, w którym mocno zamieniasz, maszyna idzie aby być bezużytecznym - w prawdziwej katastrofalnej sytuacji lepiej jest mieć mniejszą przestrzeń wymiany, ponieważ wtedy aktywujesz zabójcę OOM wcześniej niż później.

genhack
źródło
7
I pamiętaj, że zawsze możesz dodać więcej przestrzeni wymiany później, jeśli jest to potrzebne, tworząc trochę miejsca i tworząc nowy wolumin (jeśli używasz LVM) lub używając pliku jako wymiany z czymś takimdd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file
David Spillett
3
Na marginesie możesz kontrolować stopień zamiany, dostosowując wartość / proc / sys / vm / swappiness.
David
2
Muszę się nie zgodzić z kilkoma punktami tutaj. . . Po pierwsze, dysk jest tani, równie dobrze możesz wrzucić do niego kilka GB. Po drugie, zabójca OOM może zdjąć całe twoje pudełko, jeśli nie będziesz miał szczęścia. Poleganie na nim w jakikolwiek sposób lub uznanie, że lepiej uruchomić zabójcę OOM, jest bardzo złym pomysłem. Myślenie, że potencjalnie zamknięta skrzynia jest lepsza niż potencjalne spowolnienie, jest również złym pomysłem. Jedynym rozsądnym momentem jest zaplanowanie bardzo konkretnej konfiguracji wokół tej sytuacji.
Christopher Cashell
uwaga dodatkowa: ogólnie lepiej ustawić swap na partycję, a nie plik, aby uniknąć kosztów ogólnych i uprościć proces uruchamiania. jednak użycie pliku będzie działać. 4 GB to wszystko, czego potrzebuje każdy system, wątpię, czy i tak zostaniesz znacznie zamieniony dzięki
Silverfire,
W rzeczywistości, według Andrew Mortona, wydajność powinna być mniej więcej taka sama między plikiem
Journeyman Geek
8

Przepraszam za bardzo długą odpowiedź. Od jakiegoś czasu chciałem umieścić te rzeczy w miejscu dostępnym!

TLDR; Teoretycznie odpowiedź brzmiałaby „prawdopodobnie nie mniej niż całkowita ilość pamięci rezydentnej, której wszystkie aplikacje chcą używać”

Spróbuję wyjaśnić, czy zostaniesz ze mną ...

Trochę o pamięci wirtualnej

Wydaje mi się, że w dzisiejszych czasach powszechne jest nieporozumienie na temat wartości wymiany i jej celu. Często uważa się, że swap jest rozumiany jako „bank rezerw” dla pamięci, gdy brakuje jej pamięci. Tak, jest to częściowo prawda, ale jądro nie chce używać twojej wymiany jako banku rezerw . Ponadto jądro nigdy nie chce wywoływać dysku, aby uzyskać dane, których szukasz!

W obszarze aplikacji jest wiele rzeczy, które jądro będzie przechowywać w pamięci.

  • Zmapowane dane pliku.
  • Systemy plików tmpfs.
  • Surowa pamięć aplikacji przydzielana w czasie wykonywania.
  • Kod aplikacji (np. Elementy w segmencie danych formatów ELF)
  • Dane pliku w prywatnym kształcie.

Do celów zarządzania pamięcią przydział pamięci jest wspierany w takiej lub innej formie przez urządzenie wspomagające.

Pamięć oparta na plikach to pamięć pochodząca z pliku, która w typowym systemie operacyjnym stanowi zdecydowaną większość przydziału pamięci w systemie. Zawiera pliki, takie jak biblioteki współdzielone, które zostały załadowane, pliki odczytane z dysku i zapisane w pamięci podręcznej strony oraz pliki ukształtowane z dysku (w rzeczywistości jądro nie rozróżnia stron między plikami w pamięci podręcznej strony i plikami zmapowanymi jako zasadniczo to samo).

Wspaniałą rzeczą w tej pamięci z punktu widzenia jądra jest jej jednorazowość, to znaczy, że powinna istnieć możliwość zrzucenia tych stron, jeśli potrzebna jest pamięć na coś innego, i to właśnie robi pamięć podręczna stron, jeśli nagle pamięć jest wymagana.

Anonimowo wspierana pamięć to inna sprawa. Pamięć z tego regionu jest anonimowa, ponieważ na dysku nie ma pliku, który faktycznie zawiera te dane. Zwykle składa się ze stosu aplikacji, sterty, wszystkiego w tmpfs i danych mmapped, które są prywatne i zostały zmodyfikowane (ponieważ nie można zsynchronizować tych rzeczy z powrotem na dysk). Ponieważ w systemie plików po prostu nie ma prawidłowego pliku do zapisania tych stron, jeśli ulegną zmianie, anonimowo zabezpieczona pamięć jest wspierana przez nośnik wymiany.

Teraz jądro wie, że kiedy brakuje pamięci, o wiele tańsze jest porzucenie pamięci opartej na plikach anonimowo odwzorowanej pamięci, to znaczy, ponieważ anonimowe dane mają znacznie większą szansę na „zabrudzenie” niż dane zabezpieczone plikami, w rzeczywistości jądro ocenia pamięć anonimowo jako 80-krotnie bardziej wartościową niż pamięć zabezpieczona plikiem i tak właśnie robi modyfikator swapiness na Linuksie (zobacz ten post tutaj, jeśli chcesz wiedzieć, co dokładnie zmienia parametr swappiness).

Najgorszy scenariusz

Najgorszy scenariusz, w którym serwer wymyka się spod kontroli i OOMing opiera się na fakcie, że spędza zbyt dużo czasu na przetwarzaniu żądań We / Wy niż na honorowanie żądań alokacji pamięci. Istnieją dwa warunki, które mogą wywoływać te kryteria.

  • Przez cały czas zmienia się anonimowa pamięć, aby pobierać strony na żądanie lub przydzielać więcej stron dla aplikacji.
  • Poświęcenie zbyt dużo czasu na pobieranie danych z dysku, ponieważ nie ma go w pamięci, niż dajesz na wykonanie procesów wymagających czasu procesora.

Pierwszy to powszechnie uważany problem. To znaczy, ponieważ tak wiele pamięci żyje w swapie, trzeba zamienić anonimową pamięć z pamięci RAM, umieścić ją z powrotem w swap, a następnie wziąć coś z swap i umieścić w prawdziwej pamięci RAM. Ta operacja jest bardzo kosztowna, spowalniając maszynę do punktu, w którym może stać się sytuacją nie do odzyskania (ponieważ w kolejce żądań stron jest więcej rzeczy niż to, co można obsłużyć z I / O).

Drugi jest mniej rozważany, ale równie ważny. Jeśli przeznaczysz prawie całą pamięć na rzeczywiste dane aplikacji - nie przetrwasz długo. Prawie każda aplikacja wymaga do odczytu plików z systemu plików, może to wynikać z tego, że niektóre instrukcje znajdują się we wspólnej bibliotece lub dlatego, że musisz odczytać plik /etc/resolv.conf w celu wywołania biblioteki lub w innym celu. Całkowicie prawdopodobne jest zatrzymanie systemu operacyjnego - a jednak posiadanie wystarczającej ilości pamięci, aby pasowało do wszystkich aplikacji, ale ponieważ w kolejce tak wielu żądań We / Wy nic nie ma szans na prawidłowe wykonanie.

Co jądro chce zrobić z twoją zamianą?

Jądro chce użyć twojej wymiany, aby pozbyć się stron marnujących pamięć, aby móc użyć tej pamięci do czegoś innego.

Zasadniczo, podczas normalnej pracy, jądro uwielbia agresywnie wypełniać pamięć podręczną stron danymi odczytanymi z dysku, co oznacza, że ​​nie będzie czytać dysku dla tych samych danych. Jest to dobry projekt i może znacznie zmniejszyć liczbę operacji we / wy. Możliwe, że masz w pamięci aplikację, która śpi przez 3 dni, budzi się, wykonuje sporo pracy, a następnie śpi kolejne 3 dni.

Jądro chciałoby zrobić z tymi danymi, aby zamienić je na miejsce dla działania systemu plików, ponieważ masz znacznie większą szansę na częstsze korzystanie z tych stron niż ze stron używanych przez aplikację. Zamiana, w tym sensie może być transakcją 16kb na twoich nośnikach wymiany, której nie powinieneś czuć, ale w zamian uwolniłeś 16kb pamięci, którą można by wykorzystać do przechowywania danych o wartości czterech plików.

Do czego jądro nie chce używać swap

Jądro zdecydowanie nie chce używać twojej wymiany do przydzielania większej ilości anonimowej pamięci poprzez zamianę innej anonimowej pamięci, jest to sytuacja, o którą ludzie martwią się najbardziej i słusznie.

Należy jednak zauważyć, że jeśli przydzielono tak dużo pamięci, że jądro nie ma innego wyjścia, jak tylko to zrobić, jest to problem konfiguracyjny administratorów systemu, a nie samego jądra - po prostu stara się zrobić to najlepiej opcje, które dałeś!

Jeśli masz dużą liczbę swapów, czy zwiększasz szanse na ich wykorzystanie?

Nie! Jeśli masz 1G pamięci RAM i 4G wymiany, nie ma 80% szansy na zamianę danych! Jądro chce używać wymiany tylko wtedy, gdy stronom w pamięci można lepiej obsłużyć, robiąc coś innego!

Czy w ogóle nie warto używać wymiany?

Nigdy bym tego nie zrobił. Zamiana pozwala systemowi operacyjnemu pozbyć się pamięci, którą potrzebujesz, ale nigdy nie jest używana. Jeśli nie masz zamiany, po prostu połykasz pamięć, której nigdy nie odzyskasz, za co możesz zauważyć znaczną poprawę wydajności, pozwalając, powiedzmy, na bufor strony, aby ją miał.

Jaka jest najlepsza zamiana?

Teoretycznie dowiedz się, ile pamięci rezydentnej + 20% na zabezpieczenia, takie jak ponowne wywołania bibliotek, które muszą przydzielić pamięć ze sterty - a następnie ustaw swap na tę ilość. To (teoretycznie zresztą) pozwoliłoby systemowi operacyjnemu wymienić całą anonimową pamięć, gdyby musiał zrobić miejsce na coś bardziej użytecznego.

Jeśli dostanę okazję jądra do wymiany wszystkiego, co niebezpieczne, prawda?

Pamiętaj, że jądro nie chce zamieniać się tutaj, aby zrobić miejsce na bardziej anonimową alokację pamięci, będzie tylko wymieniać nieużywane strony, aby faworyzować coś innego, co lepiej wykorzysta przestrzeń.

Jeśli zamieniasz pamięć anonową tylko w celu alokacji z bardziej anonimowej pamięci, robisz coś źle i potrzebujesz więcej pamięci RAM lub zrestartujesz stos aplikacji.

Ile pamięci RAM potrzebujesz

Musisz oczywiście pozwolić na wystarczającą ilość pamięci RAM, aby uruchomić wszystkie aplikacje, ale prawdopodobnie powinieneś pozwolić dodatkowym 2G pamięci RAM na wypełnienie pamięci podręcznej - może więcej. Pamięć podręczna stron znacznie przyspiesza działanie komputera, a dyski działają dłużej. Jeśli zastanawiasz się nad uruchomieniem serwera WWW, dobrym pomysłem jest posiadanie jeszcze większej ilości pamięci podręcznej ze względu na ogromną ilość statycznych treści, które możesz odzyskać i ponownie użyć z pamięci podręcznej, które zostałyby dostarczone (jeśli przepustowość twojego serwera wynosi 5 Mb / s, naprawdę nie mimo wszystko chcesz pobierać zawartość 5 Mb / s, którą generujesz z dysku!).

Co zrobić, jeśli naprawdę nie ufasz linuxowi, aby poprawnie zamieniać

Jeśli naprawdę się martwisz, możesz przydzielić więcej pamięci niż masz:

  • Ustaw swap na nie więcej niż pamięć RAM
  • Ustaw / proc / sys / vm / overcommit_memory na 2
  • Ustaw / proc / sys / vm / overcommit_ratio na wartość, która nigdy nie może faktycznie przekroczyć fizycznych limitów pamięci RAM. Zobacz dokumentację jądra, aby dowiedzieć się, jaki byłby dla ciebie ten numer.

Jaki jest najlepszy sposób na dostrojenie pamięci dla mojej aplikacji

  • Zrozum, co faktycznie robi zamiana.
  • Użyj CGroups, aby przydzielić prawidłowe zasoby dla aplikacji.
  • Zmień wspomniany powyżej tryb nadpisywania, aby system operacyjny wymuszał ścisłe ograniczenia.
  • Użyj cgroups jak wyżej, aby ustawić priorytety OOM dla aplikacji, które naprawdę chcesz zachować, jeśli brakuje pamięci, i aplikacji, które naprawdę chcesz porzucić, jeśli brakuje pamięci.

Sprzedawca zaleca inną konfigurację.

Posłuchaj tego zamiast tego. Niektóre aplikacje są napisane w taki sposób, że celowo wywołują jądro, aby ich strony były aktywne we wszystkich innych. Szczerze mówiąc, jest to paskudna sztuczka, ale psuje zdolność jądra do płynnego zarządzania pamięcią, kiedy to się dzieje. Jeśli twój sprzedawca podaje ci szczegóły, prawdopodobnie należą do tej kategorii i słuchają tego, co mówią.

W podsumowaniu

  • Swap ma służyć jako miejsce do przechowywania zmarnowanej pamięci. Nie jako „wolna pamięć”
  • Ogromne ilości zamiany nie mają żadnego wpływu na twoje szanse na jej użycie.
  • Jądro naprawdę chce zatrzymać dostęp do dysku z danymi. Dotyczy to tak samo - jeśli nie bardziej jednakowej pamięci podręcznej stron, jak to ma miejsce w przypadku zamiany miejsca.
  • Jądro dołoży wszelkich starań, aby uszanować ustawienie podane dla uruchomionych aplikacji. Ale nie zdziw się, jeśli masz OOM, jeśli masz 500 dzieci apaczowych, które zajmują 32 MB pamięci. To wina wybranej konfiguracji, a nie zarządzania pamięcią.

Jądro zwykle dobrze wykonuje prawidłowe zarządzanie pamięcią wirtualną. Prawie zawsze jest tak, że twoja aplikacja przydziela więcej pamięci, niż możesz sobie wyobrazić, i to właśnie powoduje OOM.

Zamiana była używana jako „pamięć zapasowa”, ale nie jest już jej głównym celem, więc nie myśl o takim używaniu. Zamiast tego doceń, że twoje jądro prawdopodobnie najlepiej wie, do czego chce użyć twojej pamięci. Daj mu miejsce na podejmowanie tych decyzji, a zyskasz na ogólnej poprawie wydajności.

Matthew Ife
źródło
2

Z dokumentu „Serwer Oracle 10g na zaleceniach dotyczących wdrażania Red Hat® Enterprise Linux® 5”.

Oracle zawiera ogólne zalecenia dotyczące wielkości zamiany w MetaLink Note 169706.1. Te zalecenia mogą prowadzić do utworzenia bardzo dużej przestrzeni wymiany w systemach z dużą ilością pamięci. Bardzo duża wymiana może spowodować poważne pogorszenie wydajności systemu i można ją rozwiązać, zmniejszając przestrzeń wymiany. Red Hat nie zaleca przydzielania więcej niż 4 GB na wymianę w systemie Red Hat Enterprise Linux 5.

Tak więc dla 16 GB nie powinieneś mieć więcej niż 4 GB wymiany.

PS. Warto również zauważyć, że wywołane oomjest prawie zawsze lepsze niż proces wymiany bezużytecznego z wykorzystaniem całej przepustowości we / wy.

SaveTheRbtz
źródło
-1

Z tego, co pamiętam z dokumentacji systemu Linux: jeśli twój RAM jest większy niż 2 GB, to robisz swap = (ramSize + 2). Jeśli jest mniej, to zamień = (ramSize * 2)

Rozwiązania sieciowe MKN
źródło
-2

Znalazłem dla Ciebie ten dokument, który powinien pomóc ci podjąć tę decyzję, oto: Co to jest Swap Space? , ale żadna z powyższych odpowiedzi nie jest poprawna

Alexus
źródło
1
Dokument, do którego prowadzi link, nie zgadza się z samym sobą. Zgodnie z podaną zasadą „więcej RAM 2 Gb RAM powyżej 2 Gb” dałoby zamianę 1 Gb dla RAM 3Gb (3-2 = 1), a nie 5 Gb.
David Spillett,