Zwalnianie przestrzeni wymiany

10

Czasem wydaje się, że jądro chce utrzymywać np. Firefox w wymianie, mimo że dostępna jest wystarczająca ilość pamięci fizycznej i używam firefox:

robert@rm:~> free -m
             total       used       free     shared    buffers     cached
Mem:          3009       1904       1104          0        109        679
-/+ buffers/cache:       1116       1892
Swap:         4102        885       3216

Czy istnieje polecenie instruujące jądro, aby porzuciło przestrzeń wymiany i wykorzystało dostępną wolną pamięć?


Aktualizacja : chociaż w krótkim okresie użyłem swapon / swapoff, teraz ustawiłem

sudo sysctl vm.swappiness=30

jak zasugerowano w innej odpowiedzi i uzyskaj bardzo dobre wyniki.

Robert Munteanu
źródło

Odpowiedzi:

2

Możesz zrobićswapoff - będziesz potrzebować uprawnień roota,
ale myślę, że nie jest to dla ciebie problemem.

nik
źródło
15

Możesz zrobić to, co sugerował Nik i użyć swapoff . Istnieje jednak inny, bardziej elegancki sposób na podkręcenie „zamiany” lub na to, jak agresywnie jądro zamienia programy na dysk w systemach z jądrem 2.6.

Na listach dyskusyjnych jądra Linuksa toczyły się gorące debaty na temat polityki, którą jądro powinno stosować w odniesieniu do zachowania wymiany . Rezultatem jest to, że mamy teraz łatkę w jądrach 2.6, która pozwala nam w znacznym stopniu dostosować to zachowanie.

Zauważ, że potrzebujesz do tego uprawnień roota, tak jak chcesz uruchamiać komendy swapoff / swapon.

Bieżącą wartość „swapiness” można sprawdzić w pliku / proc / sys / vm / swappiness lub uruchamiając następujące polecenie sysctl :

sudo sysctl vm.swappiness

Wartości „swapiness” mogą mieścić się w zakresie od 0 (bez zamiany) do 100 (w miarę możliwości zamień na dysk ). Ubuntu jest dostarczane z domyślną zamianą na 60.

Aby to zmienić dla sesji, ponownie wywołaj sysctl i przekaż mu wartość swapiness do użycia:

sudo sysctl vm.swappiness=30

Poza darmo , można oczywiście monitorowanie skutków robi to poprzez doskonałej htop lub iotop użyteczności publicznej.

Jeśli podoba Ci się to, co widzisz, i chcesz zachować tę wartość podczas ponownego uruchamiania, po prostu umieść „vm.swappiness = 30” w pliku /etc/sysctl.conf .

$ sudo sysctl vm.swappiness
vm.swappiness = 30
$ sudo sysctl vm.swappiness=40
vm.swappiness = 40
$ sudo sysctl vm.swappiness
vm.swappiness = 40
$ sudo tail /etc/sysctl.conf 
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#
# The contents of /proc/<pid>/maps and smaps files are only visible to 
# readers that are allowed to ptrace() the process
# kernel.maps_protect = 1
vm.swappiness=30

Możesz grać z różnymi wartościami, dopóki nie znajdziesz takiej, która pociąga za sobą akceptowalny poziom wymiany na twoim komputerze.


źródło
+1 dla sysctl. Podczas eksperymentowania z różnymi wartościami swapiness możesz pisać bezpośrednio do pliku proc (echo „30”> / proc / sys / vm / swappiness). Te zmiany są tymczasowe i nie zostaną zapisane w pliku /etc/sysctl.conf. Gdy będziesz zadowolony z ustawień, użyj sysctl, aby dokonać „trwałej” zmiany.
Shawn Chin,
6

Pamiętaj, że rzeczy w zamianie zostały tam umieszczone w bardziej zajętym czasie niż teraz.

Może się okazać, że dane znajdują się również w pamięci RAM - zostały ponownie załadowane do użycia, ale nie zostały usunięte z wymiany. Jądro robi to, aby zaoszczędzić czas w następnym zajętym okresie - jeśli dane są już tam skopiowane, może po prostu zwolnić pamięć RAM, której używa, zamiast najpierw zapisywać na dysku. Więc jeśli nie wiesz, że maszyna nie będzie musiała ponownie zamieniać się w najbliższej przyszłości, wymuszenie zwolnienia przestrzeni wymiany może nic nie osiągnąć, oprócz spowolnienia rzeczy następnym razem, gdy konieczna będzie zamiana.

Jest to zarządzane na zasadzie usuwania po zapisaniu, więc jeśli kopia w pamięci RAM zostanie zaktualizowana, bloki w swap zostaną zwolnione.

Jeśli przestrzeń wymiany jest potrzebna na coś innego, czego nie będzie w tej chwili, ponieważ masz dużo wolnego miejsca, oczywiście zostanie zwolniona do tego celu.

Nie możesz zobaczyć, ile danych znajduje się w tym stanie (zarówno na stronach opartych na dysku w obszarach wymiany, jak i w pamięci RAM) w danych wyjściowych free. Możesz to jednak zobaczyć za pomocą /procspecjalnego systemu plików. Spójrz na wyjściu cat /proc/meminfodo SwapCachedhrabiego.

Kolejne dwa powody, dla których warto stosować swap, gdy najwyraźniej jest wolna pamięć

  • kiedy pod dużym obciążeniem We / Wy jądro zdecydowało, że strony, które nie były używane przez wieki, lepiej są zamieniane, aby można było użyć pamięci RAM do buforowania / buforów, chociaż patrząc na freedane wyjściowe, które prawdopodobnie nie są tutaj tak jak Ty mieć naprawdę nieprzydzieloną pamięć RAM oraz pamięć podręczną / bufory IO.
  • strony zostały zamienione z jakiegoś powodu wcześniej i po prostu nie były już potrzebne - być może jest to pamięć używana przez proces, który był nieaktywny przez pewien czas. W takim przypadku zwolnienie wymiany (więc ponowne załadowanie stron z powrotem do pamięci RAM) może poprawić czas odpowiedzi tego procesu następnym razem, gdy będzie trzeba zrobić coś innego niż uśpienie, ale jeśli był on nieaktywny przez pewien czas, może nie być potrzebny w każdym razie w najbliższej przyszłości.
David Spillett
źródło
1
+1 za doskonałe wyjaśnienie. Do Twojej wiadomości, vmstat pozwala zobaczyć / proc / meminfo dane przez nie wszystkie.
1

Pamiętaj, że freeto tylko migawka użycia pamięci. Rezultat, który widzisz, może sugerować, że w pewnym momencie w systemie brakowało pamięci RAM, więc zamieniono materiał rezydujący w pamięci RAM. Od tego czasu pamięć RAM stała się wolna, ale materiał na swapie nie był wymagany, więc nadal jest przechowywany na swapie, a nie tylko zaśmiecający pamięć RAM. W takim przypadku wyłączenie wymiany byłoby złym pomysłem. Czy są jakieś procesy, które mogą wymagać tak dużej ilości pamięci RAM od ostatniego przeładowania?

Ponadto możesz sprawdzić, czy nie masz ograniczenia dotyczącego maksymalnego rozmiaru rezydenta ustawionego za pomocą ulimit (zwykle w / etc / profile, ale może różni się w zależności od dystrybucji i może być ustawiony dla poszczególnych procesów (np. W skrypcie uruchamiania) ).

Wreszcie w systemie Microsoft Windows pojawiają się doniesienia o konkretnych problemach z wymianą Firefoksa na dysk, np. Po zminimalizowaniu (np http://joeabiraad.com/mozilla-firefox/control-your-firefox-ram-usage/113 ). Nie słyszałem o tym w systemach GNU / Linux, ale być może warto je zbadać.

mas
źródło
Dziękuję za odpowiedź. Moim problemem nie jest to, że swap jest używany, ale że jest on teraz używany dla aktywnych programów, np. Firefox i Thunderbird, które wydają się powolne. Swapoff / swapon sprawił, że znów poczuli się niezręcznie.
Robert Munteanu,