Jak poprawnie skonfigurować zram i swap

9

Konfiguruję i kompiluję nowe jądro 3.0. Jednym z korzyści, które planowałem używać przez jakiś czas (przez łatanie), które zostały połączone w 3.0, jest zram.

Czy można ustawić zarówno HDD SWAP, jak i ZRAM SWAP, aby ZRAM był używany jako pierwszy i tylko rozlane strony były umieszczane w rzeczywistej zamianie?

Maciej Piechotka
źródło

Odpowiedzi:

8

Sidenote: ze względu na blokowanie na procesor, ważne jest, aby mieć tyle wymian zram-swap co procesory (modprobe zram_num_devices = n zram) zamiast jednego dużego. RTFM!

eMPee584
źródło
1
[wymagany cytat]? Nie mogę znaleźć rekomendacji w dokumentacji Linuksa ani w Google.
Maciej Piechotka
Domyślnie max_comp_streamswydaje się to 1zgodne z dokumentacją . Nie sprawdziłem, czy ten parametr istniał w 2011 roku, ale wydaje się, że jest to lepsza opcja niż wiele plików wymiany.
Maciej Piechotka
1
Testując pakiet zram-configpod Ubuntu (i prawdopodobnie Debianem) zauważyłem, że domyślna konfiguracja to 1 na rdzeń lub wątek (2 na starym dwurdzeniowym E2140 i 4 na i3-3220)
Elder Geek
ciekawe, i wydaje się to całkiem jasne do zrozumienia, czytając /etc/init/zram-config.conf
Aquarius Power
1
Ten sidenote jest przestarzały od wersji jądra 3.15. Możesz teraz mieć wiele wątków kompresji dla jednego, dużego zram.
Perkins,
6

swaponmają -pprzełącznik, który ustawia priorytet. Mogę skonfigurować:

swapon -p 32767 /dev/zram0
swapon -p 0 /dev/my-lvm-volume/swap

Lub w / etc / fstab:

/dev/zram0              none swap sw,pri=32767 0 0
/dev/my-lvm-volume/swap none swap sw,pri=0     0 0

EDYCJA: Tylko dla pełnego rozwiązania - taka linia może być pomocna jako zasada udev:

KERNEL=="zram0", ACTION=="add", ATTR{disksize}="1073741824", RUN="/sbin/mkswap /$root/$name"
Maciej Piechotka
źródło
1

Wybierz, ile urządzeń zram chcesz, przekazując

zram.num_devices=4

do parametrów jądra lub bezpośrednio do modułu (bez zram.). Wartość domyślna to 1. zram będzie mógł wykorzystać tyle procesorów, ile urządzeń utworzysz.

Przygotuj urządzenie ZRAM0, ustaw rozmiar na 1 GB.

echo 1000000000 > /sys/block/zram0/disksize

Alternatywnie możesz to zrobić według reguły udev. Utwórz swap na zram0

mkswap /dev/zram0

i włącz go z wyższym priorytetem niż inne urządzenia wymiany

swapon -p 32767 /dev/zram0
okias
źródło
Do jakich wersji jądra i dystrybucji piszesz tutaj?
Cbhihe,
Dla przypomnienia, postępowanie zgodnie z zaleceniami dotyczącymi Ubuntu na pulpicie 14.04.5 kończy się niepowodzeniem. W szczególności, gdy próbuję ustawić priorytety zram0i zram1do wartości 10 na 2 jądra Intel T9300 polu, to wyrzuca mi: swapon: /dev/zram0 or 1: swapon failed: Device or resource busy.
Cbhihe,
1

Z jakiegoś powodu wydaje się, że istnieje wiele błędnych interpretacji https://www.kernel.org/doc/Documentation/blockdev/zram.txt

Wyraźnie stwierdza:

2) Ustaw maksymalną liczbę strumieni kompresji
Niezależnie od wartości przekazanej do tego atrybutu, ZRAM zawsze przydzieli wiele strumieni kompresji - po jednym na procesory online - umożliwiając w ten sposób kilka jednoczesnych operacji kompresji. Liczba przydzielonych strumieni kompresji spada, gdy niektóre procesory stają się offline. Nie ma już trybu pojedynczej kompresji, chyba że używasz systemu UP lub masz tylko 1 procesor online.

Aby dowiedzieć się, ile strumieni jest obecnie dostępnych:

cat /sys/block/zram0/max_comp_streams

Ale istnieje powszechny, uporczywy mit miejski, że maksymalna liczba strumieni wynosi 1.

To po prostu nieprawda.

Dwa systemy operacyjne, w których zram udowodnił, że system operacyjny Chrome i Android to jedno urządzenie. Również poprawiają page-cluster:

page-clusterkontroluje liczbę stron, do których kolejne strony są odczytywane z zamiany w jednej próbie. 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.

                - z dokumentacji jądra dla/proc/sys/vm/*

Więc użyj, echo "0" > /proc/sys/vm/page-clusteraby wymusić pojedynczą stronę.

Wydaje się, że wiele pochodzi z zram_config pakietu debian / ubuntu, który z jakiegoś powodu wydaje się mieć bardzo małą korelację z dokumentami jądra dla zram i wyhodował serię chińskich szeptów, które w istocie mogą być całkowicie błędne.

Czy za pomocą wymiany plików tworzysz dysk wymiany dla każdego rdzenia? Może to może odpowiedzieć na twoje pytania. Również w celu wykonania kopii zapasowej Googles Chrome OS i Android, które z powodzeniem wykorzystują powyższy klaster stron, ponieważ nie pasuje on do dysku, dzięki czemu można poprawić opóźnienia, pojedyncze urządzenia.

Również dla sys-admin, co jest ważne faktyczne użycie mem lub użycie mem vm? Większość przykładów pokazuje tworzenie za pomocą disk_size i całkowicie ignoruje mem_limit. disk_size = nieskompresowany rozmiar VM. mem_limit = rzeczywisty limit powierzchni pamięci mem.

To sprawia, że ​​wybór rozmiaru dysku jest mylący, ponieważ jego wirtualny maksymalny rozmiar zależy od współczynnika comp_alg i narzutu wynoszącego 0,1% rozmiaru dysku, gdy nie jest używany, i tak naprawdę jest szacunkiem wartości mem_limit * (około 2–4) oszczędności optymizm.

zram_config nawet nie sprawdza wcześniejszego użycia usługi i zastępuje, podczas gdy proste sprawdzanie klasy zram sys, jak poniżej.

createZramSwaps () {
        totalmem=$(free|awk '/^Mem:/{print $2}')
        mem=$((( totalmem * MEM_FACTOR / 100 / BIG_CORES ) * 1024))

        # Check Zram Class created
        ZRAM_SYS_DIR='/sys/class/zram-control'
        if [ ! -d "${ZRAM_SYS_DIR}" ]; then
                modprobe zram
                RAM_DEV='0'
                echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                mkswap /dev/zram${RAM_DEV}
                swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
        else
                RAM_DEV=$(cat /sys/class/zram-control/hot_add)
                echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                mkswap /dev/zram${RAM_DEV}
                swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
        fi

        if [ "$BIG_CORES" -gt 1 ];then
                for i in $(seq $((BIG_CORES - 1))); do
                        RAM_DEV=$(cat /sys/class/zram-control/hot_add)
                        echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                        echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                        mkswap /dev/zram${RAM_DEV}
                        swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
                done
        fi
}
Stuart Naylor
źródło
0

Gdy włączysz zram, automatycznie będzie miał priorytet.

W przypadku Ubuntu 16.04: /usr/bin/init-zram-swapping

Możesz edytować ten plik (wykonać kopię zapasową na 1.), aby obniżyć używany prawdziwy pamięci RAM, zmieniłem linię mem na to:

mem=$(((totalmem / 4 / ${NRDEVICES}) * 1024))
VeganEye
źródło