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:
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
performance
swap
Stefan
źródło
źródło
Odpowiedzi:
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.
getty
Przypadki, 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.
źródło
To zachowanie można skonfigurować, ustawiając wartość:
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):
Aby trwale zmienić wartość, edytuj plik:
jako root (np.
sudo nano /etc/sysctl.conf
) i zmień lub dodaj (jeśli nie ma) linię:do żądanej wartości. Jeśli ten plik nie istnieje (np. W Arch Linux), spróbuj
/etc/sysctl.d/99-sysctl.conf
zamiast 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 .
źródło
swappiness
wartość 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.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.
źródło
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-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
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ęć.
źródło
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.
źródło
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.
źródło
Z Ubuntu Swap FAQ, z którymi łączył Marcel
Myślę, że powinieneś zwiększyć swoją przestrzeń wymiany w systemie. Zamiana przyspiesza przydzielanie pamięci RAM, umożliwiając odrzucenie już stronicowanych danych.
źródło
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.
źródło