Dlaczego używa się wymiany, mimo że mam dużo wolnej pamięci RAM?

208

Myślałem, że cała esencja wymiany miała działać jako tymczasowa siatka bezpieczeństwa przechowywania, gdy pamięć RAM była pełna, ale moja partycja wymiany jest ciągle używana, mimo że czasami mam aż 3 GB wolnej pamięci RAM. Czy to normalne?

Mysterio
źródło
3
Proszę podzielić się treści lub wyjście z następujących komend / plików, aby lepiej pomóc nam rozwiązać problem ( Instrukcje w tym odpowiedzi ) : free -m,top -b 1
owski
Jutro zaktualizuje pytanie o pastebiny tych poleceń. Teraz jest 12 rano :(
Mysterio,
Powinienem edytować tytuł, aby dodać „... ale jestem zbyt śpiący, żeby się tym przejmować, więc wy też zdrzemnijcie się”: P
ish

Odpowiedzi:

188

Możesz spróbować zmienić wartość „swapiness”:

Z FAQ wymiany Ubuntu :

Co to jest zamiana i jak ją zmienić?

Parametr swappiness kontroluje tendencję jądra do przenoszenia procesów z pamięci fizycznej na dysk wymiany. Ponieważ dyski są znacznie wolniejsze niż pamięć RAM, może to prowadzić do dłuższych czasów reakcji systemu i aplikacji, jeśli procesy zostaną zbyt agresywnie usunięte z pamięci.

  1. swappiness może mieć wartość od 0 do 100

  2. swappiness = 0 informuje jądro, aby unikało zamiany procesów poza pamięć fizyczną tak długo, jak to możliwe. W przypadku jądra w wersji 3.5 i nowszej wyłącza zamianę.

  3. swappiness = 100 informuje jądro, aby agresywnie zamieniało procesy poza pamięć fizyczną i przenosi je do zamiany pamięci podręcznej

Domyślne ustawienie w Ubuntu to swappiness = 60. Zmniejszenie domyślnej wartości swapiness prawdopodobnie poprawi ogólną wydajność typowej instalacji pulpitu Ubuntu. Zalecana jest wartość swapiness = 10, ale możesz eksperymentować. Uwaga: instalacje serwerów Ubuntu mają inne wymagania wydajnościowe niż systemy komputerowe, a domyślna wartość 60 jest prawdopodobnie bardziej odpowiednia.

Aby sprawdzić wartość swapiness

cat /proc/sys/vm/swappiness

Aby zmienić wartość swapiness Tymczasową zmianę (utraconą przy ponownym uruchomieniu) o wartości swapiness 10 można dokonać za pomocą

sudo sysctl vm.swappiness=10

Aby zmienić na stałe , edytuj plik konfiguracyjny za pomocą swojego ulubionego edytora:

gksudo gedit /etc/sysctl.conf

Wyszukaj vm.swappiness i zmień jego wartość zgodnie z potrzebami. Jeśli vm.swappiness nie istnieje, dodaj go na końcu pliku w następujący sposób:

vm.swappiness=10

Zapisz plik i uruchom ponownie.

Możesz także sprawdzić: https://askubuntu.com/a/103916/54187

jpetersen
źródło
1
Bezczynne spekulacje: może to być rzeczywiście korzystne dla wydajności - strony, które nie były otwierane od jakiegoś czasu, można skopiować do przestrzeni wymiany, co pozwala systemowi operacyjnemu na eksmisję ich szybko, jeśli kiedykolwiek potrzebuje pamięci, ale zawartość strony pozostaje w pamięci .
Simon Richter
7
@ SimonRichter Tak, to jest pomysł. Swappiness 60 jest prawdopodobnie zbyt agresywny w nowoczesnych systemach, ponieważ oznacza to, że zaczynasz wymieniać się, gdy wciąż masz kilka koncertów wolnej pamięci.
Brendan Long
1
Uruchom sudo sysctl --load=/etc/sysctl.confpo edycji pliku, aby zastosować zmiany
deFreitas
92

Pytanie ma kilka różnych aspektów.

Po pierwsze, jaka jest twoja definicja „wolnego”. W rzeczywistości nie jest tak prosty, jak się wydaje w Linuksie (lub w dowolnym nowoczesnym systemie operacyjnym).

Jak Linux używa pamięci RAM (bardzo uproszczone)

Każda aplikacja może zużywać trochę pamięci. Linux używa całej innej niezajętej pamięci (z wyjątkiem ostatnich kilku Mb) jako „pamięci podręcznej”. Obejmuje to pamięć podręczną strony, pamięć podręczną i-węzłów itp. To dobra rzecz - pomaga przyspieszyć składowanie. Zarówno zapis na dysk, jak i odczyt z dysku mogą zostać znacznie przyspieszone przez pamięć podręczną.

Idealnie, masz wystarczającą ilość pamięci dla wszystkich swoich aplikacji i wciąż masz kilkaset Mb pamięci podręcznej. W tej sytuacji, o ile aplikacje nie zwiększają wykorzystania pamięci, a system nie stara się uzyskać wystarczającej ilości miejsca na pamięć podręczną, nie ma potrzeby wymiany.

Gdy aplikacje zajmą więcej pamięci RAM, po prostu trafiają do miejsca zajmowanego przez pamięć podręczną, zmniejszając pamięć podręczną. Cofnięcie alokacji pamięci podręcznej jest tanie i na tyle łatwe, że odbywa się to po prostu w czasie rzeczywistym - wszystko, co znajduje się w pamięci podręcznej, jest albo tylko drugą kopią czegoś, co już znajduje się na dysku, więc można ją natychmiast zwolnić lub jest to coś, co chcielibyśmy musieli wylewać na dysku w ciągu kilku sekund i tak .

Nie jest to sytuacja specyficzna dla Linuksa - wszystkie nowoczesne systemy operacyjne działają w ten sposób. Różne systemy operacyjne mogą po prostu inaczej zgłaszać wolną pamięć RAM: niektóre zawierają pamięć podręczną jako część tego, co uważają za „wolne”, a niektóre nie.

Kiedy mówimy o wolnej pamięci RAM, bardziej sensowne jest uwzględnienie pamięci podręcznej, ponieważ jest ona praktycznie bezpłatna - jest dostępna na żądanie dowolnej aplikacji. W systemie Linux freepolecenie to zgłasza na dwa sposoby - pierwszy wiersz zawiera pamięć podręczną w kolumnie używanej pamięci RAM, a drugi wiersz zawiera pamięć podręczną (i bufory) w wolnej kolumnie.

Jak Linux wykorzystuje swap (jeszcze bardziej uproszczony)

Po zużyciu wystarczającej ilości pamięci, aby zabrakło wystarczającej ilości na płynnie działającą pamięć podręczną, Linux może zdecydować o ponownym przydzieleniu nieużywanej pamięci aplikacji z pamięci RAM do zamiany.

Nie robi tego zgodnie z określonym punktem odcięcia. To nie tak, że osiągniesz pewien procent alokacji, wtedy Linux zacznie się zamieniać. Ma raczej „niewyraźny” algorytm. 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”. Zwykle w ogóle nie jest to zalecane, a ja nie polecam ci tego zmieniać. Zamiana jest ogólnie bardzo dobrą rzeczą - choć istnieje kilka skrajnych przypadków, w których obniża wydajność, jeśli spojrzysz na ogólną wydajność systemu, jest to korzyść netto dla szerokiego zakresu zadań. Jeśli zmniejszysz swapiness, pozwolisz, aby ilość pamięci podręcznej zmniejszyła się nieco bardziej niż w innym przypadku, nawet jeśli może być naprawdę przydatna. To, czy jest to wystarczająco dobry kompromis, niezależnie od tego, jaki masz problem z zamianą, zależy od Ciebie. Powinieneś po prostu wiedzieć, co robisz, to wszystko.

Znana jest sytuacja, w której zamiana naprawdę szkodzi postrzeganej wydajności w systemie stacjonarnym, i to w tym, jak szybko aplikacje mogą ponownie reagować na dane wejściowe użytkownika po długim pozostawieniu bezczynności i obciążeniu procesów tła w IO (takich jak backup nocny) uruchom. Jest to bardzo widoczna powolność, ale niewystarczająca, aby uzasadnić wyłączenie wymiany i bardzo trudna do uniknięcia w żadnym systemie operacyjnym. Wyłącz swap i ta początkowa powolność po utworzeniu kopii zapasowej / skanowania w poszukiwaniu wirusów może się nie zdarzyć, ale system może działać trochę wolniej przez cały dzień. Nie jest to również sytuacja ograniczona do Linuksa.

Wybierając, co ma zostać zamienione na dysk, system próbuje wybrać pamięć, która nie jest faktycznie używana - odczytywana lub zapisywana z. Ma dość prosty algorytm do obliczania tego, który wybiera dobrze przez większość czasu.

Jeśli masz system, w którym masz ogromną ilość pamięci RAM (w momencie pisania, 8 GB to ogromna ilość jak na typową dystrybucję Linuksa), wtedy bardzo rzadko zdarza się sytuacja, w której zamiana jest w ogóle potrzebna. Możesz nawet spróbować wyłączyć swap. Nigdy tego nie zalecam, ale tylko dlatego, że nigdy nie wiadomo, kiedy więcej pamięci RAM może uchronić Cię przed awarią niektórych aplikacji. Ale jeśli wiesz, że nie będziesz go potrzebować, możesz to zrobić.

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ść przeważy to. Na przykład, jeśli pamięć aplikacji wzrosła do tego stopnia, że ​​prawie nie masz już pamięci podręcznej, a Twoje operacje we / wy są bardzo nieefektywne z tego powodu, możesz faktycznie uzyskać znacznie większą szybkość z systemu, zwalniając część pamięci, nawet po początkowym koszcie zamiany danych w celu ich uwolnienia.

Jest to również ostatnia deska ratunku, jeśli Twoje aplikacje rzeczywiście wymagają więcej pamięci niż faktycznie masz. W takim przypadku zamiana jest konieczna, aby zapobiec sytuacji braku pamięci, która często powoduje awarię aplikacji lub konieczność przymusowego zabicia.

Zamiana jest powiązana tylko z czasami, w których system działa słabo, ponieważ dzieje się tak w momentach, w których kończy się użyteczna pamięć RAM, co spowalnia system (lub czyni go niestabilnym), nawet jeśli nie masz zamiany. Tak więc, aby uprościć rzeczy, zamiana następuje, ponieważ system jest zapchany, a nie na odwrót.

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

Przenoszenie danych z wymiany jest (przynajmniej w przypadku tradycyjnych dysków twardych) tak samo czasochłonne, jak ich umieszczenie. Zrozumiałe jest, że twoje jądro będzie tak samo niechętne usuwaniu danych z wymiany, szczególnie jeśli nie jest ono faktycznie używane (tj. Odczytywane lub zapisywane). Jeśli masz dane w swapie i nie są one używane, to dobrze, że pozostaje w swapie, ponieważ pozostawia więcej pamięci na inne rzeczy, które używane, potencjalnie przyspieszając system.

thomasrutter
źródło
5
+1 za szczegółowe wyjaśnienie. Lubię też utrzymywać wymianę 2GiB na moich komputerach. Jeśli coś pójdzie nie tak - wycieki pamięci itp., Możesz zobaczyć zamianę w górę i poszukać problemu, zanim pojawi się brak pamięci. To siatka bezpieczeństwa, a także narzędzie wydajności.
Joe
1
Na moim netbooku, który ma tylko 2 GB pamięci RAM, mam 4 GB wymiany. Wynika to z faktu, że używam netbooka do celów, do których był przeznaczony, a moje programy często wymagają więcej niż 2 GB pamięci. Ponieważ Linux zachowuje się bardzo słabo w sytuacjach braku pamięci, wolę mieć dużą siatkę bezpieczeństwa. I mam dużo miejsca na dysku.
Scott Severance,
Jeśli twoje programy często wymagają więcej niż 2 GB pamięci, rozważę umieszczenie tam większej ilości pamięci RAM (to bardzo tanie!), Ponieważ wyczerpanie pamięci RAM może pogorszyć wydajność. Z korzyścią dla innych czytelników: spraw, abyś nie patrzył tylko na pamięć podręczną, która ma zajmować dostępną pamięć RAM - zobacz inne odniesienia free -m.
thomasrutter
2
@neon_overload: Należy zauważyć, że według HP maksymalna pamięć RAM mojego netbooka wynosi 1 GB. Mam teraz 2 GB, a źródła internetowe sugerują, że 2 GB to rzeczywiste maksimum. Zatem potrzeba tego rodzaju obejść.
Scott Severance,
@thomasrutter: Jak zmienia się twoja odpowiedź dla dużych serwerów, jeden z moich ma 1 TB (tak, jeden pełny terabajt) pamięci RAM, a mimo to wciąż używa swap; jakie ustawienie wymiany i jaki rozmiar partycji wymiany poleciłbyś?
chrisinmtown
24

Ustawienie wartości swapiness nie działa w każdej sytuacji. Jeśli to działa, świetnie. Jeśli nie, napisałem skrypt, aby okresowo wyczyścić swap, wyłączając go i włączając ponownie.

Przełączanie zamiany jest trochę ryzykowne, jeśli nie jesteś ostrożny. Jeśli nie masz wystarczającej ilości wolnej pamięci RAM, aby pomieścić wszystko w pamięci RAM i wszystko w zamianie, próba wyłączenia wymiany spowoduje, że system przestanie odpowiadać. Mój skrypt najpierw sprawdza, czy jest wystarczająca ilość wolnej pamięci RAM (co zajmuje trochę czasu, ponieważ rzeczywista ilość wolnej pamięci RAM różni się od tego, co freezgłasza jako wolna), a następnie przełącza tylko, jeśli tak jest. Ale jeśli brakuje Ci pamięci RAM, nie uruchamiaj kolejnego ważnego procesu podczas działania skryptu. Oto on:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Musisz uruchomić ten skrypt jako root (np. Z sudo). Ten skrypt nie pozostawia systemu bez odpowiedzi; jeśli masz niewystarczającą ilość pamięci RAM, odmówi to zamiany. Używam tego skryptu bez problemów od prawie pięciu lat.

Scott Severance
źródło
+1 za skrypt. Możesz go trochę zmodernizować, zmieniając MB na MiB w wyjściach. Napisałem podobny skrypt bez wszystkich (dobrych) testów bezpieczeństwa, które uwzględnisz. Na moim starym zeszycie, gdzie intensywnie używano wymiany, uruchomienie zajęłoby chwilę - minutę lub dwie, ale nic nie zraniło. Raz na jakiś czas zawiedzie, ponieważ nie ma wystarczającej ilości wolnej pamięci do uruchomienia, ale nie spowodowało to żadnych dodatkowych problemów. Musiałem zrestartować się, aby wyczyścić wszystko, kiedy to się stało. Miało to związek z czymś, co wyglądało na wyciek pamięci w Transmission (od czasu naprawienia, jak sądzę) i mając tylko RAM 2GiB.
Joe
6
Jeśli coś zostało przeniesione do zamiany i pozostaje w zamianie, zwykle jest to dobra rzecz - oznacza to, że dane w rzeczywistości nie są używane i zwalnia część pamięci RAM na inne rzeczy, co może potencjalnie zwiększyć prędkość. Co skłoniło cię do przekonania, że ​​te dane nie powinny być wymieniane i zamiast tego powinny zajmować więcej cennej pamięci RAM? Zwykle jądro dość dobrze zna się na tym, co jest nieużywane i które może bezpiecznie pozostać w trybie wymiany, aby zwolnić pamięć RAM.
thomasrutter,
@neon: Pamiętaj, że moje komputery mają odpowiednio 2 GB i 3 GB pamięci RAM, co jest obecnie dość mało. Dowody są w wykonaniu. Na przykład przywoływanie menu lub przełączanie programów może być powolne z powodu zamiany, podobnie jak efekty wizualne Compos. Ta powolność jest leczona przez przełączanie zamiany, co pokazuje, że przynajmniej w niektórych sytuacjach algorytmy optymalizacji jądra są nieoptymalne. Nie mogę się kłócić z wielokrotnym doświadczeniem.
Scott Severance,
Uff !! To tylko przyspieszyło do 0% zamiany ... Nie miałem dużo czasu, aby przyjrzeć się temu kompletnemu pytaniu i jego odpowiedzi, ale wolałem go przeczytać, gdy mam trochę wolnego czasu.
AzkerM
Dlaczego po prostu nie ustawisz swapiness na niską wartość? Wydaje się, że robi to to samo co skrypt, ale w znacznie bardziej kontrolowany sposób.
jhfrontz
4

Ogólnie rzecz biorąc, swap pozostaje nieużywany w systemach obecnie. Z mojego doświadczenia wynika, że ​​procesy, które działają przez długi czas bez intensywnych operacji, są przenoszone do systemu Linux.
Powoduje to, że kilka programów, których dotyczy problem, działa wolno.
Jeśli masz dużo wolnej pamięci RAM, możesz wyłączyć zamianę, uruchamiając polecenie:
swapoff -av(będziesz potrzebować sudodo tego uprawnień.)
Jeśli nie podoba ci się zamiana, możesz ją włączyć, używając polecenia symetrycznego:
swapon -av( ponownie sudowymagane).

drake01
źródło
12
Turning off zamianę całości jest przesadą, ponieważ swapiness = 0 robi to samo, ale bezpieczniejsze (jeśli zrobić skończyć się zbyt wiele rzeczy w pamięci, to rzucić coś w swapu).
Brendan Long
@BrendanLong Fair point .. Dzięki za nauczenie mnie. :)
drake01
3

Po zmianie programu na program pozostaje on zmapowany przez cały czas jego trwania. Wiele programów ma kod (i dane), który jest rzadko używany. Po wymianie pamięci jest mało prawdopodobne, aby została zamieniona.

Jednym ze sposobów wymuszenia tych stron w pamięci jest wyłączenie urządzenia wymiany. Jeśli masz dwa, możesz wyłączyć jeden, włączyć go ponownie, a następnie wyłączyć drugi. Jeśli naprawdę potrzebna jest zamiana, będzie się ona przemieszczać między urządzeniami. Możesz po prostu wyłączyć urządzenie wymiany (lub plik), ale jeśli naprawdę potrzebujesz wymiany przestrzeni, mogą się zdarzyć drastyczne rzeczy.

Oprócz normalnych rzeczy w pamięci, tempfs używa przestrzeni wymiany i zamieni się jak reszta pamięci. Jeśli uruchomisz coś, co wymaga dużo dysku tymczasowego, może to wymusić zamianę stron. Raz utworzonych plików tymczasowych nie można już używać po kilku minutach i są dobrymi kandydatami do przeniesienia na urządzenie wymiany.

W skrócie możesz użyć pliku jako urządzenia wymiany. Jest to przydatne, jeśli potrzebujesz tymczasowo dodatkowej przestrzeni wymiany.

BillThor
źródło
2

Zredagowałem skrypt Scotta Severance'a, aby pasował do nowszych wersji darmowych, które już zawierają całkowite dostępne pole pamięci.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
derberlinersmurf
źródło