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 -s
do określenia wszelkich zamian, które zostały włączone, użyłem swapoff -a
do wyłączenia wszystkich zamian i swapon -s
ponownie, 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)?
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 nieswapoff -a
to spowodowało „burzę” we / wy?fstab
wiersz o zamianie. Spróbuj, jeśli zachowanie jest takie samo.swapoff -a
powinien 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 -a
ponieważ swap w tym czasie wynosił 0.swapoff -a
jest trwały.Odpowiedzi:
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.
źródło
cat /proc/meminfo
na dowolnym typowym Linux-ie po kilku godzinach ładowania.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
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.
źródło
chromium
procesów wykorzystujących małe porcje pamięci?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
swap
usługę rozruchu lub po prostu komentując wpis wymiany/etc/fstab
.Jeśli chodzi o zawieszenie,
stop()
funkcja w/etc/init.d/swap
może dać wskazówkę:Zwróć uwagę na część dotyczącą impasu . Możesz spróbować zrobić to
umount -a -t tmpfs
sam przed wyłączeniem swap.Edytować:
Prawdopodobnie możesz również osiągnąć swój cel, zmieniając
sysctl
ustawienia (patrz to pytanie ).źródło
swap
winit.d
, ani nie mam gofstab
, ale mam/etc/init.d/mountoverflowtmp
że wierzchowcetmpfs
dla zapisów dziennika awaryjnego. Czy używatmpfs
również demon wymiany ?grep -RF swap /etc/
jeśli chcesz ją znaleźć. Ale aby wyłączyć usługę,service
użyłbyś polecenia takiego jak (IIRC; sam nie używam Debiana).tmpfs
, ponieważtmpfs
jest to system plików w pamięci RAM. Ale inne usługi / programy, które korzystają,tmpfs
mogą 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 jakitmpfs
kierowca twierdzi, że ma dostęp do przestrzeni wymiany.swapoff
i przezvm.swappiness=0
. Alekswapd0
wciąż działa! Zastanawiam się, czy to regresja z 2,4 dnia…Lepiej jest komentować wpis partycji wymiany
/etc/fstab
niż uruchamiać sięswapoff -a
po każdym uruchomieniu.Mam ten sam problem z kswapd0 na moim sprzęcie.
Strojenie
vm.swappiness
parametru systemu nie pomaga mi.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
kswapd0
wyłączonym.źródło
kswapd0
oszaleje i nie aktywujesz wymiany, brakuje pamięci RAM. Masz do wyboru OOM Killer lubkswapd0
. Linuxkswapd0
dział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.W moim systemie (debian sid 15.11.2016) zrobiłem to:
wyłącz teraz swap:
skomentuj wiersz z partycją wymiany w / etc / fstab
wyłącz montaż swap w systemd:
To by wystarczyło. W
/etc/initramfs-tools/conf.d/resume
pliku 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;)).źródło
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.źródło
echo 1 | sudo tee /proc/sys/vm/drop_caches
gdyActive(file):
(z / proc / meminfo) przekroczy 2 GB (w systemie 16G RAM) - może przejść do maks. 4G