Jak całkowicie wyłączyć swap?


30

Używam sid Debiana, dysku twardego sformatowanego przy pomocy ext4, działającego na systemie Linux 3.1

Pamiętam, że w poprzednich wersjach systemu Linux (może wcześniej niż 3.0) zabrakło mi pamięci, a zamiana nie była włączona, programy zwykle ulegają awarii. Jest to idealne rozwiązanie dla mojego środowiska: proste przeglądanie stron internetowych bez krytycznych operacji. Oznacza to, że jeśli przypadkowo natknę się na kiepską stronę internetową, która zużywa zbyt dużo pamięci, po prostu ulega awarii bez powodowania, że ​​mój terminal jest bezużyteczny.

Ale w mojej obecnej konfiguracji komputer zawiesza się z gwałtowną przepustowością operacji we / wy w tle. iotop ujawnia, że ​​winowajcą jest kswapd0, co oznacza, że ​​jest to spowodowane zamianą. Po użyciu swapon -sdo określenia wszelkich zamian, które zostały włączone, użyłem swapoff -ado wyłączenia wszystkich zamian i swapon -sponownie, aby potwierdzić, że wszystkie zamiany zostały wyłączone.

Następnie ponownie spróbowałem zmaksymalizować zużycie pamięci. Niestety, oczekiwane zachowanie się nie zdarzyło. Zamiast tego kswapd0 próbuje ciągle wymieniać pamięć RAM i kończy się niepowodzeniem, ponieważ nie ma przestrzeni wymiany. Ponieważ nigdy się nie poddaje, mój komputer jest zablokowany wiecznym zawieszeniem we / wy, co jest szkodliwe dla zdrowia mojego dysku.

Czy robię coś złego, próbując swapoff -a? Dlaczego zachowanie jest inne niż kiedyś (prawdopodobnie wcześniej niż 3,0 razy)?


To naprawdę nie ma sensu. Zrobienie tego swapoff -a samego , jeśli w swapie było coś, wygeneruje dużo I / O (i może doprowadzić do zabicia procesów, jeśli nie ma wystarczającej ilości dostępnej pamięci RAM). Czy jesteś pewien, że to nie swapoff -ato spowodowało „burzę” we / wy?
Mat

1
Przypuszczam, że wystarczy skomentować fstabwiersz o zamianie. Spróbuj, jeśli zachowanie jest takie samo.
enzotib,

@Mat swapoff -apowinien wyłączyć swap na stałe, co oznacza, że ​​powinien pozostać wyłączony po następnym ponownym uruchomieniu. Potwierdziłem to. Jednak „burza” we / wy nadal występuje podczas sesji po następnym ponownym uruchomieniu. Dla przypomnienia, „burza” we / wy nie zdarzyła się w tym momencie, swapoff -aponieważ swap w tym czasie wynosił 0.
syockit,

9
@syockit: nieswapoff -a jest trwały.
Mat

1
ładowanie bazy danych osiągnęło około 15% w ciągu 14 godzin. Wyłączyłem swap, a przy następnej próbie osiągnął 40% w ciągu 4 godzin. wprawdzie serwer jest niedostatecznie zasilany i działa na ram, ale bez włączonej wymiany OpenSuSE działa znacznie szybciej dla tego jednego procesu. Opinia systemu operacyjnego na „lepsze” i moje różnią się diametralnie podczas prostego ładowania bazy danych mysql. skomentował dysk wymiany w / etc / fstab i zrestartował się.
TheSatinKnight

Odpowiedzi:


15

Wyłączenie zamiany nie zrobi tego, co chcesz. Nadal będziesz uzyskiwał gwałtowną przepustowość we / wy, ale będą to strony czyste, a nie brudne.

Bez wymiany system skompresuje pamięć podręczną czystych (niezmodyfikowanych) stron do prawie zera, ponieważ są to jedyne strony, które można usunąć z pamięci fizycznej. Może tylko usuwać brudne (zmodyfikowane) strony z pamięci, pisząc je do zamiany, bez zamiany, nie ma możliwości eksmisji brudnych stron.

Gdy zabraknie pamięci fizycznej, każdy proces będzie musiał załadować swoje strony kodowe z dysku, ponieważ eksmituje poprzednie strony kodowe procesu. Rezultatem będą gwałtowne wstrząsy i nadmierna praca wykonywana przez podsystem wymiany.

Jest to szczególny przypadek bardzo ważnej zasady: w przypadku dobrze zaprojektowanego systemu nie można go polepszyć, ograniczając jego możliwości wyboru. Linux to dobrze zaprojektowany system. Usunięcie zamiany daje po prostu mniej możliwości wyboru, więc nic dziwnego, że zachowuje się gorzej.


1
Jest to prawdą tylko wtedy, gdy brakuje tylko całej pamięci. Uciekający proces zwykle będzie próbował przydzielić znacznie więcej, a więc zostanie zabity wcześnie, zwalniając tę ​​pamięć, w przeciwieństwie do kontynuowania zamiany systemu na śmierć, próbując pomieścić więcej przydziałów, dlatego wyłączenie swap może być pomocne, gdy maksymalizujesz wykorzystanie pamięci RAM z niekontrolowanego procesu.
psusi

1
Tylko mało pamięci będzie prawie zawsze przydzielane. Linux jest specjalnie dostosowany w ten sposób. Zrób cat /proc/meminfona dowolnym typowym Linux-ie po kilku godzinach ładowania.
David Schwartz

2
@syockit Po wyłączeniu stronicowania nie można uruchamiać żadnych programów. Stronicowanie to mechanizm, za pomocą którego pliki są odczytywane po zmapowaniu do pamięci.
David Schwartz

2
@psusi: Czyste strony nie zostaną zredukowane do minimum po zamianie. Zamiast tego zastąpi brudne, anonimowe strony, które nie były ostatnio używane. Oczywiście, tak czy inaczej, w końcu dostaniesz gwałtowne uderzenie, jeśli zestaw roboczy przekroczy pamięć fizyczną. Chodzi o to, że z wymianą lub bez niej dostaniesz dużo brutalnego wyrzucania, zanim zabraknie ci pamięci. Różnica polega na tym, że przy zamianie gwałtowne wyrzucanie będzie zamieniało się (brudne strony, pisanie i czytanie). Bez zamiany gwałtowne przebijanie będzie skutkować błędami w kodzie (czyste strony, tylko do odczytu).
David Schwartz

2
@psusi: Masz rację, jeśli problem jest niekontrolowanym procesem, który gwałtownie przyspiesza zużycie pamięci. Ale nie o tym mówi OP, który jest procesem, który pochłania nadmierną, ale nie nieograniczoną lub masowo nadmierną pamięć. Gdy rośnie przez duże słodkie miejsce (gdzie ściśnięta jest pamięć podręczna), będzie rosnąć coraz wolniej, gdy system będzie drżeć.
David Schwartz

13

Lepszym rozwiązaniem niż wyłączenie swap, które w najlepszym wypadku spowoduje zabicie losowych procesów, gdy pamięć się wyczerpie, jest ustawienie limitu segmentu danych na proces dla procesów, które ściągają rzeczy z sieci. W ten sposób niekontrolowana przeglądarka osiągnie limit i umrze, zamiast spowodować, że cały system stanie się bezużyteczny. Przykład z powłoki

(ulimit -d 400000; firefox) &

Liczba po -d jest w kilobajtach. Powinieneś eksperymentować z tym w swoim systemie, aby wybrać najlepszą wartość dla swoich nawyków przeglądania. Nawiasy powodują utworzenie podpowłoki; polecenie ulimit wpływa tylko na tę powłokę i jej dzieci, izolując jej skutki od powłoki macierzystej.


Czy to zadziała, powiedzmy, w przypadku chromu, gdzie mamy do czynienia z szeregiem chromiumprocesów wykorzystujących małe porcje pamięci?
jberryman

@jberryman Nie, limity pamięci dotyczą procesu, a nie użytkownika.
Kyle Jones,

Czy istnieje sposób, aby wysłać mu określony sygnał (np. SIGHUP), gdy osiągnie limit pamięci?
Geremia

1
@Geremia Nie. Połączenia systemowe brk i sbrk przestają działać, co spowoduje, że większość rzeczy zwinie się i umrze.
Kyle Jones

Jeśli chcesz przejść do ręcznego strojenia, sugerowałbym użycie cgroup pamięci zamiast ulimit, ponieważ za pomocą cgroup pamięci możesz ustawić limit dla całej grupy procesów i skonfigurować proces alokacji pamięci, aby zatrzymać, a proces zasad trybu użytkownika może zdecydować, co zrobić zrobić (np. wysłać kilka sygnałów, wybrać proces do zabicia, podnieść limit pamięci w locie). Zobacz kernel.org/doc/Documentation/cgroup-v1/memory.txt i kernel.org/doc/Documentation/cgroup-v2.txt, aby uzyskać szczegółowe informacje.
Mikko Rantalainen

4

Aby upewnić się, że wymiana nie jest używana, lepiej nie dopuścić do dodania wymiany podczas rozruchu. Można to zrobić, w zależności od systemu, wyłączając swapusługę rozruchu lub po prostu komentując wpis wymiany /etc/fstab.

Jeśli chodzi o zawieszenie, stop()funkcja w /etc/init.d/swapmoże dać wskazówkę:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Zwróć uwagę na część dotyczącą impasu . Możesz spróbować zrobić to umount -a -t tmpfssam przed wyłączeniem swap.


Edytować:

Prawdopodobnie możesz również osiągnąć swój cel, zmieniając sysctlustawienia (patrz to pytanie ).


Nie mam swapw init.d, ani nie mam go fstab, ale mam /etc/init.d/mountoverflowtmpże wierzchowce tmpfsdla zapisów dziennika awaryjnego. Czy używa tmpfsrównież demon wymiany ?
syockit,

Możesz włączyć tę funkcję w innym miejscu - zrób to, grep -RF swap /etc/jeśli chcesz ją znaleźć. Ale aby wyłączyć usługę, serviceużyłbyś polecenia takiego jak (IIRC; sam nie używam Debiana).
rozcietrzewiacz

1
Zamiana sama nie korzysta tmpfs , ponieważ tmpfsjest to system plików w pamięci RAM. Ale inne usługi / programy, które korzystają, tmpfsmogą polegać na zamianie w specjalny sposób. Naprawdę nie wiem, ale może to mieć coś wspólnego z buforowaniem lub ze specjalnym sposobem, w jaki tmpfskierowca twierdzi, że ma dostęp do przestrzeni wymiany.
rozcietrzewiacz

Jest coś w tym, jak Linux obsługuje pamięć wirtualną, czego nie rozumiem. Wyłączyłem zamianę na większość możliwych sposobów: przez swapoffi przez vm.swappiness=0. Ale kswapd0wciąż działa! Zastanawiam się, czy to regresja z 2,4 dnia…
syockit

5
@syockit To oczekiwane zachowanie. System nadal wymienia czyste strony (strony zawierające kopie danych pliku). Nie wymaga miejsca wymiany na zamianę czystych stron, ponieważ można je odczytać ze źródeł innych niż zamiana.
David Schwartz,

2

Lepiej jest komentować wpis partycji wymiany /etc/fstabniż uruchamiać się swapoff -apo każdym uruchomieniu.

Mam ten sam problem z kswapd0 na moim sprzęcie.

Strojenie vm.swappinessparametru systemu nie pomaga mi.

sysctl -w vm.swappiness=0

Przeglądałem i czytałem wiele postów, list mailingowych, a teraz myślę, że to błąd jądra.

Kiedy nie ma aktywnej partycji wymiany, a wolna pamięć staje się mniejsza niż pewien próg (w moim przypadku około 300 MB), system przestaje odpowiadać z powodu szaleństwa kswapd0.

Prawdopodobnie jest reprodukowany ze specjalną konfiguracją i warunkami.

Dla kogoś jest to rozwiązane przez ponowną instalację systemu z partycjonowaniem dla innych przez zbudowanie niestandardowego jądra z kswapd0wyłączonym.


2
Jeśli kswapd0oszaleje i nie aktywujesz wymiany, brakuje pamięci RAM. Masz do wyboru OOM Killer lub kswapd0. Linux kswapd0działa, ponieważ jądro zakłada, że ​​ważniejsze jest, aby kończyć powoli, niż przerwać proces. Dla zwykłych ludzi próg, w którym jądro uważa, że ​​wciąż wystarczający postęp, jest już lodowato wolny i prawie każdy wolałby wybrać OOM Killera.
Mikko Rantalainen

1

W moim systemie (debian sid 15.11.2016) zrobiłem to:

  1. wyłącz teraz swap:

    swapoff -a
    
  2. skomentuj wiersz z partycją wymiany w / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. wyłącz montaż swap w systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

To by wystarczyło. W /etc/initramfs-tools/conf.d/resumepliku znajduje się odniesienie do wymiany . Nie wiem jaki jest tego cel. Być może ten plik będzie stanowić problem przy następnym restarcie (nie próbuję jeszcze restartować, mój czas pracy jest cenny;)).


1

komputer zawiesza się z gwałtowną przepustowością operacji we / wy w tle. iotop ujawnia, że ​​winowajcą jest kswapd0

Znalazłem jeden sposób (jak dotąd), aby tego uniknąć. Jeśli chcesz go przetestować i zobaczyć, jak działa w twoim systemie, zobacz łatkę na jądro w tym pytaniu . Zasadniczo nie eksmituje Active(file)stron (przynajmniej) pod presją pamięci, w związku z czym miażdżenie dysku (ciągłe odczytywanie) zostaje zredukowane do prawie zera, a OOM-killer może się uruchomić w ciągu 1 sekundy, zamiast zamrażać system operacyjny z powodu tego, co wydaje się jak na stałe (lub przynajmniej przez wiele minut). Mam nadzieję, że faktyczni programiści (których nie jestem) ulepszą łatkę i uczynią ją prawdziwym rozwiązaniem, skoro widzą, że to, co robi, działa w takich sytuacjach.


czy ta łatka na jądro jest już dostępna?
humanityANDpeace

@humanityANDpeace prawdopodobnie nie, bo to nie jest tak dobre (bo nie jestem programistą), jednak napotkałem na pewne problemy, takie jak: czasami, w zależności od obciążenia pracą, z łatką możesz czasem zabraknąć pamięci w którym bez tej łatki nie miałbyś i dlatego OOM-killer zabije Xorga i xfwm4, chyba że uruchomię, echo 1 | sudo tee /proc/sys/vm/drop_cachesgdy Active(file):(z / proc / meminfo) przekroczy 2 GB (w systemie 16G RAM) - może przejść do maks. 4G
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.