Comment configurer correctement zram et swap

9

Je configure et compile un nouveau noyau 3.0. L'un des avantages que je prévoyais d'utiliser depuis un certain temps (en corrigeant) qui a été fusionné en 3.0 est zram.

Est-il possible de définir à la fois le swap hdd et le swap zram de sorte que le zram soit utilisé en premier et que seules les pages renversées soient placées dans le swap réel?

Maciej Piechotka
la source

Réponses:

8

Sidenote: en raison du verrouillage par processeur, il est important d'avoir autant d'échanges de zram que de CPU (modprobe zram_num_devices = n zram) au lieu d'un seul grand. RTFM!

eMPee584
la source
1
[citation requise]? Je ne trouve pas la recommandation dans la documentation Linux ou Google.
Maciej Piechotka
Par défaut, cela max_comp_streamssemble être 1conforme à la documentation . Je n'ai pas vérifié si ce paramètre existait en 2011, mais il semble être une meilleure option que plusieurs fichiers d'échange.
Maciej Piechotka
1
Test avec le paquet zram-configsous Ubuntu (et probablement Debian) J'ai remarqué que la configuration par défaut est 1 par cœur ou thread (2 sur un ancien E2140 dual core et 4 sur un i3-3220)
Elder Geek
intéressant, et cela semble également assez clair à comprendre en lisant /etc/init/zram-config.conf
Aquarius Power
1
Ce sidenote est obsolète depuis la version 3.15 du noyau. Vous pouvez maintenant avoir plusieurs threads de compression pour un seul et grand zram.
Perkins
6

swaponavoir un -pcommutateur qui définit la priorité. Je peux mettre en place:

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

Ou dans / etc / fstab:

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

EDIT: juste pour une solution complète - une telle ligne peut être utile comme règle udev:

KERNEL=="zram0", ACTION=="add", ATTR{disksize}="1073741824", RUN="/sbin/mkswap /$root/$name"
Maciej Piechotka
la source
1

Sélectionnez le nombre d'appareils Zram que vous souhaitez en passant

zram.num_devices=4

aux paramètres du noyau ou directement au module (sans zram.). La valeur par défaut est 1. zram pourra utiliser autant de processeurs que le nombre de périphériques que vous créez.

Préparez le périphérique zram0, définissez la taille sur 1 Go.

echo 1000000000 > /sys/block/zram0/disksize

Alternativement, vous pouvez le faire par la règle udev. Créer un échange sur zram0

mkswap /dev/zram0

et l'activer avec une priorité plus élevée que les autres appareils de swap

swapon -p 32767 /dev/zram0
okias
la source
Pour quelles versions de noyau et de distribution écrivez-vous ici?
Cbhihe
Pour mémoire, la procédure que vous conseillez sur un Ubuntu de bureau 14.04.5 échoue. En particulier, lorsque je tente de définir les priorités zram0et zram1à la valeur 10 sur une boîte noyaux Intel T9300 2, il me jette avec: swapon: /dev/zram0 or 1: swapon failed: Device or resource busy.
Cbhihe
1

Pour une raison quelconque, il semble y avoir beaucoup d'interprétation erronée de https://www.kernel.org/doc/Documentation/blockdev/zram.txt

Il indique clairement:

2) Définir le nombre maximal de flux de compression
Quelle que soit la valeur transmise à cet attribut, ZRAM allouera toujours plusieurs flux de compression - un par CPU en ligne - permettant ainsi plusieurs opérations de compression simultanées. Le nombre de flux de compression alloués diminue lorsque certains processeurs deviennent hors ligne. Il n'y a plus de mode de flux de compression unique, sauf si vous exécutez un système UP ou si vous n'avez qu'un seul processeur en ligne.

Pour savoir combien de flux sont actuellement disponibles:

cat /sys/block/zram0/max_comp_streams

Mais il existe un mythe urbain commun et persistant selon lequel le nombre maximal de flux est de 1.

Ce n'est manifestement pas vrai.

Les deux systèmes d'exploitation où zram a prouvé son efficacité Chrome OS et Android vous un seul appareil. Ils ont également peaufiné page-cluster:

page-clustercontrôle le nombre de pages jusqu'à lesquelles des pages consécutives sont lues depuis le swap en une seule tentative. Il s'agit de la contrepartie de swap à la lecture anticipée du cache de page.
La consécutivité mentionnée n'est pas en termes d'adresses virtuelles / physiques, mais consécutives sur l'espace d'échange - cela signifie qu'elles ont été échangées ensemble.

Il s'agit d'une valeur logarithmique - la mettre à zéro signifie "1 page", la mettre à 1 signifie "2 pages", la mettre à 2 signifie "4 pages", etc. Zero désactive complètement la lecture anticipée du swap.

La valeur par défaut est trois (huit pages à la fois). Il peut y avoir quelques petits avantages à régler cette valeur sur une valeur différente si votre charge de travail est gourmande en échanges.

Des valeurs plus faibles signifient des latences plus faibles pour les défauts initiaux, mais en même temps des défauts supplémentaires et des retards d'E / S pour les défauts suivants s'ils auraient fait partie de ces pages consécutives en lecture anticipée.

                - à partir de la documentation du noyau pour/proc/sys/vm/*

Donc, utilisez echo "0" > /proc/sys/vm/page-clusterpour forcer une seule page.

Beaucoup semble provenir de zram_config le paquet debian / ubuntu qui, pour une raison quelconque, semble avoir très peu de corrélation avec les documents du noyau pour zram et a engendré une série de chuchotements chinois qui, en substance, pourraient être complètement faux.

Avec l'échange de fichiers, créez-vous un lecteur d'échange pour chaque cœur? Cela pourrait peut-être répondre à vos questions. De plus, pour sauvegarder cela, Googles Chrome OS et Android qui utilisent avec succès le groupe de pages ci-dessus car il ne correspond pas à un disque afin que la latence puisse être améliorée, sur des appareils uniques.

Aussi pour un administrateur système, quelle est l'utilisation réelle de mem ou l'utilisation de mem vm? La plupart des exemples montrent la création via disk_size et ignorent totalement mem_limit. disk_size = taille vm non compressée. mem_limit = limite réelle de l'empreinte mem.

Cela rend le choix de disk_size déroutant car sa taille maximale virtuelle dépend du rapport comp_alg et de la surcharge de 0,1% de la taille du disque lorsqu'il n'est pas utilisé et est vraiment une estimation approximative de mem_limit * (environ 2 à 4) de frugal vs optimisme.

zram_config ne vérifie même pas l'utilisation du service précédent et écrase alors qu'une simple vérification de la classe sys zram comme ci-dessous le fera.

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
la source
0

Lorsque vous activez zram, il aura automatiquement la priorité.

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

Vous pouvez éditer ce fichier (faire une sauvegarde en premier), pour abaisser le vrai ram utilisé, j'ai changé la ligne mem en ceci:

mem=$(((totalmem / 4 / ${NRDEVICES}) * 1024))
VeganEye
la source