Dlaczego kswapd0 działa na komputerze bez wymiany?

21

Mam serwer w chmurze z ~ 14G pamięci RAM i bez wymiany. Jednak czasami widzę, że kswapd0 zajmuje trochę procesora podczas uruchamiania top. Dlaczego kswapd0 miałby w ogóle działać, skoro nie ma dla niego miejsca do wymiany?

Thomas Johnson
źródło

Odpowiedzi:

8

Nadal ma proces sprawdzania, czy jest jakaś zamiana. Aby go zmniejszyć, musisz ustawić swapiness -

edytuj „/etc/sysctl.conf” jako root, a następnie zmień (lub dodaj)

vm.swappiness = 0
Elliott Frisch
źródło
3
Ok, ale dlaczego używa 1% mojego procesora?
portforwardpodcast
2
jeśli kswapd0bierze jakikolwiek procesor i nie masz zamiany, system prawie nie ma pamięci RAM i próbuje poradzić sobie z sytuacją poprzez (w praktyce) zamianę stron z plików wykonywalnych. Prawidłowa poprawka polega na zmniejszeniu obciążenia, dodaniu wymiany lub (najlepiej) zainstalowaniu większej ilości pamięci RAM. Dodanie wymiany zwiększy wydajność, ponieważ jądro będzie miało więcej opcji dotyczących zamiany na dysk. Bez wymiany jądro jest praktycznie zmuszone do wymiany kodu aplikacji.
Mikko Rantalainen
Jeśli masz włączoną kswapd0funkcję wymiany i używasz procesora, a nie chcesz tego, obniż swappinessustawienie. Jednakże, chyba że twoja zamiana jest wspierana przez dysk SSD, który cierpi z powodu zapisu (np. Algorytm złego wyrównywania zużycia), obniżenie swappinessobniża ogólną wydajność systemu. Chodzi o to, aby zachować kopię pamięci RAM w ramach wymiany na wypadek, gdyby potrzebna była większa ilość pamięci RAM - w takim przypadku kopia w pamięci RAM jest natychmiast wyrzucana, zamiast zacząć ją zamieniać, zanim będzie można użyć pamięci RAM. Ta optymistyczna zamiana odbywa się tylko wtedy, gdy system jest wystarczająco bezczynny, więc nigdy nie powinien spowalniać systemu.
Mikko Rantalainen
26

Przestrzeń wymiany jest używana tylko dla danych, które nie są poparte żadnym innym plikiem. Dane mapowane z innych plików na dysku (takich jak programy wykonywalne) są nadal zamieniane na odpowiednie pliki, nawet jeśli nie masz urządzenia wymiany.

psusi
źródło
9
Rozważmy na przykład przypadek, w którym nie ma wymiany, a systemowi prawie brakuje pamięci RAM. Jądro pobierze pamięć np. Z przeglądarki Firefox (może to zrobić, ponieważ Firefox uruchamia kod wykonywalny, który został załadowany z dysku - w razie potrzeby kod można załadować ponownie z dysku ). Jeśli Firefox musi ponownie uzyskać dostęp do tej pamięci RAM N sekund później, procesor generuje „twardy błąd”, który zmusza Linuksa do zwolnienia pamięci RAM (np. Zabrania pamięci RAM z innego procesu), załadowania brakujących danych z dysku, a następnie umożliwienia Firefoxowi kontynuowania działania jako zwykły. Jest to dość podobne do normalnej zamiany i robi to kswapd0.
Mikko Rantalainen
4

Jest to dobrze znany problem polegający na tym, że kiedy Linuksowi zabraknie pamięci, może wchodzić w pętle wymiany zamiast robić to, co powinno, zabijając procesy w celu zwolnienia pamięci RAM. Istnieje zabójca OOM (Out of Memory), który to robi, ale tylko wtedy, gdy Swap i RAM są pełne.

Nie powinno to jednak stanowić problemu. Jeśli istnieje kilka szkodliwych procesów, na przykład Firefox i Chrome, z których każda zawiera karty, które zarówno używają, jak i pobierają pamięć, wówczas procesy te spowodują odczytywanie zamiany. Linux następnie wchodzi w pętlę, w której ta sama pamięć jest przenoszona tam iz powrotem między pamięcią a dyskiem twardym. To z kolei powoduje odwrócenie priorytetu, gdy zamiana kilku procesów tam iz powrotem powoduje, że system nie odpowiada.

Jeśli wyłączysz swap, pogorszysz ten problem, ponieważ kswapd0 nie ma teraz innej opcji niż zamiana zmapowanej pamięci, takiej jak pliki wykonywalne. Jeśli podmienisz pliki wykonywalne, jeszcze bardziej prawdopodobne jest, że zostaną one ponownie zamienione dość szybko.

Próbowałem wyzwolić to zachowanie w NetBSD do testowania, a to, co się tam zdarzyło, spowodowało, że proces przestępstwa stał się niesamowicie wolny, podczas gdy sam system operacyjny bardzo reagował. Oznacza to, że występują problemy z zamianą, ale nie ma odwrócenia priorytetu. Jednak NetBSD nie ma sterowników AMDGPU, więc na razie trzymam się Linuksa. Być może NetBSD nie wykonuje plików wykonywalnych mapowania pamięci i dlatego nie wchodzi w pętle wymiany, ale tak naprawdę nie wiem wystarczająco dużo o jego implementacji, aby powiedzieć, dlaczego nie przestaje odpowiadać.

Facebook również miał ten problem i stworzył OOMD, który jest demonem braku pamięci. Jest to demon, który wykrywa aktywność kswapd0 i rozpoczyna procesy zabijania. Według Facebooka prawie całkowicie usunęło to problem braku odpowiedzi serwerów Linux. Jednak go nie testowałem i nie wiem, jak dobrze będzie działać na innych serwerach lub komputerach stacjonarnych / laptopach. Co ciekawe, OOMD ma pewną logikę decydującą o tym, które procesy najpierw zabić, aby zachować procesy systemowe i część ich systemu serwerowego, które są odpowiedzialne za ponowne uruchomienie tego, co zostało zabite.

Jednak nie tak należy to rozwiązać. OOMD to brzydki hack. Prawdziwym rozwiązaniem jest naprawienie inwersji priorytetów powodowanej przez pętlę wymiany, a także uczynienie jądra OOM Killer bardziej agresywnym w procesach zabijania w celu zwolnienia pamięci. Poprawka należy do jądra, ponieważ jest to jedyne miejsce, w którym możemy być pewni, że problem zostanie wykryty na czas, a procesy zostaną poprawnie zabite.

Ustawienie swappiness = 0 nie jest rozwiązaniem, ponieważ kiedy system jest pozbawiony wolnej pamięci RAM, zaczyna się zamiana bez względu na wszystko. Nie ma opcji, aby zagwarantować, że system nie rozpocznie wymiany.

A także naprawianie szkodliwych aplikacji nie jest naprawą. Zwłaszcza, jeśli użytkownik chce wykorzystać ten błąd, aby celowo uniemożliwić działanie systemu operacyjnego. Reagowanie jest obowiązkiem jądra. Jeśli Firefox przestanie odpowiadać, wówczas poprawka dotyczy aplikacji. Jednak nie tylko przestaje odpowiadać, ale powoduje, że cały system operacyjny staje się bardzo wolny i nie odpowiada. Do poziomu, który może zająć pół godziny, aby zalogować się do SSH. SSH nie ma z tym nic wspólnego, a jeśli się nie uruchomi, jest to błąd w jądrze, a nie w żadnej innej części systemu. I to nie jest błąd, to dwa błędy. Jednym błędem jest inwersja pierwszeństwa, w której cykl wymiany poza szynami może zakłócać inne procesy niż procesy naruszające i samo w sobie jest złe. Innym błędem jest to, że t wykryje, że znajduje się on w pętli wymiany i powoduje szalone zużycie dysku twardego / SSD lub innego nośnika, który obsługuje zamianę. Podczas zamiany pliku wykonywalnego jest to mniejszy problem, ponieważ są one tylko do odczytu mapami pamięci, które nie są zapisywane z powrotem na dyskach, ale kswapd0 wciąż jest blokowany, czytając to, co jednocześnie usuwa z pamięci.

Aha, jest trzeci błąd. Fakt, że nie ma sposobu, aby zabezpieczyć pamięć podręczną dysku przed zjedzeniem, gdy aplikacje wymagające pamięci zajmą całą dostępną pamięć. Jest to jeden z powodów, dla których kswapd0 powoduje brak reakcji systemu. Najbardziej zmapowane dane z pamięci są zwykle przechowywane w pamięci podręcznej dysku, ale gdy Firefox zje tę pamięć podręczną, to oczywiście oznacza, że ​​konieczne będzie odczytanie dysku.

Problem niekoniecznie powoduje Firefox, ale jest to domyślna przeglądarka, a nie Chrome. Oba są powszechnie znane z wyzwalania tego problemu, ponieważ traktują dostępną pamięć jako coś, co jest marnowane, w tym pamięć podręczną i pamięć wymiany, która w systemie Linux liczy się jako „dostępna pamięć”. Aby nie zmarnować „dostępnej pamięci”, należy ją wykorzystać do buforowania i innych rzeczy. Oczywiście używanie SWAP dla DISK CACHE to BARDZO ZŁA POMYSŁ, ale stażyści zarówno w Firefoksie, jak i Chrome odpowiadają na to „wolną pamięcią to zmarnowana pamięć”.

Mamy tutaj trzy błędy jądra, których zespół nie wydaje się brać pod uwagę. I błąd w Firefoksie, Chrome i wszystkich pochodnych, których nie uważają za błąd. Próbowałem zbudować Firefoksa na moim laptopie Fedory, aby przyjrzeć się temu problemowi i być może go załatać. Zgadnij co. Budowanie Firefoksa z GCC na 4-rdzeniowym procesorze z 4 GB pamięci RAM uruchamia SWAP LOOP z PRIORITY INVERSION. Jedną z aplikacji, które należy przepisać, jest GCC. Na NetBSD dzieje się tak, że tylko 4 działające instancje GCC działają wolniej niż jedna, ale nie zamraża systemu.

Tak, to trochę rant, ale mam nadzieję, że to wyjaśni obecny problem z podsystemami pamięci Linuksa, a także z aplikacjami, które go powodują.

użytkownik1657170
źródło
1

Jeśli nie masz swapu i kswapd0jest uruchomiony, twój system faktycznie używa prawie całej pamięci RAM w tym momencie. Czas znaleźć lepsze narzędzia do monitorowania wykorzystania pamięci (lub wolnej / dostępnej pamięci w systemie).

Prawdziwą poprawką jest zmniejszenie zużycia pamięci (uruchamianie procesów z mniejszą ilością wycieków pamięci, uruchamianie mniejszej liczby procesów, w ogóle pomijanie uruchamiania niektórych procesów, ograniczenie liczby procesów potomnych / roboczych niektórych programów serwerowych) lub uzyskanie większej ilości pamięci RAM. Jeśli potrzeba pamięci RAM jest spowodowana wyciekiem pamięci, możesz zamiast tego użyć opcji zamiany. Linux powinien być całkiem sprytny, zamieniając wyciekłe części, mając wystarczająco dużo czasu. Posiadanie wymiany jest lepsze niż nic, ale to nie jest prawdziwy substytut posiadania odpowiedniej ilości pamięci RAM.

Mikko Rantalainen
źródło
Tutaj są dobre informacje, a także w twoich komentarzach, ale włączenie wymiany nie jest rozwiązaniem w limicie, w którym cała dostępna pamięć (ram + swap) jest zapełniana. Jest to szczególnie złe rozwiązanie w przypadku wycieku pamięci, ponieważ jest nieuniknione, że cała pamięć w końcu się zapełni. Wynik, gdy swap + ram jest pełny, jest taki sam, jak gdy ram jest pełny i swap jest wyłączony.
Code Bling