Dlaczego używana jest zamiana, mimo że mam dużo wolnej pamięci RAM?

181

Wydaje mi się, że cała esencja zamiany miała działać jako tymczasowa siatka bezpieczeństwa pamięci RAM, gdy 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?

    
zadawane Mysterio 30.06.2012, 00:16
źródło

6 odpowiedzi

159

Możesz spróbować zmienić wartość "swappiness":

Z Najczęściej zadawanych pytań na temat Ubuntu :

  

Czym jest swoboda i jak mogę to zmienić?

     

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

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

  2.   
  3. swappiness = 0 mówi kernelowi, aby unikał wymiany procesów z pamięci fizycznej tak długo, jak to możliwe

  4.   
  5. swappiness = 100 powoduje, że jądro agresywnie zamienia procesy z pamięci fizycznej i przenosi je do wymiany pamięci podręcznej

  6.   

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

     

Aby sprawdzić wartość swapu

     

cat /proc/sys/vm/swappiness

     

Aby zmienić wartość swapu tymczasową zmianę (utracono przy ponownym uruchomieniu) z wartością swapu wynoszącą 10 można dokonać za pomocą

     

sudo sysctl vm.swappiness=10

     

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

     

gksudo gedit /etc/sysctl.conf

     

Wyszukaj vm.swappiness i zmień jego wartość według potrzeb. 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 również sprawdzić: link

    
odpowiedział jpetersen 30.06.2012, 01:10
źródło
83

Jest kilka różnych aspektów twojego pytania.

Po pierwsze, jaka jest twoja definicja "darmowy". W rzeczywistości nie jest tak proste, jak brzmi w Linuksie (lub innym nowoczesnym systemie operacyjnym).

Jak Linux korzysta z pamięci RAM (bardzo uproszczony)

Każda aplikacja może korzystać z części pamięci. Linux używa wszystkich niezajętej pamięci (z wyjątkiem ostatnich kilku Mb) jako "pamięci podręcznej". Obejmuje to pamięć podręczną strony, bufory i-węzły itd. Jest to dobra rzecz - pomaga przyspieszyć pracę. Zarówno zapis na dysku, jak i odczyt z dysku można bardzo szybko przyspieszyć dzięki pamięci podręcznej.

Najlepiej, jeśli masz wystarczająco dużo pamięci dla wszystkich aplikacji, a wciąż masz kilkaset MB pamięci podręcznej. W tej sytuacji, dopóki twoje aplikacje nie zwiększają wykorzystania pamięci i system nie stara się uzyskać wystarczającej ilości miejsca na pamięć podręczną, nie ma potrzeby wymiany.

Gdy aplikacje pobierają więcej pamięci RAM, po prostu wpada w część przestrzeni używanej przez pamięć podręczną, zmniejszając pamięć podręczną. De-alokowanie pamięci podręcznej jest tanie i łatwe do wykonania, ponieważ jest po prostu wykonywane w czasie rzeczywistym - wszystko, co znajduje się w pamięci podręcznej, jest albo drugą kopią czegoś, co jest już na dysku, może być po prostu zwolnione natychmiastowo, albo jest czymś, co chcielibyśmy musiały opróżnić się na dysku w ciągu najbliższych kilku sekund i tak .

To nie jest sytuacja specyficzna dla Linuksa - wszystkie nowoczesne systemy operacyjne działają w ten sposób. Różne systemy operacyjne mogą po prostu zgłosić inną pamięć RAM w inny sposób: niektóre zawierają pamięć podręczną jako część tego, co uważają za "darmowe", a niektóre mogą nie.

Kiedy mówisz o darmowej pamięci RAM, o wiele bardziej znaczące jest uwzględnianie pamięci podręcznej, ponieważ jest ona praktycznie darmowa - jest dostępna, jeśli jakaś aplikacja tego zażąda. W systemie Linux komenda free zgłasza to w obie strony - pierwsza linia zawiera pamięć podręczną w używanej kolumnie pamięci RAM, a druga linia zawiera pamięć podręczną (i bufory) w bezpłatnej kolumnie.

Jak Linux używa swapu (jeszcze bardziej uproszczonego)

Gdy już zużyjesz wystarczającą ilość pamięci, że nie ma wystarczającej ilości pamięci dla sprawnego działania pamięci podręcznej, Linux może podjąć decyzję o ponownym przydzieleniu niewykorzystanej pamięci aplikacji z pamięci RAM do wymiany.

Nie robi tego według określonego odcięcia. To nie jest tak, że osiągasz pewien procent alokacji, a wtedy Linux zaczyna się zamieniać. Ma raczej "rozmyte" algorytmy. Trzeba wziąć pod uwagę wiele rzeczy, które najlepiej można opisać słowami "jak duży jest nacisk na alokację pamięci". Jeśli istnieje dużo "nacisku", aby przydzielić nową pamięć, zwiększy to szanse, że niektóre zostaną zamienione, aby uzyskać więcej miejsca. Jeśli jest mniej "ciśnienia", to zmniejszy to szansę.

Twój system ma ustawienie "swappiness", które pomaga ci wyregulować, jak oblicza się "ciśnienie". Zazwyczaj nie zaleca się zmiany tego w ogóle, a ja nie poleciłbym go zmienić. Zamiana jest ogólnie rzeczą bardzo dobrą - chociaż istnieje kilka skrajnych przypadków, w których szkodzi wydajności, jeśli spojrzysz na ogólną wydajność systemu, jest to korzyść netto dla szerokiego zakresu zadań. Jeśli zmniejszysz swap, zwolnisz ilość pamięci podręcznej odrobinę więcej niż byłoby to możliwe, nawet jeśli może się przydać. Niezależnie od tego, czy jest to wystarczający kompromis dla jakiegokolwiek problemu związanego z wymianą, zależy od Ciebie. Powinieneś po prostu wiedzieć, co robisz, to wszystko.

Istnieje dobrze znana sytuacja, w której zamiana naprawdę szkodzi postrzeganej wydajności w systemie stacjonarnym, a to w tym, jak szybko aplikacje mogą reagować na dane wprowadzone przez użytkownika po długim okresie bezczynności i dużej liczbie procesów w tle w IO ( takie jak tworzenie kopii zapasowej z dnia na dzień). Jest to bardzo widoczne spowolnienie, ale nie wystarczające, aby uzasadnić wyłączenie wymiany wszystkich razem i bardzo trudne do uniknięcia w każdym systemie operacyjnym. Wyłącz swap i tę początkową powolność po tym, jak skanowanie kopii zapasowej / antywirusa może się nie zdarzyć, ale system może działać wolniej przez cały dzień. To nie jest sytuacja ograniczona do Linuksa.

Przy wyborze tego, co ma być zamienione na dysk, system próbuje wybrać pamięć, która nie jest faktycznie używana - odczytać lub zapisać. Ma dość prosty algorytm do obliczania tego, który wybiera się 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ść na typową dystrybucję Linuksa), bardzo rzadko zdarzy się sytuacja, w której w ogóle będzie potrzebna zamiana. Możesz nawet spróbować wyłączyć zamianę. Nigdy tego nie zalecam, ale tylko dlatego, że nigdy nie wiesz, kiedy więcej pamięci RAM może Cię uratować przed awarią aplikacji. Ale jeśli wiesz, że nie będziesz tego potrzebować, możesz to zrobić.

Ale jak zmienić szybkość mojego systemu? Nie zamienia wolniejszych rzeczy?

Czynność przenoszenia danych z pamięci RAM na swap jest powolną operacją, ale jest podejmowana tylko wtedy, gdy jądro ma pewność, że ogólna korzyść przeważy nad tym. Na przykład, jeśli pamięć aplikacji wzrósł do tego stopnia, że ​​prawie nie ma już pamięci podręcznej, a twoje operacje wejścia / wyjścia są bardzo nieefektywne z tego powodu, można uzyskać znacznie większą prędkość z systemu, uwalniając trochę pamięci, nawet po początkowym wydatku na wymianę danych w celu ich zwolnienia.

To także ostatnia deska ratunku, gdyby twoje aplikacje faktycznie zażądały pamięci więcej , niż faktycznie masz. W takim przypadku zamiana jest konieczna, aby zapobiec sytuacji braku pamięci, co często prowadzi do awarii aplikacji lub konieczności jej zabicia.

Zamiana jest tylko powiązana z czasami, w których twój system osiąga słabe wyniki, ponieważ zdarza się, gdy kończy ci się pamięć RAM, która spowalnia system (lub czyni go niestabilnym), nawet jeśli nie masz zamiany. Aby uprościć rzeczy, zamienianie się dzieje , ponieważ system staje się coraz bardziej zagubiony, a nie odwrotnie.

Gdy dane są zamieniane, kiedy są ponownie wyświetlane?

Przesyłanie danych z wymiany jest (przynajmniej w przypadku tradycyjnych dysków twardych) równie czasochłonne, jak umieszczanie ich w tym miejscu. Zrozumiałe jest, że jądro będzie równie niechętne do usuwania danych z zamiany, zwłaszcza jeśli nie jest używane (czytane lub pisane). Jeśli masz dane w swapie i nie jest on używany, to naprawdę dobrze, że pozostaje w swapie, ponieważ pozostawia więcej pamięci na inne rzeczy, które używane, potencjalnie przyspieszając twój system.

    
odpowiedział thomasrutter 04.07.2012, 05:50
źródło
21

Ustawienie wartości swappiness nie działa w każdej sytuacji. Jeśli to działa dla ciebie, świetnie. Jeśli nie, napisałem skrypt, aby okresowo usuwał zamianę poprzez jego wyłączenie i ponowne włączenie.

Przełączanie wymiany jest nieco ryzykowne, jeśli nie jesteś ostrożny. Jeśli nie masz wystarczającej ilości wolnej pamięci RAM do przechowywania wszystkiego w RAM plus wszystkiego w zamian, próba wyłączenia wymiany spowoduje, że system przestanie odpowiadać. Mój skrypt sprawdza najpierw, czy jest wystarczająco dużo wolnej pamięci RAM (co zajmuje trochę czasu, ponieważ faktyczna ilość wolnej pamięci RAM różni się od tego, co free zgłasza jako wolną), a następnie przełącza tylko zamianę, jeśli tak. Ale jeśli masz mało pamięci RAM, nie uruchamiaj kolejnego ważnego procesu podczas działania skryptu. Oto ona:

#!/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 }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"

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 pozostawi systemu niereagującego; jeśli masz za mało pamięci RAM, odmówi ona przełączenia swap. Użyłem tego skryptu bez problemów od blisko pięciu lat.

    
odpowiedział Scott Severance 04.07.2012, 04:38
źródło
4

Zasadniczo swap pozostaje nieużywany w systemach teraz-dni. Z mojego doświadczenia wynika, że ​​procesy, które są uruchomione przez długi czas bez intensywnych operacji, są przesuwane do linuksa.
To sprawia, że ​​kilka programów, których dotyczy problem, działa wolno.
Jeśli masz dużo wolnej pamięci RAM, możesz zamienić zamianę, wykonując polecenie:
swapoff -av (będziesz potrzebować% prawa sudo ).
Jeśli nie podoba ci się zamiana, możesz ją włączyć, używając polecenia symetrycznego:
swapon -av (ponownie wymagany sudo ).

    
odpowiedział drake01 30.06.2012, 00:24
źródło
3

Po zastosowaniu zamiany w programie program ma tendencję do pozostawania w formie mapy przez cały okres istnienia programu. Wiele programów ma kod (i dane), które są rzadko używane. Po wymianie pamięci jest mało prawdopodobne, aby została ona zamieniona.

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

Oprócz normalnych rzeczy w pamięci, tempfs używa przestrzeni wymiany i wymienia się jak reszta pamięci. Jeśli uruchomisz coś, co wymaga dużej ilości dysku tymczasowego, może wymusić zamianę stron. Raz utworzone pliki tymczasowe nie mogą być używane po kilku minutach i są dobrymi kandydatami do przeniesienia na urządzenie wymiany.

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

    
odpowiedział BillThor 30.06.2012, 06:02
źródło
2

Edytowałem skrypt Scotta Severance , aby dopasować nowsze wersje wersji darmowej, które zawierają już całe dostępne pole pamięci.

#!/bin/bash

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

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
    
odpowiedział derberlinersmurf 03.10.2017, 15:37
źródło

Przeczytaj inne pytania na temat tagów