Dlaczego większość ludzi zaleca zmniejszenie swapowania do 10-20?

65

Widziałem w kilku witrynach, które zalecają zmniejszenie swapiness do 10-20 w celu uzyskania lepszej wydajności.

Czy to mit, czy nie? Czy to ogólna zasada? Mam laptopa z dyskiem 4 GB Ram i dyskiem SSD 128 GB, jaką wartość polecasz dla mojej zamiany?

Dzięki.

Saeed Zarinfam
źródło
5
Witryny, które wymieniasz, nie wyjaśniają, dlaczego zalecają zmianę domyślnej. Odpowiedzi tutaj są znacznie lepsze w przypadku tego trudnego wyboru dotyczącego skomplikowanego problemu.
nealmcb

Odpowiedzi:

88

Ponieważ większość uważa, że ​​zamiana = zła i że jeśli nie zmniejszysz swapingu, system podmieni się, gdy tak naprawdę nie będzie musiał. Żadna z tych rzeczy nie jest prawdziwa. Ludzie kojarzą zamianę z czasami, w których ich system grzęźnie - jednak najczęściej jest to zamiana, ponieważ system grzęźnie, a nie na odwrót. Kiedy system zamienia się, już uwzględnił koszt wydajności w swojej decyzji o zamianie i zdecydował, że brak takiego działania wiązałby się z większą ogólną karą w wydajności lub stabilności systemu.

Ogólnie ustawienia domyślne zapewniają dobrą ogólną wydajność i stabilność. Polecam pozostawienie go jako domyślnego. Istnieją inne możliwości dla Linuksa, aby poprawić zarządzanie pamięcią, aby rozwiązać niektóre przypadki brzegowe, ale ogólnie kontrola zamiany nie jest dobrym obejściem - dostosuj ją w jednym kierunku, możesz naprawić jeden problem i stworzyć inne problemy. Jeśli to w ogóle możliwe, po prostu zainstalowanie większej ilości fizycznej pamięci RAM (i pozostawienie swapiness w spokoju) przyćmiewa wszystkie inne środki zaradcze.

Jak Linux używa pamięci RAM

Dowolna pamięć RAM, która nie jest używana przez aplikacje, może być używana jako „pamięć podręczna”. Pamięć podręczna jest ważna dla szybkiego, płynnie działającego systemu, przyspieszającego zarówno odczyt, jak i zapis na dysku.

Jeśli aplikacje zwiększą wykorzystanie pamięci do tego stopnia, że ​​zajmują prawie całą pamięć RAM, pamięć podręczna zmniejszy się, a w rezultacie operacje dysku zostaną spowolnione. W dzisiejszych czasach nie wystarczy mieć zaledwie dziesiątki megabajtów lub mniej.

Jeśli aplikacje zwiększą wykorzystanie pamięci jeszcze bardziej - zakładając, że nie masz przestrzeni wymiany - nie tylko nie będziesz mieć pamięci podręcznej, ale w końcu zabraknie pamięci i twój system będzie musiał zabić działające procesy. Procesy zabijania są gorsze niż spowolnienie, ponieważ zapewniają niestabilny, nieprzewidywalny system.

Jak Linux używa wymiany

Aby rozwiązać oba te problemy, system może ponownie przydzielić część rzadko używanej pamięci aplikacji na miejsce wymiany na dysku, zwalniając pamięć RAM. Dodatkowa pamięć RAM może zapobiegać procesom umierającym z powodu braku pamięci i może odzyskać trochę pamięci podręcznej, dzięki czemu operacje dysku mogą działać płynniej.

Ta zmiana przydziału nie odbywa się jednak zgodnie z określonym punktem odcięcia. Nie osiągasz określonego procentu alokacji, po którym Linux zaczyna zamieniać. Ma algorytm „niewyraźny”. Bierze pod uwagę wiele rzeczy, które najlepiej można opisać przez „jak duży jest nacisk na przydzielanie pamięci”. Jeśli istnieje duża „presja” na przydzielenie nowej pamięci, zwiększy to szanse, że niektóre zostaną zamienione, aby zrobić więcej miejsca. Jeśli będzie mniej „presji”, zmniejszy to te szanse.

Twój system ma ustawienie „swapiness”, które pomaga dostosować sposób obliczania tego „ciśnienia”. Jest często fałszywie reprezentowany jako „procent pamięci RAM”, ale nie jest, to tylko wartość używana jako część formuły. Wartości od 40 do 60 są zalecanymi wartościami rozsądnymi, przy czym 60 jest obecnie wartością domyślną.

Pozwolenie systemowi na zamianę, gdy jest to konieczne, jest ogólnie bardzo dobrą rzeczą, nawet jeśli masz dużo pamięci RAM. Pozwolenie systemowi na zamianę, jeśli to konieczne, daje ci spokój, że jeśli nawet chwilowo wpadniesz w stan niskiej pamięci (podczas uruchamiania krótkiego procesu, który zużywa dużo pamięci), twój system ma drugą szansę na utrzymanie wszystkiego w ruchu. Jeśli posuniesz się aż do całkowitego wyłączenia zamiany, ryzykujesz, że procesy zostaną zabite z powodu niemożności alokacji pamięci.

Co się dzieje, gdy system jest zapchany i mocno zamienia się?

Zamiana jest powolną i kosztowną operacją, więc system jej unika, chyba że oblicza, że ​​kompromis w wydajności pamięci podręcznej zrekompensuje ją ogólnie lub jeśli będzie to konieczne, aby uniknąć procesów zabijania.

Wiele razy ludzie patrzą na swój system, który mocno uderza w dysk i używa dużo przestrzeni wymiany i obwiniania za to. To niewłaściwe podejście. Jeśli zamiana kiedykolwiek osiągnie taką skrajność, oznacza to, że zamiana jest próbą rozwiązania przez system problemów z niską pamięcią, a nie przyczyną problemu, i że bez zamiany uruchomiony proces przypadkowo umrze.

Co z systemami stacjonarnymi? Czy nie wymagają innego podejścia?

Użytkownicy systemu stacjonarnego rzeczywiście oczekują, że system „poczuje się responsywny” w odpowiedzi na akcje inicjowane przez użytkownika, takie jak otwarcie aplikacji, która jest rodzajem akcji, która może czasami wyzwalać wymianę z powodu wymaganego zwiększenia pamięci.

Jednym ze sposobów, w jaki niektórzy próbują to poprawić, jest zmniejszenie parametru swapiness, który może zwiększyć tolerancję systemu na aplikacje zużywające pamięć i zajmujące mało miejsca w pamięci podręcznej.

To jednak tylko zmiana bramek. Pierwsza aplikacja może teraz ładować się bez operacji wymiany, ale pozostawi mniej luzu dla następnej aplikacji, która się ładuje. Ta sama wymiana może nastąpić później, gdy zamiast tego otworzysz aplikację. W międzyczasie wydajność systemu jest ogólnie niższa z powodu zmniejszonego rozmiaru pamięci podręcznej. Tak więc jakakolwiek korzyść z ustawienia zmniejszonej zamiany może być trudna do zmierzenia, zmniejszając czasami opóźnienie zamiany, ale powodując inne wolne działanie w innym czasie. Nieznaczne zmniejszenie swapingu może być uzasadnione, jeśli wiesz, co robisz, ale obniżenie go do tak niskiego poziomu, jak 10%, może pozostawić system odporny na bardzo małe rozmiary pamięci podręcznej i pozostawić system bardziej podatny na konieczność wymiany w krótkim czasie.

Należy całkowicie wyłączyć zamianę, ponieważ utracisz dodatkową ochronę przed warunkami braku pamięci, które mogą spowodować awarię procesów lub śmierć.

Jak dotąd najskuteczniejszym rozwiązaniem jest zainstalowanie większej ilości pamięci RAM, jeśli możesz sobie na to pozwolić.

Czy i tak można wyłączyć swap w systemie, który ma dużo pamięci RAM?

Jeśli masz dużo więcej pamięci RAM, niż potrzebujesz na aplikacje, rzadko potrzebujesz wymiany. Wyłączenie zamiany prawdopodobnie nie będzie miało większego znaczenia. Ale jeśli masz dużo pamięci RAM, pozostawienie włączonej wymiany również nie będzie karane, ponieważ system nie zamienia się, gdy nie jest to konieczne.

Jedyne sytuacje, w których miałoby to znaczenie, byłyby w mało prawdopodobnej sytuacji, w której system zaczyna brakować pamięci, w wyniku czego system pamięci podręcznej jest utrudniony, i to w takiej sytuacji najbardziej chciałbyś wymienić. Dzięki temu możesz bezpiecznie pozostawić swap w normalnych ustawieniach, aby zwiększyć spokój ducha, bez negatywnego wpływu, gdy masz dużo pamięci.

Ale w jaki sposób swap może przyspieszyć mój system? Czy zamiana nie spowalnia rzeczy?

Przenoszenie danych z pamięci RAM do wymiany jest powolną operacją, ale jest podejmowane tylko wtedy, gdy jądro jest całkiem pewne, że ogólna korzyść wynikająca z utrzymania rozsądnej wielkości pamięci podręcznej przeważy to.

Kiedy dane są zamieniane, kiedy znów się pojawiają?

Dana część pamięci wróci z wymiany, gdy tylko zostanie wykorzystana - odczytana lub zapisana. Jednak zwykle wymieniana pamięć to pamięć, do której nie uzyskiwano dostępu przez długi czas i nie oczekuje się, że będzie wkrótce potrzebna.

Przenoszenie danych z wymiany jest tak samo czasochłonne, jak ich umieszczenie. Twoje jądro nie usunie z niego danych, jeśli nie będzie to konieczne. Gdy dane są zamieniane i nie są używane, pozostawia więcej pamięci na inne rzeczy, które używane, i więcej pamięci podręcznej systemu.

Czy istnieją przypadki, w których właściwe jest ograniczenie swapizmu?

Tak. Jeśli korzystasz z serwera dedykowanego dla jednej konkretnej aplikacji serwerowej, która nie korzysta z pamięci podręcznej systemu. Niektóre serwery baz danych, takie jak serwer Oracle, MySQL / MariaDB, zalecają w niektórych przypadkach zmniejszenie zamiany do 1 do 10, ponieważ te silniki baz danych używają własnego buforowania.

Zauważ, że jest to prawdą tylko wtedy, gdy twój system jest dedykowany do tego jednego zadania, aw przypadku MySQL / MariaDB tylko wtedy, gdy używasz wyłącznie InnoDB lub XtraDB, a nie MyISAM lub Aria itp.

thomasrutter
źródło
Dziękujemy za dokładny opis. Myślę, że w moim przypadku (4 GB RAM i 128 GB SSD twardy) i przy moim użyciu (rozwój Java EE i kilka systemów operacyjnych w Vitual Box) odpowiednia jest swappiness = 20. Co myślisz?
Saeed Zarinfam,
Moim zdaniem domyślna wartość 60 byłaby najlepsza.
thomasrutter
4
@BlancaHiggins czy przeczytałeś post, który skomentowałeś? Twój komentarz nie opisuje tego, co faktycznie robi zamiana.
thomasrutter
1
To doskonała odpowiedź. Dziękuję bardzo za tak wspaniałe wytłumaczenie.
Dan Barron,
2
Część informacji zawartych w SwapFaq jest, moim zdaniem, myląca: ustawienie tej wartości na 100 spowoduje „agresywną” zamianę. Myślę, że dokładniej jest powiedzieć, że jest to bardzo ostrożne, proaktywne ustawienie, zmieniające się przy pierwszym znaku, że dostępna pamięć lub pamięć podręczna jest nawet trochę niższa. Podczas gdy niskie ustawienia, takie jak 10, są bardziej ryzykowne, szukają dreszczyku emocji, unikając robienia zamiany, dopóki dostępna pamięć nie będzie bardzo niska i pamięć podręczna prawie całkowicie zniknie, pozostawiając system bez większego wahania miejsca.
thomasrutter
14

Na zwykłym pulpicie masz 4-5 aktywnych zadań, które zajmują 50–60% pamięci. Jeśli ustawisz swappiness na 60, wówczas około 1 / 4-1 / 3 stron AKTYWNYCH zadań zostanie zamienionych. Oznacza to, że dla każdej zmiany zadania, dla każdej nowej otwartej karty, dla każdego wykonania JS będzie proces wymiany.

Rozwiązaniem jest ustawienie swapiness na 10. Z praktycznych obserwacji powoduje to, że system rezygnuje z pamięci podręcznej dysku io (która odgrywa niewielką lub żadną rolę na pulpicie, ponieważ pamięć podręczna odczytu / zapisu praktycznie nie jest używana. Chyba że ciągle kopiujesz DUŻE pliki) zamiast wypychać cokolwiek do zamiany. W praktyce oznacza to, że system odmówi zamiany stron, zamiast tego wycinając pamięć podręczną io, chyba że trafi w 90% używanej pamięci. A to z kolei oznacza płynne, bezproblemowe i szybkie korzystanie z pulpitu.

Na serwerze plików chciałbym jednak ustawić swapiness na 60 lub więcej, ponieważ serwer nie ma ogromnych aktywnych zadań pierwszego planu, które muszą być przechowywane w pamięci jako całości, ale raczej wiele mniejszych procesów, które działają lub śpią, i tak naprawdę nie zmieniają natychmiast swojego stanu. Zamiast tego serwer często podaje (wybacza) dokładnie te same dane klientom, dzięki czemu pamięci podręczne io wiele bardziej cenne. Na serwerze znacznie lepiej jest wymienić procesy uśpienia, zwalniając miejsce w pamięci dla żądań pamięci podręcznej dysku.

Jednak na komputerach to dokładne ustawienie prowadzi do zamiany bloków pamięci PRAWDZIWYCH aplikacji, które niemal stale modyfikują lub uzyskują dostęp do tych danych.

Co dziwne, przeglądarki często rezerwują duże fragmenty pamięci, które ciągle modyfikują. Kiedy takie fragmenty są wymieniane, może minąć trochę czasu, jeśli zostaną zażądane z powrotem - a jednocześnie przeglądarka będzie aktualizować swoje pamięci podręczne. Co powoduje ogromne opóźnienia. W praktyce będziesz siedział 2 minuty i czekał na załadowanie pojedynczej strony internetowej w nowej karcie.

Pulpit tak naprawdę nie przejmuje się dyskiem io, ponieważ rzadko czyta i zapisuje w pamięci podręcznej powtarzające się duże porcje danych. Cięcie na dysku io, aby po prostu uniknąć zamiany tak bardzo, jak to możliwe, jest znacznie bardziej korzystne dla komputerów stacjonarnych, niż mieć 30% pamięci zarezerwowanej na pamięć podręczną dysku z 30% pamięci RAM (pełnej bloków należących do aktywnie używanych aplikacji).

Wystarczy uruchomić htop, otworzyć przeglądarkę, GIMP, LibreOffice - załaduj tam kilka dokumentów, a następnie przeglądaj przez kilka godzin. To naprawdę takie proste.

Linux, koleś
źródło
3
+1 dla opisu różnic między serwerem a komputerem stacjonarnym. Pamięć podręczna dysku serwera może być wykonana na polu dysku.
Dee
Jeśli tak jest, dlaczego zarówno wersja serwerowa, jak i stacjonarna Ubuntu domyślnie zmienia się na 60? Jeśli to, co twierdzisz, jest prawdą, to bardziej sensowne byłoby, gdyby wersja dla komputerów stacjonarnych miała domyślną wartość 20 lub nawet 10, ale tak nie jest.
JAB
1
Odniesienie do wniosku, że zamiana jest bezpośrednim procentem pamięci RAM, która zostaje zamieniona? Nie sądzę, że tak to działa.
Xen2050
1
Nie ma Swappiness nie jest związany z procentem pamięci RAM. Jest to pokrętło, które dostosowuje algorytm rozmytego do prawdopodobieństwa zamiany w danej sytuacji problemowej. Myślę również, że opis obciążeń serwera względem komputera w tej odpowiedzi zawiera szereg założeń, które nie zawsze się utrzymują.
thomasrutter
9

Jeśli korzystasz z serwera Java w systemie Linux, powinieneś naprawdę rozważyć zmniejszenie zamiany o wiele więcej niż domyślna wartość 60. Tak więc 20 to naprawdę dobry początek. Zamiana jest zabójcą dla procesu zbierania śmieci, ponieważ zbiory za każdym razem muszą dotykać dużych części pamięci procesu. System operacyjny nie ma środków na wykrycie takich procesów i dostosowanie ich do swoich potrzeb. Najlepszą praktyką jest unikanie jak największej wymiany wydajnych serwerów aplikacji.

Andreas
źródło
Prawdą jest, że jeśli poświęcisz serwer wyspecjalizowanemu obciążeniu, o którym wiesz, że nie skorzysta z pamięci podręcznej systemu (jak serwer bazy danych), wówczas zmniejszenie swapowania może mieć sens. Nie sądzę jednak, aby wywóz śmieci był wystarczająco wyspecjalizowany. Jeśli pamięć jest dotykana często, nie zostanie zamieniona, będzie przechowywana w fizycznej pamięci RAM. Nie dzieje się tak tylko wtedy, gdy masz poważną słabą pamięć - a zamiana nie jest odpowiedzialna.
thomasrutter,
4

Sugerowałbym przeprowadzenie kilku eksperymentów przy otwartym monitorze systemu, aby zobaczyć dokładnie, pod jakim obciążeniem znajduje się twój komputer, działam również z 4 GB pamięci i 128 GB SSD, więc zmieniłem wartość swapiness na 10, co nie tylko poprawiło wydajność podczas obciążenia, ale jako bonus wydłuży również żywotność dysku SSD, ponieważ będzie on mniej obciążał zapisy.

Aby zapoznać się z prostym samouczkiem wideo, w jaki sposób to zrobić z pełnym objaśnieniem, zobacz poniższy film na YouTube

http://youtu.be/i6WihsFKJ7Q

Kompas techniczny
źródło
1
Świetne wideo, które nakręciłeś, ale tak naprawdę nie odpowiada bezpośrednio na pytanie, jest to raczej poradnik na temat zmiany zamiany.
jmunsch
+1 za wskazówkę dotyczącą życia SSD, dla SSD najlepiej jest, jeśli system jest w jak największym stopniu tylko do odczytu, reszta powinna pozostać w pamięci, a dziś pamięć nie jest zwykle dużym problemem na obecnych komputerach stacjonarnych.
Dee,
3

Chcę dodać perspektywę od inżyniera Big Data Performance, aby dać innym tło do technologii 2017.

Moje osobiste doświadczenie polega na tym, że chociaż zwykle wyłączałem zamianę, aby zagwarantować, że moje systemy działają z maksymalną prędkością, na mojej stacji roboczej z powodu konkretnego problemu, odkryłem, że zamiana 1 i 10 prowadzi do zamrożenia (na zawsze) i długich przerw. Swappiness 80 dla tej konkretnej aplikacji prowadzi do znacznie lepszej wydajności i krótszych przerw niż domyślna (60). Zauważ, że miałem 8 GB pamięci RAM i 4x 256 GB wymiany z 1 dyskiem twardym. Zwykle podawałbym dokładne statystyki widoczne w moich testach porównawczych i pełnych specyfikacjach sprzętowych, ale jeszcze tego nie zrobiłem i nie jest to ważny najnowszy pulpit niższej klasy.

W mojej poprzedniej firmie powodem, dla którego nie zezwoliliśmy na zamianę na serwery Spark z [500 GB do 4 TB] x [10–100] węzłów, jest to, że widzieliśmy słabą wydajność jako znak do przeprojektowania potoku danych i struktur danych w bardziej wydajny sposób. Nie chcieliśmy również testować dysków twardych / SSD. Ponadto zamiana takiej pamięci RAM wymagałaby 10-30 dysków na węzeł z równoległymi zapisami, aby zminimalizować czas dostępu do dysku.

Dzisiaj, 20 lat temu i 20 lat w przyszłości, nadal pozostanie sprawa, że ​​niektóre problemy są zbyt duże dla pamięci RAM. Przy nieskończonym czasie i pieniądzach możemy kupić / wydzierżawić więcej sprzętu lub przeprojektować dowolny proces, aby uzyskać wydajność na pożądanym poziomie. Zamiana to tylko hack, który pozwala nam zignorować prawdziwy problem (nie mamy wystarczającej ilości pamięci RAM i nie chcemy wydawać więcej pieniędzy).

Dla tych, którzy uważają, że wyższa zamiana jest złą radą, oto mała perspektywa. W przeszłości dyski HD miały tylko kilka KB pamięci podręcznej, jeśli w ogóle. Interfejs to IDE / Parallel ATA. Magistrala procesora była również znacznie wolniejsza, podobnie jak pamięć RAM i wiele innych rzeczy. Krótko mówiąc, pod każdym względem systemy były bardzo powolne (w stosunku do dzisiejszych). Kilka lat temu dyski twarde korzystały z SATA3. Dziś używają protokołu NVMe, który ma znaczną poprawę opóźnień. Dyski HD mają wiele MB pamięci podręcznej. A najciekawsze jest to, że używasz nowoczesnego dysku SSD (znacznie bardziej stabilnego odczytu / zapisu i perf) i NVMe lub PCIe jako magazynu wymiany. To najlepszy kompromis między kosztem a wydajnością. Nie próbuj tego w przypadku tanich lub starych dysków SSD.

Zamień + dyski SSD! W przypadku wysokowydajnej pamięci lotnej zdecydowanie polecam eksperymentowanie z wysoką wartością swapiness. Zależy to głównie od wzorców dostępu do pamięci (losowy dostęp do całej pamięci w porównaniu do rzadko uzyskiwanego do większości), wykorzystania pamięci, jeśli przepustowość dysku jest już nasycona, i rzeczywistego kosztu przeładowania.

ldmtwo
źródło
1

Może się zdarzyć, że wiele z zachowań polegających na zamianie podczas uruchamiania lub otwierania programów polega na czytaniu plików konfiguracyjnych itp. Z dysku przez system Linux. Być może najlepiej jest poszukać programu monitorującego system przed założeniem, że dostęp do dysku twardego wynika z zamiany.

użytkownik1740850
źródło