Come impostare correttamente zram e swap


9

Sto configurando e compilando il nuovo kernel 3.0. Una delle chicche che ho pianificato di usare per qualche tempo (rattoppando) che è stata fusa in 3.0 è zram.

È possibile impostare sia l'hdd swap sia lo zram swap in modo che zram venga usato per primo e solo le pagine rovesciate vengano messe in atto?

Risposte:


8

Sidenote: a causa del blocco per CPU, è importante avere tanti zram-swap quanti CPU (modprobe zram_num_devices = n zram) invece di un singolo grande. RTFM!


1
[citazione necessaria]? Non riesco a trovare la raccomandazione nella documentazione di Linux o Google.
Maciej Piechotka,

Per impostazione predefinita, max_comp_streamssembra essere 1conforme alla documentazione . Non ho verificato se quel parametro esistesse nel 2011, ma sembra essere un'opzione migliore di più file di scambio.
Maciej Piechotka,

1
Testando con il pacchetto zram-configsotto Ubuntu (e probabilmente debian) ho notato che la configurazione di default è 1 per core o thread (2 su un vecchio dual core E2140 e 4 su un i3-3220)
Elder Geek,

interessante, e anche questo sembra abbastanza chiaro da capire leggendo /etc/init/zram-config.conf
Aquarius Power

1
Questo sidenote è obsoleto a partire dalla versione 3.15 del kernel. Ora puoi avere più thread di compressione per un singolo, grande zram.
Perkins,

6

swaponhanno un -pinterruttore che imposta la priorità. Posso impostare:

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

O in / etc / fstab:

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

EDIT: solo per una soluzione completa - tale riga può essere utile come regola udev:

KERNEL=="zram0", ACTION=="add", ATTR{disksize}="1073741824", RUN="/sbin/mkswap /$root/$name"

1

Seleziona il numero di dispositivi zram che desideri passando

zram.num_devices=4

ai parametri del kernel o direttamente al modulo (senza zram.). Il valore predefinito è 1. zram sarà in grado di utilizzare un numero di cpus pari al numero di dispositivi creati.

Prepara il dispositivo zram0, imposta le dimensioni su 1 GB.

echo 1000000000 > /sys/block/zram0/disksize

In alternativa puoi farlo con la regola udev. Crea swap su zram0

mkswap /dev/zram0

e abilitarlo con una priorità maggiore rispetto ad altri dispositivi di scambio

swapon -p 32767 /dev/zram0

Per quali versioni di kernel e distro stai scrivendo qui?
Cbhihe,

Per la cronaca, procedendo come consigliato su un Ubuntu desktop 14.04.5, non riesce. In particolare, quando si tenta di impostare le priorità di zram0e zram1di valore 10 su una scatola di 2 nuclei Intel T9300, mi butta con: swapon: /dev/zram0 or 1: swapon failed: Device or resource busy.
Cbhihe,

1

Per qualche motivo sembra esserci molta interpretazione errata di https://www.kernel.org/doc/Documentation/blockdev/zram.txt

Si afferma chiaramente:

2) Imposta il numero massimo di flussi di compressione
Indipendentemente dal valore passato a questo attributo, ZRAM alloca sempre più flussi di compressione - uno per CPU online - consentendo così diverse operazioni di compressione simultanee. Il numero di flussi di compressione allocati diminuisce quando alcune CPU diventano offline. Non esiste più una modalità di flusso a compressione singola, a meno che non si stia eseguendo un sistema UP o abbia solo 1 CPU online.

Per scoprire quanti stream sono attualmente disponibili:

cat /sys/block/zram0/max_comp_streams

Ma esiste un mito urbano comune e persistente secondo cui il flusso massimo è 1.

Chiaramente non è vero.

I due sistemi operativi in ​​cui zram ha dimostrato che Chrome OS e Android sono efficaci in un unico dispositivo. Inoltre modificano page-cluster:

page-clustercontrolla il numero di pagine fino a cui le pagine consecutive vengono lette dallo scambio in un solo tentativo. Questa è la controparte dello swap al readahead della cache della pagina.
La consecutività menzionata non è in termini di indirizzi virtuali / fisici, ma consecutivi nello spazio di scambio - ciò significa che sono stati scambiati insieme.

È un valore logaritmico: impostandolo su zero significa "1 pagina", impostandolo su 1 significa "2 pagine", impostandolo su 2 significa "4 pagine", ecc. Zero disabilita completamente la lettura dello swap.

Il valore predefinito è tre (otto pagine alla volta). Potrebbero esserci alcuni piccoli vantaggi nell'ottimizzare questo su un valore diverso se il carico di lavoro è ad alta intensità di scambio.

Valori più bassi significano latenze più basse per i guasti iniziali, ma allo stesso tempo guasti aggiuntivi e ritardi I / O per i guasti successivi se fossero stati parte delle pagine consecutive che readahead avrebbe portato.

                - dalla documentazione del kernel per/proc/sys/vm/*

Quindi usa echo "0" > /proc/sys/vm/page-clusterper forzare una singola pagina.

Molto sembra provenire da zram_config il pacchetto debian / ubuntu che per qualche ragione sembra avere una correlazione molto piccola con i documenti del kernel per zram e ha generato una serie di sussurri cinesi che in sostanza potrebbero essere completamente sbagliati.

Con lo scambio di file crei un'unità di scambio per ciascun core? Forse potrebbe rispondere alle tue domande. Anche per eseguire il backup di questo Google Chrome OS e Android che utilizzano con successo con il cluster di pagine sopra in quanto non corrisponde a un disco in modo che la latenza possa essere migliorata, singoli dispositivi.

Anche per un amministratore di sistema qual è l'importante utilizzo effettivo dei mem o l'utilizzo di mem vm? La maggior parte degli esempi mostra la creazione tramite disk_size e ignora totalmente mem_limit. disk_size = dimensione vm non compressa. mem_limit = limite di impronta mem effettivo.

Fa confondere la scelta di disk_size in quanto una dimensione massima virtuale dipende dal rapporto comp_alg e dal sovraccarico dello 0,1% della dimensione del disco quando non in uso ed è davvero una stima di mem_limit * (circa 2-4) di frugale vs ottimismo.

zram_config non verifica nemmeno il precedente utilizzo del servizio e lo sovrascrive, mentre un semplice controllo della classe s di zram come il seguente lo farà.

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
}

0

Quando abiliti zram, avrà automaticamente la priorità.

Per Ubuntu 16.04: /usr/bin/init-zram-swapping

Puoi modificare quel file (esegui prima un backup), per abbassare la RAM reale usata, ho cambiato la linea mem in questo:

mem=$(((totalmem / 4 / ${NRDEVICES}) * 1024))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.