Jak opróżnić swap, jeśli jest wolna pamięć RAM?


314

Kiedy otwieram aplikację intensywnie korzystającą z pamięci RAM (VirtualBox ustawiony na 2 GB pamięci RAM), zwykle wykorzystuje się trochę przestrzeni wymiany, w zależności od tego, co jeszcze mam w tym czasie otwarte.

Jednak po wyjściu z tej ostatniej aplikacji 2 GB pamięci RAM zostaje zwolnione, ale pozostaje takie samo wykorzystanie przestrzeni wymiany.

Na przykład teraz, około dwóch godzin po zamknięciu VirtualBox, mam 1,6 GB wolnej pamięci RAM i nadal 770 MB w zamianie.

Jak mogę powiedzieć Ubuntu, aby przestał używać tej wymiany i powrócił do korzystania z pamięci RAM?


Najłatwiejszą rzeczą jest zrestartowanie urządzenia i zaoszczędzenie czasu na radzenie sobie z pamięcią RAM, a wolna pamięć RAM oszczędza energię laptopa i procesora
Mohamed Slama

5
Wielkie założenie, że ponowne wypełnienie wszystkich rzeczy na twoim komputerze zajmuje mniej czasu.
jQwierdy

Ubuntu 16.04 przynajmniej może używać swapów długo po tym, jak było to potrzebne, dzięki czemu system jest wolniejszy o kilka rzędów wielkości, polegając na pliku wymiany, chociaż nie jest to już konieczne. Ręczna interwencja może zatem być przydatna. Ponowne uruchomienie nie zawsze jest opcją.
mat

Odpowiedzi:


167

To, że swap jest alokowany, nie oznacza, że ​​jest „używany”. Podczas gdy programy, takie jak monitor systemu i góra, pokażą część przydzielonej przestrzeni wymiany (w twoim przykładzie 770 MB), nie oznacza to, że system aktywnie zamienia wejścia / wyjścia.

Aby dowiedzieć się, czy cokolwiek zmienia się we / wy, możesz użyć vmstatpolecenia. Pozostaw to na kilka sekund na ustabilizowanie się i obserwuj sikolumny (swapin) i so(swapout). Jeśli nic się nie dzieje, nie ma powodu do obaw.

Oto wynik działania vmstat 1, w którym widać, że moja maszyna w ogóle się nie zmienia.

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0  78588 230788   9596  72196    0    0     0     0  543  652 12  6 78  0
 0  0  78588 230780   9596  72196    0    0     0     0  531  410  1  0 99  0
 0  0  78588 230796   9596  72196    0    0     0     0  300  335  1  1 97  0
 1  0  78588 230788   9608  72224    0    0    40     0  737  762  4  4 84  8
 5  0  78588 230788   9608  72224    0    0     0     0  415  385  9  3 84  0
 0  0  78588 230540   9616  72224    0    0     0    44  611  556 55  5 31  0
 0  0  78588 230532   9616  72224    0    0     0     0  574  662  1  6 89  0

Ale tutaj topwidzicie, że mam przydzielone miejsce do wymiany: -

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached

32
„Nie ma powodów do niepokoju”, aż do momentu, gdy nadal używam niektórych aplikacji, które zostały wymienione. wtedy rozpęta się piekło.
törzsmókus

207
Ten post nie odpowiada na pytanie.
emchristiansen

18
Przesłanka pytania opiera się na nieporozumieniach. Ten post dotyczy nieporozumień.
popey

30
Nie widzę nieporozumień, widzę spór o to, co oznacza „użyty”. Masz na myśli „użyty” w odniesieniu do aktywnej zamiany in / out, podczas gdy pierwotne pytanie wydaje się zawierać „użytą”, co oznacza, że ​​istnieją dane, które zostały zamienione, które mogą później wymagać wymiany z powrotem. Istnieją uzasadnione powody, aby chcieć opróżnić swap po zdarzeniu, które wymienia wiele innych pamięci, w istocie uprzedzając aktywne zamianę, o której użytkownik wie, że nastąpi później (szczególnie jeśli późniejsze „odwrócenie” może nastąpić podczas gdy dysk jest obciążony z innych powodów).
drfrogsplat

39
Po uruchomieniu aplikacji intensywnie korzystającej z pamięci moje inne aplikacje nie reagują, kiedy się na nie przełączam, prawdopodobnie z powodu zamiany. Lepiej byłoby powiedzieć systemowi, aby odrzucił jak najwięcej danych (po czym nastąpiła przerwa na kawę) niż czekać 20 sekund za każdym razem, gdy I Alt + Tab.
Mark K Cowan

423

Jądro Linuksa leżące u podstaw Ubuntu automatycznie „zamienia” te strony z dysku na pamięć RAM w razie potrzeby, więc ogólnie powiedziałbym, że niech to się stanie naturalnie.

Jeśli jednak naprawdę uważasz, że musisz to wymusić (widzę scenariusz, w którym chciałbyś wiedzieć, że system będzie później reagować), możesz chwilowo wyłączyć i ponownie włączyć zamianę

sudo swapoff -a
sudo swapon -a

LUB alternatywnie jako pojedyncza linia

swapoff -a; swapon -a

Zachowaj ostrożność, ponieważ może to spowodować niestabilność systemu, zwłaszcza jeśli ma już mało pamięci RAM.


8
To załatwiło sprawę, zamiana została skopiowana do pamięci RAM. Chyba po prostu musisz upewnić się, że co najmniej ilość zamiany została użyta jako wolna pamięć RAM przed uruchomieniem zamiany, prawda?
jfoucher,

12
Zamiana nie została skopiowana do pamięci RAM. To było po prostu wyłączone. Zanim to zrobisz, upewnij się, że pole nie zamienia się. Jeśli to zrobisz, jądro zobaczy, że pamięć zniknie, a OOM-Killer prawdopodobnie zacznie zabijać aplikacje arbitralnie. Nie ma powodu, dla którego powinieneś „wyczyścić” taką zamianę. (patrz mój inny komentarz) :)
popey

51
W rzeczywistości zamiana jest w zasadzie kopiowana do pamięci RAM, a dokładniej strony są zamieniane z dysku na pamięć RAM, zanim zamiana może zostać wyłączona.
SpamapS

14
Strony są kopiowane do pamięci RAM tylko wtedy, gdy są nadal potrzebne przez jakiś proces. Czasami zamieniona strona należy do procesu, który już został zakończony, a jądro nie chce natychmiast usuwać tych stron z wymiany.
BrunoJCM,

6
To powinna być poprawna odpowiedź, ponieważ jest to sposób na odzyskanie zamienionych stron z powrotem do pamięci RAM, a następnie opróżnienie pamięci wymiany
Alfonso Jiménez

144

Możesz również ustawić wartość „swapiness” na domyślną 60, w ten sposób swap na początku nie będzie tak duży. Dlaczego domyślna wysyłka jest ustawiona na 60, gdy zalecana wartość to 10, wprawia mnie w zakłopotanie. Z Ubuntu SwapFAQ :

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ć.

Zmieniając tę ​​wartość na 10, a nawet 0, możesz dodać znaczący i zauważalny wzrost prędkości do starszego systemu z wolnym napędem. Ustawienie tej wartości na 0 nie wyłącza zamiany w jądrze Linuksa 3.4 i niższych, ale w wersji 3.5+ robi to, więc będziesz chciał użyć wartości 1, jeśli chcesz utrzymać ją na najniższym ustawieniu *.

Nie widzę powodu, aby nie ustawiać tego na 0, ponieważ wszystko, co trafi na dysk, jest wolniejsze niż pamięć RAM. Mam 8 wirtualnych rdzeni, szybki dysk SSD i 8 GB pamięci, a moja zamiana jest ustawiona na 0. W tej chwili mam uruchomione 3 maszyny wirtualne, moje użycie pamięci wynosi 7,1 z 7,7 GB, moja używana wymiana wynosi tylko 576 KB 952 MB i wszystkie systemy działają płynnie!

Z Ubuntu SwapFAQ :

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
  3. swappiness = 100 informuje jądro, aby agresywnie zamieniało procesy poza pamięć fizyczną i przenosi je do zamiany pamięci podręcznej

Poniżej znajdują się podstawowe instrukcje sprawdzania zamiany, opróżniania zamiany i zmiany zamiany na 0:

Aby sprawdzić wartość swapiness:

cat /proc/sys/vm/swappiness

Aby tymczasowo ustawić swap na 0 ( zgodnie z sugestią SpamapS ):

Spowoduje to opróżnienie wymiany i przeniesienie całej wymiany z powrotem do pamięci. Najpierw upewnij się, że masz wystarczającą ilość pamięci, przeglądając kartę zasobów gnome-system-monitor, wolna pamięć powinna być większa niż wykorzystana zamiana. Ten proces może chwilę potrwać, użyj gnome-system-monitor do monitorowania i weryfikacji postępu.

sudo swapoff --all

Aby ustawić nową wartość na 0:

sudo sysctl vm.swappiness=0 

Aby ponownie włączyć zamianę:

sudo swapon --all

Aby na stałe ustawić swapiness na 0:

  1. sudoedit /etc/sysctl.conf
  2. Dodaj tę linię vm.swappiness = 0
  3. sudo shutdown -r now # zrestartuj system

* W przypadku jądra w wersji 3.5+ ustawienie swapiness na 0 powoduje całkowite wyłączenie, a ustawienie 1 jest zalecane, jeśli chcesz algorytmu najniższej swapiness. źródło: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/


1
Właśnie zaktualizowałem odpowiedź, aby uwzględnić stały sposób na ustawienie swapiness. Nie jestem pewien, jak bardzo to się zagłosowało, domyślam się, że nikt tego nie przetestował.
Elijah Lynn

1
Więcej dobrych lektur na temat swapiness w tej odpowiedzi => askubuntu.com/a/103916/11929
Elijah Lynn

3
Nie jestem pewien, czy było to dostępne, gdy autor pierwotnie opublikował odpowiedź, ale dla instalacji serwera Ubuntu obowiązuje wartość „60”, ponieważ to środowisko ma inny zestaw specyfikacji dotyczących wydajności. help.ubuntu.com/community/…
Frito

1
To ustawienie jest bardzo skuteczne w kontrolowaniu wielkości zamiany. Mój system ma 16G RAM i 16G swap. Czasami biegam do maszyn wirtualnych i niektóre z moich aplikacji zostają zamienione. Po zamknięciu maszyn wirtualnych zużycie pamięci RAM spada, ale użycie wymiany pozostaje takie samo, a mój system opóźnia się podczas zmiany aplikacji. Zmiana zamiany poprawiła dla mnie wydajność.
kapad

1
To naprawdę powinna być zaakceptowana odpowiedź. Dokładne wyjaśnienie problemu i jego rozwiązanie, a także łącza i rozwiązanie pozwalające zachować pamięć Swap, ale przede wszystkim pomagają zachować kontrolę. Niesamowite rzeczy. Dzięki. :)
Jack_Hu

53

Przekonałem się, że zamiana opróżniania może bardzo pomóc w systemach z wolnymi dyskami i ograniczoną pamięcią RAM. Oczywiście, jak już wspomniano, sposobem na to jest uruchomienie sudo swapoff -a; sudo swapon -a. Problem polega na tym, że jeśli nie ma wystarczającej ilości pamięci RAM, spowoduje to różnego rodzaju problemy.

Napisałem skrypt, który nazywam toggle_swap, który działał dla mnie przez ostatnie kilka lat. Sprawdza, czy jest wystarczająca ilość wolnej pamięci RAM, zanim dezaktywuje swap. Oto on:

#!/bin/bash

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)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Wspaniale szukałem czegoś takiego. Może być trochę bezpieczniej, możesz podać liczbę i procenty, a następnie zapytać, aby być absolutnie pewnym.
Atherion

2

Do takiego wniosku doszedłem po przeczytaniu wszystkich wskazówek, tak jakby przed zabiciem wymiany należy się upewnić, że jest wystarczająco dużo pamięci RAM. Dziękuję, cudowny scenariusz. Powinny być domyślnie uwzględnione w Ubuntu (nie żartuj, to naprawdę musthave.)
Shiki

Tyle że jeśli uruchomisz coś nowego podczas wyłączania zamiany, a przed ponownym włączeniem - nie będzie mieć wystarczającej ilości pamięci.
barteks2x

To zależy od ilości wolnej pamięci. Jeśli jest wystarczająca ilość wolnej pamięci, aby pomieścić wszystko w wymianie ORAZ nowy proces, nie ma problemu. Jeśli nie, masz rację.
Scott Severance

25

Po kilku dniach kręcenia się ze swapowaniem doszedłem do wniosku, że jądro powinno być pozostawione własnym urządzeniom. Wie, co robi i jest zoptymalizowany, aby zapewnić najlepsze wrażenia.

Jeśli nie masz naprawdę dobrego powodu, aby chcieć odzyskać ten dysk, zostawiłbym go.


2
Miałem trochę rzeczy do wymiany, vmstat pokazał mi, że miały miejsce zamiana i zamiana, a Chrome był opóźniony, podczas gdy mój procesor był ledwo używany. Dobry powód, nie?
Xerus

Zdecydowanie są przypadki, gdy pewne zamiany na pulpicie powodują, że jest on opóźniony. (nie podczas wymiany, ale także później, gdy jest wystarczająca ilość pamięci RAM, przez długi czas później). Więc w najlepszym razie ta odpowiedź jest tylko subiektywnym doświadczeniem, które zdarza się w niektórych przypadkach.
Cray

-1

Nie ma to wpływu na wydajność, jeśli przestrzeń wymiany jest zajęta. Jedyną karą za wydajność jest to, że rzeczy są wymieniane. Jeśli nic nie jest zamieniane / zamieniane, nie musisz się o nic martwić.


10
Tak, ale jeśli coś jest wymieniane, wpływa to na wydajność, stąd pytanie.
ilościowo

To jest prawdziwy nonsens, zwykle duże zastępcze zamiany występują na dyskach twardych lub ogólnie na wolniejszym urządzeniu niż pamięć RAM - jeśli skończy się miejsce - istniejące elementy zostaną zamienione - np. Przeglądarka internetowa - i wtedy praktycznie używasz go z wolniejszego urządzenia. ..
jave.web
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.