Jaka jest odpowiednia wartość vm.swappiness podczas korzystania z zram?


13

Używam zram na moim komputerze jako skompresowanej wymiany opartej na pamięci RAM. Kiedy system musi coś zamienić, zamiana na plik wymiany wspierany zramem jest mniej więcej równoważny z kompresowaniem tych danych w pamięci w celu zwolnienia miejsca. To sprawia, że ​​zamiana jest bardzo szybka przez większość czasu, w porównaniu do wymiany kopii zapasowej na dysku. Z tego powodu zastanawiam się, czy można uzyskać jakąś wydajność, zachęcając system do bardziej agresywnej wymiany nieużywanych rzeczy, ponieważ może to zrobić bez faktycznego uderzenia w dysk?

Czy ktoś pomylił się z, powiedzmy, ustawieniem vm.swappinessna 100 podczas korzystania z zram? Czy byłoby to pożądane?

sysctl -w vm.swappiness=100

2
To doskonałe pytanie i myślę, że niektóre testy porównawcze mają na celu usunięcie opinii i poznanie faktów ...
Starszy Geek

Dobry pomysł, a zram mógł się poprawić od 2012 roku, kiedy użyłem go ostatnio :-)
Huygens

Zrobiłem mały test i, o ile mogę stwierdzić, pamięć „zarezerwowana” dla zram jest nadal używana jako pamięć podręczna. Jeśli zostanie to potwierdzone, myślę, że sensowne byłoby utrzymywanie niskiej swapiness, aby uniknąć cykli procesora?
Vitor

Odpowiedzi:


2

Naprawdę nie zalecałbym, aby zwiększyć swapiness. Częstym mechanizmem w jądrze jest umieszczanie stron (fragmentu pamięci) w swapie, aby zwolnić pamięć dla innych uruchomionych zadań.

Pierwszy „problem”, gdy jądro chce uwolnić n stron, m (przy m <n, m to liczba skompresowanych stron potrzebnych do przechowywania n) są nowo tworzone w pamięci RAM, nie jestem pewien, czy to może zakłócić jądro lub nie.

W każdym razie, gdy masz strony w swapie, możliwe jest, że będziesz później używać aplikacji z niektórymi stronami w swapie. Jądro przywraca te strony do pamięci fizycznej, ale nie usuwa ich z wymiany (która przy standardowej zamianie może być postrzegana jako buforowanie , więc gdy aplikacja wróci w tło, jądro nie musi zapisywać tych stron do wolnej zamiany). Jednak w przypadku zram może nie jest to mądra sztuczka, ponieważ masz w pamięci m stron w zram + n stron, które powróciły do ​​pamięci!

Jądro ma normalnie „całkowitą pamięć”, którą może wykorzystać do prowadzenia swojej działalności. Kiedy dodajesz zram, liczy się on tylko w pamięci „swap”, tak jak w przypadku każdej wymiany dysku, ale zmniejszył rzeczywistą „całkowitą pamięć” i nie jest to oczekiwane / oczekiwane przez jądro. Czasami możesz mieć dziwne i niepożądane zachowanie z tego powodu!

Z zram dobrze by było, gdyby jądro nie zamieniało się zbytnio w ten obszar, gdy jest pod presją pamięci. I zawsze powinieneś mieć prawdziwą partycję wymiany dysku twardego większą niż twój maksymalny rozmiar zram, aby system nie dostał OOM, a jednocześnie zobaczyłbyś dużo wolnego miejsca, jak zgłosiło free!


zram zapewnia urządzenia blokujące pamięć RAM. Wszystko zapisane na tych urządzeniach blokowych zostaje skompresowane. Jeśli urządzenia blokujące ZRAM są używane jako swap, gdy system próbuje przenieść części pamięci w celu zamiany, będzie skutecznie przenosić pamięć z jednej części pamięci RAM do drugiej, z wyjątkiem tego, że dane zostaną skompresowane przed skopiowaniem do miejsca docelowego. Działa to skutecznie jako tani mechanizm kompresji pamięci, aby poprawić czas reakcji w systemach z ograniczoną ilością pamięci. ... Zram zajmuje się inscenizacją od Linuksa 2.6.33. W wersji 3.14 zram został przeniesiony ze środowiska inscenizacji do sterowników / block / zram.
Starszy Geek

1
@ElderGeek dokładnie! Podam przykład, aby zilustrować, dlaczego nie jest to idealne. Jądro spróbuje usunąć 64 MB pamięci RAM, umieści je w swapie zram. Skompresowany fragment 64 MB ma teraz 32 MB. Rezultatem jest zmniejszenie pamięci o 32 MB, a nie 64 MB. Co się stanie, gdy aplikacja wymaga 64 MB pamięci z powrotem, jądro kopiuje (i nie przenosi) fragment z powrotem do pamięci. Masz teraz 64 MB w pamięci RAM + 32 MB w zram. Dlaczego warto kopiować? Ponieważ jądro buforuje strony, jak wyjaśniłem w mojej odpowiedzi. Oba zachowania nie są idealne. A kiedy pamięć nie jest dobrze kompresowalna, jest jeszcze gorzej.
Huygens

Nadal w fazie testów. Sądzę, że musi istnieć sposób na dostrojenie algorytmu buforowania używanego przez zram do zwolnienia skompresowanej strony, gdy jest ona kopiowana z powrotem do nieskompresowanej pamięci RAM.
Starszy Geek

Próbowałem kilka razy, aż do 2012 roku. W tym czasie mój komputer był ograniczony do 1 GB pamięci RAM i podczas przeglądania Internetu był boleśnie powolny (zwykle mam otwarte 10-50 kart). Ale od tego czasu nigdy więcej go nie użyłem. Mam więcej niż wystarczającą ilość pamięci RAM, że nie używam już wymiany. Korzystając z zram z Firefoksem, szybko zacząłem „zamieniać”, biorąc pod uwagę małą pamięć RAM. I szybko miałem niereagujący system z wieloma awariami. Bez zramu było boleśnie powolne, ale przynajmniej stabilne. Mój problem polegał na tym, że prawdopodobnie ciągle kompresował / dekompresował strony pamięci.
Huygens

Tak, moje wyniki były nieco podobne, w systemie z 8 GB byłem w stanie wymusić OOM, uruchamiając kilka maszyn wirtualnych podczas zadania kodowania. Czy masz jakieś doświadczenie z zswap? Wydaje się realną alternatywą w oparciu o to, co przeczytałem.
Starszy Geek

2

Krótka odpowiedź: vm.swappiness=100jest odpowiednią wartością dla zram (przynajmniej w Debian Stretch z Linuksem 4.9, uważam, że jest to najlepsza wartość)

Już vm.swappiness=100dla mnie testuję.

Myślę, że możesz zrobić prosty test, aby upewnić się, która wartość jest dla Ciebie najlepsza.

Stworzyłem również inny prosty program do testowania tego pytania. x Na mojej maszynie bardzo niska vm.swappinesswartość (np. vm.swappiness=1) spowoduje oczywisty problem z odpowiedzią.

O SwapCachedw /proc/meminfo:

Po pierwsze, spróbuj vm.page-cluster=0, może to zredukować niektóre bezużyteczne SwapCachedz zamiany.

SwapCached może przyśpieszyć zram tak samo jak urządzenie wymiany non-zram

SwapCached można ponownie użyć (bezpłatnie) w razie potrzeby:

./linux-4.9/mm$ grep -rn delete_from_swap_cache
memory-failure.c:715:   delete_from_swap_cache(p);
shmem.c:1115:       delete_from_swap_cache(*pagep);
shmem.c:1645:            * unaccounting, now delete_from_swap_cache() will do
shmem.c:1652:               delete_from_swap_cache(page);
shmem.c:1668:       delete_from_swap_cache(page);
vmscan.c:673:       __delete_from_swap_cache(page);
swap_state.c:137:void __delete_from_swap_cache(struct page *page)
swap_state.c:218:void delete_from_swap_cache(struct page *page)
swap_state.c:227:   __delete_from_swap_cache(page);
swapfile.c:947:         delete_from_swap_cache(page);
swapfile.c:987: delete_from_swap_cache(page);
swapfile.c:1023:            delete_from_swap_cache(page);
swapfile.c:1571:            delete_from_swap_cache(page);
./linux-4.9/mm$ 

0

Strony muszą zostać zamienione (na dysk), gdy pamięć jest pełna. Jeśli używasz pamięci do utworzenia miejsca do zamiany stron, gdy pamięć jest pełna, można by pomyśleć, że osiągnie cel, chyba że kompresja ma znaczenie (a wtedy naturalne byłoby skompresowanie pamięci bezpośrednio, zamiast przechodzenia przez nią zamiana). Chyba trzeba by to porównać, ponieważ komputery coraz szybciej kompresują i dekompresują w porównaniu do prędkości pamięci.


Przekonałem się, że sama wymiana wspierana przez zram jest bardzo pomocna, gdy w systemie kończy się pamięć. Uratowało mnie to kilka razy od całkowitego utknięcia w wymianie piekła i konieczności ponownego uruchomienia (analizuję duże zestawy danych, więc potrzebuję pamięci, wszystkie 24 GB). Zastanawiam się tylko, czy vm.swappinesswartość jest dostrojona dla wymiany opartej na dysku i czy powinienem ją zmienić, jeśli w większości będę korzystał z wymiany opartej na zram.
Ryan C. Thompson

1
„coraz szybciej”? Kompresja w locie działała lepiej niż bezpośrednie We / Wy dysku od ponad dekady (nigdy nie będzie szybsza niż dostęp do pamięci - nie o to chodzi)
symcbean

symcbean, zapomniałeś „w porównaniu do prędkości pamięci”. Gdzie jest różnica zdań?
Alexander

Myślę, że punktem symcbean jest to, że celem stron skompresowanych z pamięcią (zram) jest zastąpienie wymiany na nośnik fizyczny. Powodem, dla którego nie jest „naturalne bezpośrednie kompresowanie pamięci”, jest to, że aplikacje będą musiały ustalić, które części pamięci można skompresować i kiedy; podsystem VM jest znacznie łatwiejszym miejscem do wdrożenia tego. Obciążenia korzystające z zram mają strony, których nie ma w zestawie roboczym i można je łatwo skompresować.
Daniel Papasian
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.