Mam laptopa Debian (Buster) z 8 GB pamięci RAM i 16 GB wymiany. Prowadzę bardzo długie zadanie. Oznacza to, że mój laptop był włączony przez ostatnie sześć dni, gdy się przepełniał.
Robiąc to, okresowo muszę używać laptopa jako laptopa. To nie powinno stanowić problemu; długo działające zadanie jest związane z operacjami we / wy, pracując na dyskach twardych USB i nie zajmuje dużo pamięci RAM (<200 MB) ani procesora (<4%).
Problem polega na tym , że gdy wrócę do laptopa po kilku godzinach, będzie bardzo powolny i powrót do normy może zająć 30 minut. Jest to tak złe, że monitory awarii sygnalizują, że ich odpowiednie aplikacje zostały zawieszone (zwłaszcza okna przeglądarki) i wszystko zaczyna się niepoprawnie zawieszać.
Patrząc na monitor systemowy, z 2,5 GB używanej około połowy zmienia się w swap. Potwierdziłem, że to jest problem, usuwając przestrzeń wymiany ( swapoff /dev/sda8
). Jeśli zostawiam go bez przestrzeni wymiany, wraca do życia prawie natychmiast, nawet po 24 godzinach. Dzięki zamianie jest to właściwie cegła przez pierwsze pięć minut, która pozostała tylko na sześć godzin. Potwierdziłem, że użycie pamięci nigdy nie przekracza 3 GB, nawet gdy mnie nie ma.
Próbowałem sprowadzić swapiness ( patrz także: Wikipedia ) do wartości 10
i 0
, ale problem nadal występuje. Wygląda na to, że po dniu bezczynności jądro uważa, że cały GUI nie jest już potrzebny i czyści go z pamięci RAM (zamienia na dysk). Długotrwałym zadaniem jest czytanie przez rozległe drzewo plików i czytanie każdego pliku. Więc może być tak, że jądro jest zdezorientowane myśleniem, że buforowanie pomoże. Ale przy jednym przejściu 2 TB USB HD z ~ 1 miliardem nazw plików, dodatkowa pamięć RAM RAM nie poprawi wydajności. To tani laptop z powolnym dyskiem twardym. Po prostu nie może wystarczająco szybko załadować danych z powrotem do pamięci RAM.
Jak mogę powiedzieć Linuksowi, aby korzystał z przestrzeni wymiany tylko w sytuacjach awaryjnych? Nie chcę biegać bez zamiany. Jeśli wydarzy się coś nieoczekiwanego, a system operacyjny nagle potrzebuje dodatkowych kilku GB, nie chcę, aby zadania zostały zabite i wolałbym zacząć korzystać z wymiany. Ale w tej chwili, jeśli pozostawię włączoną zamianę, mojego laptopa po prostu nie można używać, gdy jest to potrzebne.
Dokładna definicja „sytuacji nadzwyczajnej” może być przedmiotem dyskusji. Ale aby wyjaśnić, co mam na myśli: w nagłym przypadku system miałby miejsce bez żadnej innej opcji niż zamiana lub zabijanie procesów.
Co to jest nagły wypadek? - Czy naprawdę musisz zapytać? ... Mam nadzieję, że nigdy nie znajdziesz się w płonącym budynku!
W tym pytaniu nie mogę zdefiniować wszystkiego, co mogłoby stanowić sytuację wyjątkową. Ale na przykład może się zdarzyć sytuacja, gdy jądro jest tak wypychane do pamięci, że zaczęło zabijać procesy za pomocą OOM Killera . Awaryjne NIE jest, gdy jądro uważa, że może poprawić wydajność za pomocą swap.
Ostateczna edycja: Zaakceptowałem odpowiedź, która robi dokładnie to, o co prosiłem na poziomie systemu operacyjnego. Przyszli czytelnicy powinni również wziąć pod uwagę odpowiedzi oferujące rozwiązania na poziomie aplikacji.
Odpowiedzi:
Posiadanie tak dużej wymiany w dzisiejszych czasach jest często złym pomysłem. Zanim system zamienił zaledwie kilka GB pamięci do wymiany, Twój system już zaindeksował na śmierć (tak jak to widziałeś)
Lepiej jest używać
zram
z małą partycją wymiany kopii zapasowych . Wiele systemów operacyjnych, takich jak ChromeOS, Android i różne dystrybucje Linuksa, domyślnie włącza zram od lat, szczególnie w systemach z mniejszą pamięcią RAM. Jest to znacznie szybsze niż zamiana na HDD i w tym przypadku możesz wyraźnie poczuć reakcję systemu. Mniej na SSD, ale zgodnie z wynikami testu porównawczego tutaj wydaje się jeszcze szybszy, nawet przy domyślnym algorytmie Lzo. Możesz zmienić na lz4, aby uzyskać jeszcze lepszą wydajność przy nieco mniejszym stopniu kompresji. Jego prędkość dekodowania jest prawie 5 razy większa niż Lzo w oparciu o oficjalny test porównawczyJest też,
zswap
chociaż nigdy go nie użyłem. Prawdopodobnie warto spróbować i porównać, który jest lepszy dla twoich przypadków użyciaNastępnie kolejną sugestią jest zmniejszenie priorytetu tych procesów związanych z IO i ewentualnie pozostawienie terminalu o wyższym priorytecie, aby można było od razu uruchomić na nim polecenia, nawet gdy system jest obciążony
Dalsza lektura
źródło
zram
urządzenie blokowe, użyć go jako wymiany, z wymianą o niższym priorytecie jako partycji dysku twardego?Jedną z poprawek jest upewnienie się, że kontroler grupy pamięci jest włączony (myślę, że jest domyślnie w nawet najnowszych jądrach, w przeciwnym razie będziesz musiał dodać
cgroup_enable=memory
je do wiersza poleceń jądra). Następnie możesz uruchomić intensywne zadanie we / wy w grupie c z limitem pamięci, który również ogranicza ilość pamięci podręcznej, którą może zużyć.Jeśli używasz systemd, możesz ustawić
+MemoryAccounting=yes
iMemoryHigh
/MemoryMax
lubMemoryLimit
(zależy od tego, czy używasz cgroup v1 lub v2) w urządzeniu, czy też plaster zawierający go. Jeśli jest to plasterek, możesz użyć gosystemd-run
do uruchomienia programu w plasterku.Pełny przykład jednego z moich systemów do uruchamiania Firefoksa z limitem pamięci. Zauważ, że używa cgroups v2 i jest skonfigurowane jako mój użytkownik, a nie root (jedna z zalet v2 nad v1 polega na tym, że delegowanie tego do użytkownika innego niż root jest bezpieczne, więc systemd robi to).
Stwierdziłem, że aby uruchomić użytkownika, musiałem użyć plastra. System pierwszy działa po prostu poprzez umieszczenie opcji w pliku usługi (lub użycie
systemctl set-property
w usłudze).Oto przykładowa usługa (przy użyciu cgroup v1), zwróć uwagę na dwie ostatnie linie. Jest to część wystąpienia systemu (pid = 1).
Dokumentacja jest w
systemd.resource-control(5)
.źródło
ulimit
?systemd
wersji 238 .Jądro robi The Right Thing ™, wierząc w to. Dlaczego miałby utrzymywać nieużywaną 1 pamięć w pamięci RAM i tak właściwie marnować ją zamiast używać jej jako pamięci podręcznej lub czegoś takiego?
Nie sądzę, aby jądro Linuksa wymieniało strony bezinteresownie lub z wyprzedzeniem, więc jeśli tak się dzieje, musi to być przechowywanie czegoś innego w pamięci RAM, co poprawia wydajność twojego długotrwałego zadania, a przynajmniej z tym celem.
Jeśli wiesz, kiedy będziesz musiał ponownie użyć laptopa, możesz użyć
at
polecenia (lubcrontab
), aby zaplanować czyszczenie wymiany (swapoff -a;swapon -a
).Ponieważ czyszczenie wymiany może być nadmierne, a nawet wywołać zabójcę OOM, jeśli z jakiegoś powodu nie wszystko mieści się w pamięci RAM, możesz po prostu „cofnąć wymianę” 2 wszystkiego, co związane z uruchomionymi aplikacjami, które chcesz przywrócić.
Jednym ze sposobów na to byłoby dołączenie debuggera takiego jak
gdb
każdy z procesów, których dotyczy problem, i uruchomienie generowania zrzutu podstawowego:Jak napisałeś, twoja długo działająca aplikacja nie wykorzystuje ponownie danych, które odczytuje po wstępnym przejściu, więc jesteś w szczególnym przypadku, w którym długoterminowe buforowanie nie jest przydatne. Następnie obejście pamięci podręcznej przy użyciu bezpośrednich operacji we / wy, jak sugeruje Will Crawford, powinno być dobrym rozwiązaniem.
Alternatywnie, możesz po prostu regularnie opróżnić pamięć podręczną plików przez echo
1
lub3
do/proc/sys/vm/drop_caches
pseudo-pliku przed OS uważa, że to dobry pomysł, aby zamienić swoje aplikacje GUI i środowiska.Zobacz Jak opróżniasz bufory i pamięć podręczną w systemie Linux? dla szczegółów.
1 Nieużywany w tym sensie: nie jest już aktywnie wykorzystywany od dłuższego czasu, pamięć jest nadal ważna dla jego właścicieli.
2 Włóż z powrotem do stron pamięci RAM zapisanych w obszarze wymiany.
źródło
Czy proces, który uruchamiasz, sam stworzyłeś?
Jeśli tak, warto poprawić kod, aby otworzyć pliki za pomocą
O_DIRECT
flagi, która zacytowała stronę podręcznika -źródło
nocache
polecenie to wygodny hack, aby to zrobić. (Używa LD_PRELOAD do przejęcia niektórych wywołań libc).Oto pomysł, którego sam nie próbowałem (i przepraszam, że nie mam teraz czasu na eksperymentowanie z tym).
Załóżmy, że tworzysz małą maszynę wirtualną z tylko 512 MB pamięci na potrzeby procesu w tle. Nie jestem pewien, czy chcesz, aby miała ona zamianę, połączenie i wyłączenie wymiany w systemie hosta.
źródło
Usuń swap lub zmniejsz go o około 20% ( może różnić się w zależności od systemu ), ponieważ ostatnio systemy operacyjne nie używają swapu w taki sam sposób, jak kilka lat temu. Prawdopodobnie odpowiada na niektóre z twoich pytań:
-> oficjalny redhat.com
niektóre z informacji Red Hat poniżej,
i
https://wiki.debian.org/Swap
część linku Debiana powyżej,
Możesz spróbować:
„Najlepszy sposób na wyłączenie wymiany w systemie Linux”
Notatka osobista:
Ponieważ mam 6 GB pamięci RAM i cały mój ostatnio system operacyjny Linux. Nigdy nie widziałem żadnych oznak używania Swap. Ustaliłem, że muszę go wyłączyć albo dla przestrzeni (kilka gigabajtów więcej), a ponieważ czasami spowalnia mój system.
źródło