Cómo configurar correctamente zram e intercambiar

9

Estoy configurando y compilando el nuevo kernel 3.0. Una de las ventajas que planeé usar durante algún tiempo (mediante parches) que se fusionó en 3.0 es zram.

¿Es posible configurar tanto el intercambio de disco duro como el intercambio de zram para que el zram se use primero y solo las páginas derramadas se coloquen en el intercambio real?

Maciej Piechotka
fuente

Respuestas:

8

Nota al margen: debido al bloqueo por CPU, es importante tener tantos zram-swaps como CPU (modprobe zram_num_devices = n zram) en lugar de uno solo grande. RTFM!

eMPee584
fuente
1
[cita requerida]? No puedo encontrar la recomendación en la documentación de Linux o Google.
Maciej Piechotka
Por defecto max_comp_streamsparece estar de 1acuerdo con la documentación . No he comprobado si ese parámetro existía en 2011, pero parece ser una mejor opción que varios archivos de intercambio.
Maciej Piechotka
1
Al probar con el paquete zram-configen Ubuntu (y probablemente debian), noté que la configuración predeterminada es 1 por núcleo o hilo (2 en un viejo E2140 de doble núcleo y 4 en un i3-3220)
Elder Geek
interesante, y esto también parece bastante claro de entender leyendo /etc/init/zram-config.conf
Aquarius Power
1
Esta nota al margen es obsoleta a partir de la versión 3.15 del kernel. Ahora puede tener múltiples subprocesos de compresión para un único zram grande.
Perkins
6

swapontener -pinterruptor que establece la prioridad. Puedo configurar:

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

O en / etc / fstab:

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

EDITAR: solo para una solución completa; esta línea puede ser útil como regla udev:

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

Seleccione cuántos dispositivos zram desea pasando

zram.num_devices=4

kernel parámetros o directamente al módulo (sin zram.). El valor predeterminado es 1. zram podrá utilizar tantos cpus como la cantidad de dispositivos que cree.

Prepare el dispositivo zram0, configure el tamaño en 1 GB.

echo 1000000000 > /sys/block/zram0/disksize

Alternativamente, puede hacerlo por regla udev. Crear intercambio en zram0

mkswap /dev/zram0

y habilitarlo con mayor prioridad que otros dispositivos de intercambio

swapon -p 32767 /dev/zram0
okias
fuente
¿Para qué versiones de kernel y distro estás escribiendo aquí?
Cbhihe
Para el registro, el proceder como aconseja en un escritorio Ubuntu 14.04.5 falla. En particular, cuando intento para establecer las prioridades de zram0y zram1hasta el valor 10 en una caja de 2 núcleos Intel T9300, me lanza con: swapon: /dev/zram0 or 1: swapon failed: Device or resource busy.
Cbhihe
1

Por alguna razón, parece haber mucha mala interpretación de https://www.kernel.org/doc/Documentation/blockdev/zram.txt

Establece claramente:

2) Establecer el número máximo de secuencias de compresión
Independientemente del valor pasado a este atributo, ZRAM siempre asignará múltiples secuencias de compresión, una por CPU en línea, permitiendo así varias operaciones de compresión simultáneas. El número de secuencias de compresión asignadas disminuye cuando algunas de las CPU se desconectan. Ya no existe el modo de flujo de compresión única, a menos que esté ejecutando un sistema UP o solo tenga 1 CPU en línea.

Para saber cuántas transmisiones están disponibles actualmente:

cat /sys/block/zram0/max_comp_streams

Pero hay un mito urbano común y persistente que dice que max streams es 1.

Claramente no es verdad.

Los dos sistemas operativos en los que zram ha demostrado ser eficaz con Chrome OS y Android en un solo dispositivo. También ajustan page-cluster:

page-clustercontrola el número de páginas hasta las cuales se leen páginas consecutivas desde el intercambio en un solo intento. Esta es la contraparte de intercambio de lectura de caché de página.
La consecutividad mencionada no es en términos de direcciones virtuales / físicas, sino consecutivas en el espacio de intercambio, lo que significa que se intercambiaron juntas.

Es un valor logarítmico: establecerlo en cero significa "1 página", establecerlo en 1 significa "2 páginas", establecerlo en 2 significa "4 páginas", etc. Cero desactiva completamente la lectura de intercambio.

El valor predeterminado es tres (ocho páginas a la vez). Puede haber algunos pequeños beneficios al ajustar esto a un valor diferente si su carga de trabajo requiere un intercambio intensivo.

Los valores más bajos significan latencias más bajas para las fallas iniciales, pero al mismo tiempo fallas adicionales y demoras de E / S para las fallas siguientes si hubieran sido parte de las páginas consecutivas que habría introducido la lectura anticipada.

                - de la documentación del kernel para/proc/sys/vm/*

Así que usa echo "0" > /proc/sys/vm/page-clusterpara forzar una sola página.

Mucho parece originarse en zram_config, el paquete debian / ubuntu que, por alguna razón, parece tener muy poca correlación con los documentos del núcleo para zram y ha generado una serie de susurros chinos que, en esencia, podrían estar completamente equivocados.

Con el intercambio de archivos, ¿crea una unidad de intercambio para cada núcleo? Tal vez eso pueda responder a sus preguntas. También para respaldar esto, Google Chrome OS y Android que emplean con éxito con el clúster de páginas anterior ya que no coinciden con un disco para que la latencia se pueda mejorar, dispositivos individuales.

También para un administrador de sistemas, ¿qué es el uso real de memoria real o el uso de memoria virtual? La mayoría de los ejemplos muestran la creación a través de disk_size e ignoran totalmente mem_limit. disk_size = tamaño de vm sin comprimir. mem_limit = límite real de huella mem.

Hace que la opción disk_size sea confusa, ya que es un tamaño máximo virtual que depende de la relación comp_alg y la sobrecarga del 0.1% del tamaño del disco cuando no está en uso y realmente es una estimación aproximada de mem_limit * (aproximadamente 2-4) de frugal vs optimismo.

zram_config ni siquiera verifica el uso anterior del servicio y lo sobrescribe, mientras que una simple verificación de la clase zram sys como se muestra a continuación.

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
fuente
0

Cuando habilita zram, automáticamente tendrá prioridad.

Para ubuntu 16.04: /usr/bin/init-zram-swapping

Puede editar ese archivo (haga una copia de seguridad primero), para reducir el ram real usado, cambié la línea de memoria a esto:

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