Linux: jak jawnie rozpakować wszystko, co możliwe?

59

Uruchomiłem coś, co wymagało dużo pamięci, a teraz wszystko jest bardzo opóźnione. Wydaje mi się, że pamięć wszystkich aplikacji zamieniła się, aby zwolnić miejsce na proces wymagający dużej ilości pamięci, a teraz wszystko powoli wraca do pamięci RAM po uzyskaniu dostępu.

Czy istnieje sposób na jawne przeniesienie wszystkiego, co możliwe, z zamiany z powrotem na pamięć RAM? A może nie wszystko, ale tylko niektóre konkretne dane?

kolypto
źródło

Odpowiedzi:

59

Polecam zezwolenie na normalną zamianę kontroli pamięci w Linuksie na rzeczy, które są faktycznie używane, gdy są używane.

Jedyne, co mogę wymyślić, to wyłączyć zamianę, a następnie włączyć ponownie

sudo swapoff -a
sudo swapon -a

Zakłada się, że masz wystarczająco dużo wolnej pamięci fizycznej, aby pomieścić wszystko w zamianie ...

Douglas Leeder
źródło
4
Działa, ale bardzo powoli :) Dzięki! Ale nadal uważam, że istnieje bardziej eleganckie rozwiązanie :)
kolypto
7
Ostrożnie z tym rozwiązaniem, wymusi usunięcie wszystkiego z zamiany ... jeśli nie zmieści się w pamięci fizycznej, jądro uruchomi zabójczego zabójcę OOM. Nie znam żadnego miłego polecenia „spróbuj przenieść wszystko do pamięci RAM, ale zawiodę, jeśli nie jest to możliwe”.
Juliano
1
Próbowałem i odkryłem, że działa bardzo wolno. Możliwe jest więc monitorowanie wolnej pamięci RAM i zabijanie, swapoffjeśli pamięć się
wyczerpie
2
Nie jestem pewien, czy zabicie swapoffa faktycznie zatrzyma operację. Zależy jak to jest realizowane.
Douglas Leeder
2
Wydaje się, że komenda swapoff działa w stylu „nie zezwalaj na zamianę nowych zapisów”, podczas gdy każdy inny uruchomiony proces (który używał / używa wymiany) może nadal „zwolnić swap”. Być może dlatego wydaje się, że idzie tak wolno. Wydaje się, że nie powoduje OOM, jak powiedziała inna osoba (używam Ubuntu Bionic) - prawdopodobnie tak by było, gdyby „dodatkowe (lub istniejące) procesy zaczęły korzystać z nowej pamięci” (tj. Prawdziwe OOM). Podsumowując, swapoff / swapon to świetne rozwiązanie. Łagodny / stały. Zakłada się, że nie inicjujesz więcej pamięci za pomocą procesów (ani nie zwiększasz zużycia uruchomionych).
Roel Van de Paar,
12

Możesz dostroić go, odbijając echem jakąś liczbę od 0 do 100 /proc/sys/vm/swappiness.

Ta kontrolka służy do określenia, jak agresywne jest jądro zamienia strony pamięci. Wyższe wartości zwiększą agresywność, niższe wartości zmniejszą ilość zamiany . Wartość 0 instruuje jądro, aby nie inicjowało wymiany, dopóki ilość wolnych stron i kopii plików nie będzie mniejsza niż znak wysokiej wody w strefie.

Wartość domyślna to 60.

sntg
źródło
13
Nie używaj / proc / sys bezpośrednio, sysctlzamiast tego użyj polecenia. W tym przypadku tak jest sysctl vm.swappiness=x.
Juliano
7
Nie sądzę, że nawet zamiana zera spowoduje jawne przeniesienie stron, które już zostały zamienione, do pamięci głównej?
Douglas Leeder
1
@Douglas ma rację. vm.swappiness będzie kontrolował głównie decyzję, czy przenieść rzeczy w celu zamiany, czy zmniejszyć ilość buforów i buforów, gdy wymagana jest pamięć.
Juliano
@Juliano, dlaczego nie należy używać / proc / sys?
James
@James Ponieważ / proc / sys jest interfejsem niższego poziomu używanym do zmiany konfiguracji jądra i zapytania o nią (jest to „szczegół implementacji”). Linux zapewnia polecenie wyższego poziomu sysctldo interakcji użytkownika. Wynik końcowy jest taki sam, ale zwykle interfejsy wyższego poziomu są preferowane dla użytkownika do bezpośredniej interakcji. Trochę jak uruchomienie silnika przez zwarcie przewodów zapłonowych (niższy poziom) zamiast po prostu przekręcenie kluczyka (wyższy poziom).
Juliano,
5

Linux dobrze sobie radzi z zarządzaniem pamięcią i nie powinieneś przeszkadzać. Wspomniane wcześniej ustawienie vm.swappiness nie przeszkadza. Bardziej prawdopodobne jest wystąpienie dziwnych problemów podczas wykonywania innych czynności.

Co uruchomiłeś, które było tak głodne pamięci? Czy można to dostroić? Jeśli nie ma własnych dyrektyw dotyczących limitów pamięci, możesz także spojrzeć na ulimit.

CarpeNoctem
źródło
W moim przypadku tak było convert -density 200 file.pdf jpegs/file.jpg. Z jakiegoś powodu wykorzystuje dużo pamięci, ale masz rację: można go dostroić. W każdym razie sytuacja jest możliwa przy każdej aplikacji :)
kolypto
1
Zgadzam się z tą odpowiedzią - prawdopodobnie powinieneś zostawić normalne operacje na maszynie, aby zamienić to, co faktycznie jest potrzebne.
Douglas Leeder
convertma -limitargument, aby kontrolować jego pamięć vs. użycie dysku, i powinieneś o nich poczytać. Ustawienie -limit memory 512MBlub podobne byłoby dobre. Prawdopodobnie dobrze byłoby również podać jawną MAGICK_TEMPORARY_PATH i wyczyścić ją po wykonaniu polecenia.
slacy
3

Jeśli masz pamięć dostępną dla wszystkich swoich aplikacji, możesz ustawić swapiness na 0, aby nic się nie zmieniło. Na przykład qemu-kvm jest dużym celem, który VMM może zamienić, ponieważ „wydaje się”, że przez większość czasu jest bezczynny. Widzę, że do 80% pamięci qemu-kvm zostaje zapisanych do zamiany. Maszyny wirtualne działające w qemu-kvm staną się prawie niereagujące, ponieważ kończą się wymiany (chociaż gość nie ma pojęcia, że ​​tak się dzieje). Gość VM będzie myślał, że działa najlepiej, chociaż w rzeczywistości strasznie się przeciąga. Kiedy kilka maszyn wirtualnych „budzi się” i zaczynam robić rzeczy, może to zwiększyć średnią ładunek do ponad 30, nawet na sprzęcie klasy korporacyjnej z dużą szybką pamięcią i dyskiem. Wydaje mi się, że jest to błąd w gotowym projekcie qemu-kvm.

Mam nadzieję, że to komuś pomoże.

Gruic
źródło
Obawiam się, że nie jest to całkiem dokładne.
Marc.2377,
2

Odradzałbym próbę prześcignięcia podsystemu VM w jądrze. BARDZO nieprawdopodobne jest, abyś miał wystarczająco dużo informacji, aby podejmować lepsze decyzje niż będzie. A jeśli zmusisz go w jakiś sposób do zrobienia czegoś złego, to po prostu sprawisz, że wszystko będzie jeszcze wolniejsze.

Michael Kohne
źródło
9
W niektórych przypadkach chcę robić to, co chce OP. Jeśli przypadkowo pozwolę, aby proces zaczął się buntować i zajmę całą swą pamięć RAM + swap, wtedy będę mógł albo czekać 15 sekund za każdym razem, gdy przełączam aplikacje, aż pamięć wyjdzie z zamiany, albo po prostu wymuszę i wszystko będzie działać tak szybko, jak zwykle.
Alex
1

Jeśli jesteś w stanie zrestartować system, który powinien to zrobić (i może to zająć znacznie mniej czasu niż wypróbowanie innego rozwiązania).

Maximus Minimus
źródło
1

Aby skopiować część mojej odpowiedzi z tego pytania .

Abyś wiedział, jak działa przestrajanie swapiness. Działa to poprzez nakazanie podsystemowi VM wyszukania stron do zamiany, gdy% pamięci zamapowanej na tabele stron procesu + wartość wymiany wynosi> 100. Zatem ustawienie 60 spowoduje, że system zacznie stronicować przestarzałe strony z tabeli stron procesu gdy zużywa ponad 40% pamięci systemu. Jeśli chcesz pozwolić swoim programom na użycie większej ilości pamięci kosztem pamięci podręcznej, musisz obniżyć wartość swapiness.

3dinfluence
źródło
Nie sądzę, że problemem jest pamięć programu vs. pamięć podręczna - myślę, że to pamięć aplikacji a pamięć nieużywana. I nie sądzę, żeby na to wpłynęło szczęście.
Douglas Leeder
0

Czy proces jest nadal uruchomiony? Otwórz terminal i sprawdź, czy możesz dostrzec uruchomione procesy. (ps aux | grep nazwa procesu może to nieco ułatwić). Użyj kill -9 PID, aby je zabić, jeśli nadal działają. Uważaj na to, co zabijesz. Jeśli nie wiesz, na czym polega proces, nie zabijaj go! Opublikuj również wynik free -m, abyśmy mogli sprawdzić, czy nadal używasz dużo swapów.

Jeśli wszystko nadal działa wolno, możesz nadal mieć uruchomioną aplikację. Nigdy nie włączałbym wymiany, chyba że naprawdę wiesz, co robisz lub lubisz żyć na krawędzi. =)

jdoss
źródło
0

Uważam, że nie ma naprawdę dobrego sposobu, aby zmusić Linuksa do zamiany danych z dysku na pamięć. Kiedy swapoff / swapon jest działającym rozwiązaniem, ale jest brudne i łatwo może spowodować niestabilność systemu. W przypadkach, gdy w swapie jest więcej danych niż wolna pamięć, trudno będzie wyobrazić sobie jakąkolwiek skuteczną politykę, którą Linux może zastosować, aby zdecydować, które fragmenty danych zostaną przeniesione do pamięci, a które pozostaną na dysku.

Podsumowanie: Pozwól Linuxowi stopniowo przywracać swoją wydajność w normalny sposób. Podsystem VM jest zorganizowany w taki sposób, że dąży i stale przechodzi do idealnego stanu równowagi.

ZarathustrA
źródło
-2

Opróżnianie pamięci podręcznej buforów

Jeśli kiedykolwiek chcesz je opróżnić, możesz użyć tego łańcucha poleceń.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Możesz zasygnalizować, że jądro Linux wyrzuci różne aspekty buforowanych elementów, zmieniając argument numeryczny na powyższe polecenie.

UWAGA: wyczyść pamięć niepotrzebnych rzeczy (jądro 2.6.16 lub nowsze). Zawsze najpierw uruchom synchronizację, aby wypłukać przydatne rzeczy na dysk !!!

  • Aby zwolnić pamięć podręczną:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Aby uwolnić dentries i i-węzły:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Aby zwolnić pamięć podręczną, dentries i i-węzły:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Powyższe mają być uruchamiane jako root. Jeśli próbujesz zrobić to za pomocą sudo, musisz nieznacznie zmienić składnię na coś takiego:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
slm
źródło