Sprawiając, że Linux czyta z powrotem w pamięci

28

Jądro Linux zamienia większość stron z pamięci, gdy uruchamiam aplikację, która wykorzystuje większość 16 GB pamięci fizycznej. Po zakończeniu aplikacji każda czynność (pisanie poleceń, przełączanie obszarów roboczych, otwieranie nowej strony internetowej itp.) Trwa bardzo długo, ponieważ odpowiednie strony muszą najpierw zostać ponownie odczytane z wymiany.

Czy istnieje sposób, aby poinformować jądro Linuksa, aby kopiowało strony z zamiany z powrotem do pamięci fizycznej bez ręcznego dotykania (i czekania) każdej aplikacji? Uruchamiam wiele aplikacji, więc czekanie jest zawsze bolesne.

Często używam, swapoff -a && swapon -aaby system ponownie reagował, ale to usuwa strony z zamiany, więc muszą być napisane ponownie przy następnym uruchomieniu skryptu.

Czy istnieje interfejs jądra, być może wykorzystujący sysfs, który instruuje jądro, aby czytało wszystkie strony z wymiany?

Edycja: Naprawdę szukam sposobu na zamianę wszystkich swapów. (Dzięki derobert!)

[PS serverfault.com/questions/153946/… i serverfault.com/questions/100448/... to pokrewne tematy, ale nie zajmują się pytaniem, jak zmusić jądro Linuksa do kopiowania stron z zamiany z powrotem do pamięci bez usuwania zamiany.]

drrossum
źródło
Chcesz, aby cała wymiana była pamięcią podręczną pamięci systemu? Czy chcesz obraz pamięci systemu, który możesz ponownie załadować? Tak działa hibernacja - system zapisuje pamięć na dysk, wyłącza się i przywraca obraz po włączeniu. Czy sądzisz, że jest jakaś szansa, że ​​przy zapytaniu następującym po tym wątku może Ci się przydać? Na przykład, jeśli chcesz zobrazować swoją pamięć, wyłączyć zamianę, wykonać zadanie, a następnie przywrócić obraz i powtórzyć - czy jest to coś, co chciałbyś zrobić?
mikeserv
Nie sądzę, aby to spowodowało zamianę w stanie wymiany. Jako takie wydaje mi się, że twoja sugestia jest alternatywą dla metody swapoff-swapon.
drrossum
Nie, nie buforuje wymiany (co jest dla mnie trochę dziwne) , buforuje pamięć RAM w punkcie, który uważasz za najbardziej integralny, a następnie poświęca całą pamięć systemową na jakieś intensywne zadanie przed przywróceniem pamięci podręcznej, gdy zadanie jest zakończone. Jeśli zamiana podczas intensywnego zadania jest tym, czego chcesz, spowolnisz tylko powiedziane zadanie - będziesz potrzebować dodatkowego czasu na zamianę stron w trakcie pracy.
mikeserv

Odpowiedzi:

4

Na podstawie programu memdump pierwotnie znaleźć tutaj stworzyłem skrypt do selektywnego odczytu określonych zastosowaniach z powrotem do pamięci. remember:

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

Zastosowanie: coś podobnego

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

Szybko przeskakuje pamięć nie wymienioną (gigabajty na sekundę) i zwalnia, gdy wymagana jest zamiana.

Vi.
źródło
To narzędzie robi dokładnie to, czego szukałem. Dzięki!
drrossum
Jedną fajną rzeczą jest to, że z moich obserwacji zamienione strony są kopiowane w pamięci RAM, ale nie są usuwane z wymiany (przynajmniej większość z nich nie jest, ponieważ użycie zamiany tylko nieznacznie maleje). Moja interpretacja jest taka, że ​​Linux przechowuje dwie kopie każdej strony, jedną w pamięci RAM i jedną w swapie. Jeśli jest to obsługiwane poprawnie, jest to nawet lepsze niż anulowanie i ponowne dodanie zamiany, ponieważ oznacza to, że gdy podwójna strona będzie musiała zostać zamieniona ponownie, nie będzie potrzeby kolejnej kopii. Dzięki każdemu ekspertowi od jądra, który może potwierdzić.
Giovanni Mascellani
11

Może pomóc w górę /proc/sys/vm/page-cluster(domyślnie: 3).

Z dokumentacji jądra ( sysctl/vm.txt):

klaster stron

Klaster stron kontroluje liczbę stron, do których kolejne strony są odczytywane z wymiany podczas jednej próby. Jest to odpowiednik zamiany pamięci podręcznej strony. Wspomniana konsekwencja nie dotyczy adresów wirtualnych / fizycznych, ale jest kolejna na przestrzeni wymiany - oznacza to, że zostały one zamienione razem.

Jest to wartość logarytmiczna - ustawienie na zero oznacza „1 stronę”, ustawienie na 1 oznacza „2 strony”, ustawienie na 2 oznacza „4 strony” itp. Zero całkowicie wyłącza zamianę głowicy.

Wartość domyślna to trzy (osiem stron jednocześnie). Dostosowanie tej wartości do innej wartości może być niewielkie, jeśli obciążenie wymaga intensywnej wymiany.

Niższe wartości oznaczają mniejsze opóźnienia dla błędów początkowych, ale jednocześnie dodatkowe błędy i opóźnienia we / wy dla kolejnych błędów, gdyby były częścią kolejnych stron, które przyniosłaby readahead.

Dokumentacja nie wspomina o limicie, więc być może możesz ustawić tę absurdalnie wysoką wartość, aby wszystkie wymiany zostały odczytane bardzo szybko. I oczywiście później przywróć normalną wartość.

derobert
źródło
To brzmi jak przydatne obejście. Dwie ręczne interwencje można połączyć z komendą uśpienia, aby była to interwencja pojedynczego użytkownika. Ale niekoniecznie powoduje to, że wszystkie zamiany są zamieniane bardzo szybko, ponieważ odczytuje tylko kolejno z dostępnej strony. Jak dotąd jest to najlepsze rozwiązanie. Dzięki!
drrossum
Jest to prawdopodobnie najlepsze rozwiązanie. Nie słyszałem o tym wcześniej, ale wygląda na to, że zamienia swap-in w serię dużych IOP, a nie w ciągły zestaw małych IOP, co prawdopodobnie powoduje problemy z wydajnością. Byłbym słusznie zaskoczony, gdyby było coś, co idealnie rozwiązałoby twoją indywidualną sytuację.
Bratchley,
W tym przypadku, jeśli występują spowolnienia z powodu wielu kolejnych małych zamian, nawet zwykłe dostosowanie page-clusterwartości może poprawić wydajność.
Ilmari Karonen
5

Możesz spróbować dodać programy, które najbardziej Cię interesują, do grupy cG i dostrajać swapiness , aby przy następnym uruchomieniu aplikacji dodawane programy były mniej prawdopodobne, że będą kandydatami do zamiany.

Niektóre strony prawdopodobnie nadal zostaną zamienione, ale może to rozwiązać problemy z wydajnością. Duża część tego jest prawdopodobnie tylko zachowaniem „zatrzymaj i uruchom”, gdy wiele stron programu jest zamienionych, a program musi stale wstrzymywać, aby zamienić swoje strony w pamięci RAM, ale tylko w przyrostach 4k.

Alternatywnie możesz dodać aplikację, która jest uruchomiona do grupy, i dostroić swapiness, tak aby aplikacja najczęściej używała pliku wymiany. Spowolni działanie aplikacji, ale pozwoli zaoszczędzić resztę systemu.

Bratchley
źródło
4

Wydaje mi się, że nie można magicznie „sprawić, aby system ponownie zareagował”. Albo ponosisz karę, albo odczytujesz strony z zamiany miejsca do pamięci albo ponosisz ją później, ale w ten czy inny sposób ją ponosisz. Rzeczywiście, jeśli zrobisz coś takiego swapoff -a && swapon -a, możesz odczuwać więcej bólu niż mniej, ponieważ zmuszasz niektóre strony do skopiowania z powrotem do pamięci, które w innym przypadku nigdy nie byłyby potrzebne i ostatecznie zostałyby usunięte bez czytania (pomyśl: zamknij aplikację, dopóki znaczna część stosu jest zamieniona; strony te można całkowicie wyrzucić bez konieczności ponownego czytania w pamięci).

ale to usuwa strony z zamiany, więc muszą być napisane ponownie przy następnym uruchomieniu skryptu.

Cóż, prawie każda strona, która zostanie skopiowana z zamiany do pamięci głównej, i tak ma zostać zmodyfikowana, więc jeśli kiedykolwiek będzie trzeba ją wycofać, aby zamienić ją ponownie w przyszłości, i tak trzeba ją napisać na nowo. Należy pamiętać, że zamiana to głównie pamięć sterty, a nie strony tylko do odczytu (które zwykle mają kopie zapasowe plików).

Myślę, że twoja swapoff -a && swapon -asztuczka jest tak dobra, jak wszystko, co możesz wymyślić.

Celada
źródło
To dwoje z nas mówi dokładnie to samo w tym samym czasie;)
goldilocks 17.04.15
@Goldilocks tak, widziałem twoją odpowiedź, zanim moja była gotowa, ale już skończyłem, więc utknąłem z nią :-)
Celada
ty i złotowłosa mówicie to samo, ale nie wierzę, że tak działa buforowanie zamiany. Rozumiem, że możesz jednocześnie zamieniać strony ORAZ w pamięć. Strona wymiany zostaje unieważniona dopiero po zaktualizowaniu strony w pamięci.
drrossum
Ufam, że odpowiedź, o której wspomniał David Spillett, jest poprawna: rzeczywiście możesz mieć stronę w swapie i pamięci RAM jednocześnie ... ale tylko do czasu modyfikacji wersji pamięci RAM. Następnie musisz odrzucić nieaktualną kopię w zamianie. Kiedy powiedziałem „prawie każda strona, która zostanie skopiowana z zamiany [...] i tak ma zostać zmodyfikowana”, mam na myśli to, że oczekuję, że tak się dzieje przez większość czasu, więc nie oczekuję stron w obu miejscach być istotną frakcją, o którą warto się martwić.
Celada
Twój scenariusz użycia może być inny: możesz mieć wiele aplikacji z dużymi stertami, które często są czytane, a nie pisane. Mam wrażenie, że większość ludzi nie ma takiego scenariusza. Ale jeśli to zrobisz, myślę, że masz rację: swapoff -a && swapon -anie będzie dla ciebie dobry. Myślę, że w takim przypadku potrzebujesz czegoś, co skanuje /proc/<each-process>/memi odczytuje każdą stronę pamięci, aby upewnić się, że istnieje ona w pamięci RAM. Nie wiem czy to istnieje.
Celada
0

Bardzo miła dyskusja tutaj http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that co sprowadza się do zmniejszania swapingu, przy założeniu, że aby zwiększyć postrzeganą szybkość reakcji systemu, należy zapobiegać zamianie kodu (i tak się dzieje). To nie jest tak naprawdę odpowiedź na twoje pytanie, ale może to zapobiec pojawieniu się problemu (twoje aplikacje po prostu się nie zamieniają, tylko nieużywane dane i pamięć podręczna stron)

Fedxa
źródło
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
slm