Po co używać wymiany, gdy w pamięci RAM jest wystarczająca ilość miejsca?


124

Korzystanie z przestrzeni wymiany zamiast pamięci RAM może drastycznie spowolnić komputer.

Dlaczego więc, kiedy mam więcej niż wystarczającą ilość pamięci RAM, mój system Linux (Arch) używa wymiany?

Sprawdź mój conky wynik poniżej:

conky wyjście

Czy może to być przyczyną problemów związanych z szybkością i reaktywnością systemu?

Wyjście free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357

5
Jestem prawie pewien, że dynamika tego problemu uległa znacznej zmianie, a dyski SSD stały się normą. Chociaż Twój zwykły dysk SSD jest nadal dużo wolniejszy niż pamięć RAM, teraz jest to, co jest tańsze - RAM $ / GB lub SSD $ / GB. Dysk SSD, gdy jest wolniejszy, jest znacznie tańszy, a w większości przypadków wystarczająco szybki, więc nawet zamiana nie powinna znacząco zakłócać wrażeń użytkownika, tak jak w przypadku mediów rotacyjnych.
lkraav

7
Czasami, jeśli używałeś swapów w przeszłości z powodu pełnej pamięci RAM, możesz mieć sytuację, w której wcześniej zamienione dane pozostaną tam, ponieważ w tej chwili nie są to przydatne dane.
Totor

1
Jak powiedział Totor. Czasami system coś stronicuje (z dowolnego powodu). Jeśli później strona zostanie przeniesiona z powrotem do pamięci w celu operacji odczytu, kopia w przestrzeni wymiany nie zostanie usunięta. Jeśli ta sama strona zostanie później ponownie wydrukowana, bez zmiany, można to zrobić bez ponownego zapisywania na dysku. Obecna kopia jest już aktualna. Innymi słowy, strona może zajmować miejsce zarówno w pamięci wymiany, jak i pamięci głównej.
izak

Odpowiedzi:


93

To normalne dla systemów Linux użyć jakiegoś swapa, nawet jeśli nie jest jeszcze wolny RAM. Jądro Linux przenosi się, aby zamieniać strony pamięci, które są bardzo rzadko używane (np. gettyPrzypadki, gdy używasz tylko X11 i niektórych innych nieaktywnych demonów).

Wykorzystanie przestrzeni wymiany staje się problemem tylko wtedy, gdy nie ma wystarczającej ilości pamięci RAM, a jądro jest zmuszone do ciągłego przenoszenia stron pamięci w celu zamiany i powrotu do pamięci RAM, tylko po to, aby aplikacje działały. W takim przypadku aplikacje monitorujące system wykazałyby dużą aktywność dyskową we / wy.

Dla porównania, mój system Ubuntu 10.04, z dwoma użytkownikami zalogowanymi w sesjach X11, z których oba działają na pulpicie GNOME, używa ~ 600 MB wymiany i ~ 1 GB pamięci RAM (nie licząc buforów i pamięci podręcznej fs), więc powiedziałbym, że twoje liczby do wymiany użycie wygląda normalnie.


39
Wymieniając nieaktywne programy, masz więcej pamięci do buforowania plików. A to przyspiesza.
jmanning2k

91

To zachowanie można skonfigurować, ustawiając wartość:

/proc/sys/vm/swappiness

Wartość domyślna to 60. Ustawienie na 0 oznacza, że ​​nigdy nie należy używać zamiany, gdy pozostała pamięć RAM, a 100 zamienia pamięć tak szybko, jak to możliwe.

Aby tymczasowo zmienić wartość (utraconą przy ponownym uruchomieniu):

sudo sysctl vm.swappiness=10

Aby trwale zmienić wartość, edytuj plik:

/etc/sysctl.conf

jako root (np. sudo nano /etc/sysctl.conf) i zmień lub dodaj (jeśli nie ma) linię:

vm.swappiness

do żądanej wartości. Jeśli ten plik nie istnieje (np. W Arch Linux), spróbuj /etc/sysctl.d/99-sysctl.confzamiast tego.

Odbyła się debata na temat tego, czy zamiana wolnej pamięci jest dobra czy zła, ale pomoc Ubuntu rzeczywiście zaleca wartość 10 dla komputerów stacjonarnych . Zobacz także ten samouczek na temat Digital Ocean dla CentOS .


27
Należy pamiętać, że zmniejszenie swappiness ma nie musi oznaczać wzrost wydajności lub odpowiedzią. Widziałem doniesienia o rosnącej swapingu przekładającej się na lepszą wydajność. Nie wierz w nic, co czytasz, co nie obejmuje testów porównawczych, i sprawdź, czy testy porównawcze wykorzystują obciążenie podobne do twojego.
Gilles

Czy to się utrzymuje po ponownym uruchomieniu? Myślałem, że / proc został zregenerowany przy każdym uruchomieniu.
HandyGandy,

@HandyGandy: Dodałem informacje do odpowiedzi, jak zmienić to na stałe.
Marcel Stimberg

@HandyGandy: aby być pedantycznym, / proc nie jest regenerowany przy każdym rozruchu, ale raczej proc jest wirtualnym systemem plików, więc jest „generowany” tylko podczas uzyskiwania do nich dostępu. W ogóle nie istnieje na dysku.
Lie Ryan,

swappinesswartość nie ma wpływu na mój system. Nawet ustawienie go na 0 spowoduje, że kluczowe i często używane strony (np. Indeks mojego IDE) zamieniają się, gdy nadal jest wolny 2 GB RAM.
chefarov,

46

Linux zaczyna zamieniać, zanim pamięć RAM zostanie zapełniona. Odbywa się to w celu poprawy wydajności i szybkości reakcji:

  • Wydajność jest zwiększona, ponieważ czasami pamięć RAM jest lepiej używana do buforowania dysku niż do przechowywania pamięci programu. Lepiej więc zamienić program, który był nieaktywny przez pewien czas, i zamiast tego przechowywać często używane pliki w pamięci podręcznej.

  • Szybkość reagowania poprawia się poprzez zamianę stron, gdy system jest bezczynny, a nie kiedy pamięć jest pełna, a jakiś program działa i żąda więcej pamięci RAM, aby wykonać zadanie.

Zamiana spowalnia oczywiście system - ale alternatywą dla zamiany nie jest zamiana, ale posiadanie większej ilości pamięci RAM lub użycie mniejszej ilości pamięci RAM.


Więc, w pewnym sensie, zamiana jest środkiem w przypadku ? To i hibernacja ?
tshepang

@ Tshepang: Posiadanie wystarczającej ilości wymiany, aby zmieścić się w pamięci wirtualnej, nie jest „na wszelki wypadek”, jest konieczne (w przeciwnym razie twoje programy ulegną awarii z powodu braku pamięci).
Gilles

1
@Tschepang: Zabójca OOM jest przyczyną awarii. (Technicznie rzecz biorąc, możesz obejść się bez zabójcy OOM i po prostu nie być w stanie nic przydzielić, ale miałoby to dużą szansę na zablokowanie systemu; zabójca OOM zwiększa prawdopodobieństwo, że administrator będzie mógł się zalogować i dla ważnych procesów, które mają być kontynuowane.)
Gilles

1
Rozumiem twój punkt „zamiana stron, gdy system jest bezczynny, a nie kiedy pamięć jest pełna”, ale facet ledwo zużywa 15% pamięci RAM. Daleko od prawie pełnego, prawda? Chociaż poprzednia zamiana spowodowana przez pełną pamięć RAM mogła opuścić tę sytuację ...
Totor

1
„Linux zaczyna się zamieniać, zanim pamięć RAM się zapełni”, kiedy? dokładnie
Yousha Aleayoub

11

To jest stary post, jednak nadal chciałbym się tutaj wypowiedzieć.

Począwszy od dołu, Linux najpierw dzielił pamięć na strony (zwykle 4K na stronę w systemie x86_64). Następnie tworzona jest pamięć wirtualna, której mapowanie odbywa się za pomocą pamięci fizycznej za pomocą MMU (Memory Management Unit).

Procesom przydzielana jest pamięć z obszaru pamięci wirtualnej, więc pamiętaj, że gdy zobaczysz / proc / meminfo, zobaczysz VMalloc * jako szczegóły pamięci wirtualnej.

Powiedzmy, że masz proces, który żąda pamięci (powiedzmy 300 MB - przeglądarka internetowa). Proces zostanie przydzielony 300 MB z pamięci wirtualnej, jednak nie jest konieczne mapowanie pamięci (która jest mapowana na pamięć fizyczną). Istnieje koncepcja „Kopiuj przy zapisie” do zarządzania pamięcią, zgodnie z którą, jeśli twoje procesy faktycznie korzystają z pamięci przydzielonej z pamięci wirtualnej (to znaczy, że zapisuje w pamięci), tylko wtedy jest mapowane na pamięć fizyczną. Pomaga to jądrze poprawnie działać w środowisku wieloprocesowym.

Co to jest pamięć podręczna?

Wiele pamięci wykorzystywanej przez procesy jest współdzielone. Powiedzmy, że biblioteka glibc jest używana przez prawie wszystkie procesy. Jaki jest sens przechowywania wielu kopii glibc w pamięci, kiedy każdy proces może uzyskać dostęp do tej samej lokalizacji w pamięci i wykonać zadanie. Tak często używane zasoby są przechowywane w pamięci podręcznej, dzięki czemu, gdy procesy wymagają, można je odnieść do tej samej lokalizacji pamięci. Pomaga to w przyspieszeniu procesów, ponieważ ponowne czytanie glibc (itp.) Z dysku byłoby czasochłonne.

Powyższe dotyczyło bibliotek współdzielonych, powiedzmy, podobnie jest również w przypadku odczytu plików. Jeśli po raz pierwszy przeczytasz duży plik (powiedzmy 100-200 MB), zajmie to dużo czasu. Gdy jednak spróbujesz powtórzyć ten sam odczyt, będzie to szybsze. Dane były buforowane w pamięci, a ponowne odczytanie nie zostało wykonane dla wszystkich bloków.

Co to jest bufor?

Jeśli chodzi o bufor, gdy proces wykonuje operacje we / wy pliku, polega na buforze jądra do zapisywania danych na dysku. Procesy żądają od jądra wykonania zadania. Zatem w imieniu procesu jądro zapisuje dane do swojego „bufora” i informuje proces, że zapis został zakończony. W asynchroniczny sposób jądro będzie synchronizowało te dane w buforze na dysk. W ten sposób procesy polegają na tym, że jądro wybiera właściwy czas do zsynchronizowania danych na dysk, a procesy mogą dalej działać. Pamiętaj, że są to ogólne operacje we / wy wykonywane przez normalne procesy. Jednak wyspecjalizowane procesy, które muszą potwierdzić, że operacje we / wy są faktycznie wykonywane na dysku, mogą używać innego mechanizmu do wykonywania operacji we / wy na dysku. Niektóre narzędzia Open Source to Libaio. Istnieją również sposoby na wywołanie jawnej synchronizacji z FD otwartymi w kontekście procesów,

Jakie są zatem błędy strony?

Rozważ przykład, kiedy zaczynasz proces (powiedzmy przeglądarkę internetową), którego plik binarny ma około 300 MB. Jednak pełne 300 MB pliku binarnego przeglądarki internetowej nie zaczyna działać natychmiast. Proces przechodzi od funkcji do funkcji w kodzie. Jak powiedziano wcześniej, pamięć wirtualna zostałaby zużyta 300 MB, jednak nie cała pamięć jest mapowana na pamięć fizyczną (pamięć rezydentna RSS byłaby mniejsza, patrz górne wyjście). Gdy wykonanie kodu osiągnie punkt, dla którego pamięć nie jest faktycznie odwzorowana fizycznie, wystąpią błędy strony. Jądro zamapuje tę pamięć na fizyczną, skojarzy stronę pamięci z procesem. Taki błąd strony nazywa się „drobnymi błędami strony”. Podobnie mówiąc, gdy proces wykonuje operacje we / wy pliku, zgłaszane są poważne błędy strony.

Kiedy i dlaczego następuje zamiana?

Sytuacja 1:

Zgodnie z powyższymi szczegółami rozważmy scenariusz, w którym znaczna ilość pamięci zostaje zmapowana. A teraz uruchamia się proces, który wymaga pamięci. Jak omówiono powyżej, jądro będzie miało pewne mapowanie pamięci. Jednak nie ma wystarczającej ilości fizycznej pamięci RAM, aby zmapować pamięć. Teraz jądro najpierw zajrzy do pamięci podręcznej, będzie miało kilka starych stron pamięci, które nie są używane. Opróżni te strony na osobnej partycji (zwanej SWAP), zwolni niektóre strony i zamapuje zwolnione strony na nadchodzące nowe żądanie. Ponieważ zapis na dysku jest znacznie wolniejszy niż półprzewodnikowa pamięć RAM, proces ten zajmuje dużo czasu i dlatego następuje spowolnienie.

Sytuacja 2:

Powiedzmy, że widzisz dużo wolnej pamięci dostępnej w systemie. Nawet wtedy widać, że dzieje się wiele wymian. Może występować prawdopodobny problem fragmentacji pamięci. Rozważ procesy, które wymagają 50 MB ciągłej pamięci z jądra. (pamiętaj o ciągłym). Oczywiście jądro przydzieliłoby strony losowo do różnych procesów i uwolniło niektóre z nich. Jednak gdy wymagamy ciągłej pamięci, będzie ona musiała szukać fragmentu, który zaspokoi zapotrzebowanie na procesy. Jeśli nie będzie w stanie uzyskać takiej pamięci, będzie musiał zamienić niektóre stare strony pamięci, a następnie przydzielić ciągłe. Nawet w takich przypadkach nastąpi zamiana. Począwszy od jądra w wersji 2.6 i wyżej, problemy z fragmentacją znacznie się zmniejszyły. Jednak jeśli system działa przez długi czas, takie problemy mogą się pojawić.

Zobacz ten przykład ( wyjście vmstat )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04, widzimy, że wciąż jest dostępna duża ilość wolnej pamięci RAM. Jednak nawet wtedy nastąpiła zamiana. W tym momencie sprawdziliśmy drzewo procesów i nie widzieliśmy żadnego procesu, który wymagałby tak dużej ilości pamięci (więcej niż wolna pamięć). Oczywistym podejrzeniem była sytuacja 2 opisana powyżej. Sprawdziliśmy dzienniki buddyinfo i zoneinfo powyżej (użyj echo m> / proc / sysrq-trigger, aby to sprawdzić, dane wyjściowe trafiają do syslogs).

W przypadku naszego normalnego systemu porównanie informacji o strefie wygląda tak. A wykresy dla pamięci podręcznej / wolnej / niskiej pamięci są również wymienione poniżej

informacje o strefie

zamień za darmo niski za darmo

Patrząc na informacje, jasne jest, że fragmentacja pamięci w węźle 0 i węźle 1 jest normalna (węzeł jest maszyną opartą na NUMA, stąd wiele węzłów (patrz numactl, aby sprawdzić informacje dla twojego systemu)).

Fragmentacja pamięci jest również powodem, dla którego użycie wymiany może wzrosnąć, nawet jeśli dostępna jest wolna pamięć.


2
Należy wyjaśnić, czy w „sytuacji 2” wymagającym procesem jest przydzielanie pamięci fizycznej, co jest rzadkim przypadkiem. Większość procesów dotyczy tylko pamięci wirtualnej, w której fragmentacja jest prawie nieistotna. Możesz także lepiej wyjaśnić, w jaki sposób twierdzisz, że fragmentacja pamięci na podstawie liczb i wykresu jest wyświetlana, ponieważ na pierwszy rzut oka nie jest to oczywiste. Aha, a tak przy okazji, tak naprawdę mówisz o ciągłej pamięci, mam nadzieję, że nie jest to zaraźliwa pamięć ;-)
jlliagre

@jlliagre: Dzięki za dane wejściowe. Edytuję błąd „ciągły”.
Anugraha Sinha,

5

Więcej dostępnej pamięci

Jak wszyscy mówili, tak zamiana pomoże ci pozbyć się nieużywanej pamięci, dzięki czemu możesz mieć więcej dostępnej pamięci.

Hibernacja

Zamiana może być również używana do hibernacji, co może być naprawdę przydatne, gdy masz laptopa lub chcesz zaoszczędzić energię i ustawić komputer i pracować w stanie hibernacji przed wyjściem z pracy. Możesz więc zacząć dzień szybciej.

Posiadanie funkcji hibernacji jest jednym z głównych powodów, dla których wciąż widzimy, że zaleca się przynajmniej wymianę pamięci RAM na wymianę. W ten sposób system może umieścić całą zużytą pamięć RAM w swapie i przechodzi w stan hibernacji.

Niedociągnięcia

Uważaj, aby po zamianie dane procesowe mogły zostać odczytane w ramach wymiany nawet po wyłączeniu, chyba że wymiana została zaszyfrowana (oczywiście).

Używanie zaszyfrowanej wymiany w hibernacji nie działa od razu po rozpakowaniu wszystkich dystrybucji. Musisz użyć stałego klucza szyfrowania (niektóre konfiguracje losowo generują klucz szyfrowania przestrzeni wymiany przy każdym rozruchu) i initrd / initramfs, aby aktywować zaszyfrowany wolumin przed wznowieniem.


3

Wiele nowoczesnych programów jest zbudowanych na rozdętych ramach, które wciągają wiele śmieci, których tak naprawdę nie potrzebujesz, aby uruchomić program. Zamiana tych nieużywanych stron zwalnia pamięć RAM na pamięć podręczną i programy, które mogą faktycznie korzystać z pamięci RAM.

Mówię tutaj z bolesnego osobistego doświadczenia.

W zeszłym roku zmieniłem jedną ze swoich witryn na obiecującą nową platformę serwera WWW zbudowaną na Firefoxie. Może wydawać się dziwne, aby zbudować system po stronie serwera na bazie programu zorientowanego na klienta, takiego jak Firefox, ale miał on ogromne zalety. Firefox jest bardzo wydajny, oferuje naprawdę imponujące usługi wewnętrzne i zmniejsza niedopasowanie impedancji między serwerem a klientem, aby oba działały na podobnych platformach.

Ale ma to pewną wadę: Firefox jest duży. Naprawdę duży. To był projekt w wersji 1.x, więc nie zajęli się takimi rzeczami, jak usunięcie obsługi GUI. [*] Moja strona nie potrzebowała tego, ale ponieważ technologia VPS, z której korzystał mój dostawca hostingu, nie „ Zezwalaj na wymianę przestrzeni, ten kod GUI i wszystkie inne części Firefoksa, których nie używałem, zjadłem prawdziwą pamięć RAM. Skończyło się na tym, że potrzebowałem minimum 512 MB pamięci RAM, aby uruchomić witrynę bez awarii z powodu wyczerpania pamięci. Gdyby mój VPS miał trochę przestrzeni wymiany, prawdopodobnie mógłbym sobie poradzić z planem 256 MB.

[*] Usunięcie kodu GUI z frameworka może nawet nie być pożądane, ponieważ jedną z korzyści tej platformy było scrapowanie stron o wysokiej wierności, ponieważ struktura po stronie serwera mogła pobierać strony internetowe z innej witryny i można nimi manipulować tak jak po stronie klienta. Pomyśl o mashupach. Wiele takich rzeczy zepsułoby się, gdybyś nie mógł „renderować” strony internetowej w jakimś graficznym kontekście.

Nawiasem mówiąc, ta platforma internetowa jest w zasadzie martwa, więc nie ma sensu jej nazywać i zawstydzać. Najlepiej po prostu przyjmij szerszą lekcję do serca: tak, swap jest nadal przydatny, nawet jeśli masz dużo wolnej pamięci RAM.


3

Z Ubuntu Swap FAQ, z którymi łączył Marcel

Jako podstawowe minimum zdecydowanie zaleca się, aby przestrzeń wymiany była równa ilości pamięci fizycznej (RAM). Ponadto zaleca się, aby przestrzeń wymiany była dwa razy większa niż ilość pamięci fizycznej (RAM) w zależności od ilości dysku twardego

Myślę, że powinieneś zwiększyć swoją przestrzeń wymiany w systemie. Zamiana przyspiesza przydzielanie pamięci RAM, umożliwiając odrzucenie już stronicowanych danych.


6
Nadal uważam to za niewiarygodne. Dlaczego powinienem potrzebować 8 GB wymiany na 4 GB, nigdy nie hibernujący system? Czy naprawdę potrzebuję 128 GB wymiany dla mojego węzła obliczeniowego 64 GB? Zwykle przeznaczam nie więcej niż 1 GB na wymianę, chyba że istnieje konkretny powód.
David Mackintosh

2
To pozostawia więcej miejsca na buforowanie wolnego dysku twardego w błyskawicznej pamięci RAM. (Ponadto niektóre schematy hibernacji zapisują kopię pamięci RAM w obszarze
wymiany

6
@David, @Jader: Swap = 2 * baran jest starym kasztanem, który przetrwał długo po tym, jak oryginalne uzasadnienie stało się nieistotne - teraz ludzie próbują znaleźć sposób na uzasadnienie tej liczby, zamiast wymyślić odpowiednią liczbę dla swojego systemu . Zobacz, dlaczego musimy ustawić przestrzeń wymiany dwa razy większą niż nasza pamięć fizyczna? .
Gilles,

1
@Gilles Trzymam się swojego stanowiska, ponieważ widziałem kiedyś autorytatywny artykuł na ten temat, który zaprzecza grupie ekspertów, że nie wiem, jak głęboka jest ich wiedza.
Jader Dias,

4
Jeśli pamiętasz odniesienie, udostępnij je.
Gilles

2

Myślę, że „Gilles” wspomniał już o tym, że chociaż możesz mieć więcej niż wystarczającą ilość pamięci RAM, zamiana może być przydatna podczas pewnych „niedociągnięć”, a także w ciągłym zapisywaniu niektórych danych nawet po wyłączeniu - czy mam rację, zakładając, że? ponieważ pamięć RAM jest usuwana po ponownym uruchomieniu) Mam 12 GB pamięci RAM w moim systemie i ja też wcześniej zastanawiałem się nad tym pytaniem. W pewnym momencie, kiedy wyłączyłem wszystkie wymiany i polegałem tylko na mojej pamięci RAM, miałem boleśnie trudne doświadczenia, próbując debugować jakiś błąd systemu, awarię itp. Po zamknięciu systemu. Od tego czasu ponownie włączyłem partycję wymiany.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.