Como configurar corretamente o zram e trocar

9

Estou configurando e compilando o novo kernel 3.0. Um dos brindes que planejei usar por algum tempo (por meio de patches) que foram mesclados no 3.0 é o zram.

É possível definir a troca do disco rígido e a troca do zram para que o zram seja usado primeiro e apenas as páginas derramadas sejam colocadas na troca real?

Maciej Piechotka
fonte

Respostas:

8

Nota: devido ao bloqueio por CPU, é importante ter tantos zram-swaps quanto CPUs (modprobe zram_num_devices = n zram) em vez de um único grande. RTFM!

eMPee584
fonte
11
[citação necessária]? Não consigo encontrar a recomendação na documentação do Linux ou no Google.
Maciej Piechotka
Por padrão, max_comp_streamsparece estar de 1acordo com a documentação . Não verifiquei se esse parâmetro existia em 2011, mas parece ser uma opção melhor do que vários arquivos de troca.
Maciej Piechotka
11
Testes com o pacote zram-configno Ubuntu (e provavelmente debian) Observei que os padrões de configuração para um núcleo ou por rosca (2 sobre um velho E2140 núcleo duplo e 4 sobre uma i3-3220)
Elder totó
interessante, e isso também parece bem claro de entender lendo /etc/init/zram-config.conf
Aquarius Power
11
Esta nota lateral está obsoleta a partir da versão 3.15 do kernel. Agora você pode ter vários threads de compactação para um único zram grande.
Perkins
6

swapontem um -pinterruptor que define a prioridade. Eu posso configurar:

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

Ou em / etc / fstab:

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

EDIT: Apenas para uma solução completa - essa linha pode ser útil como regra do udev:

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

Selecione quantos dispositivos zram você deseja passando

zram.num_devices=4

aos parâmetros do kernel ou diretamente ao módulo (sem zram.). O valor padrão é 1. O zram poderá utilizar tantos cpus quanto o número de dispositivos que você criar.

Prepare o dispositivo zram0, defina o tamanho para 1 GB.

echo 1000000000 > /sys/block/zram0/disksize

Como alternativa, você pode fazer isso pela regra do udev. Criar swap no zram0

mkswap /dev/zram0

e habilitá-lo com maior prioridade do que outros dispositivos de troca

swapon -p 32767 /dev/zram0
okias
fonte
Para quais versões de kernel e distribuição você está escrevendo aqui?
precisa saber é o seguinte
Para o registro, procedendo como você aconselha em um desktop 14.04.5 Ubuntu, falha. Em particular, quando tento definir as prioridades de zram0e zram1para o valor de 10 em uma caixa 2 núcleos Intel T9300, ele me joga com: swapon: /dev/zram0 or 1: swapon failed: Device or resource busy.
precisa saber é o seguinte
1

Por alguma razão, parece haver muita interpretação errônea de https://www.kernel.org/doc/Documentation/blockdev/zram.txt

Afirma claramente:

2) Defina o número máximo de fluxos de compactação
Independentemente do valor passado para esse atributo, o ZRAM sempre alocará vários fluxos de compactação - um por CPUs on-line -, permitindo várias operações de compactação simultâneas. O número de fluxos de compactação alocados diminui quando algumas das CPUs ficam offline. Não há mais o modo de fluxo de compactação única, a menos que você esteja executando um sistema UP ou possua apenas 1 CPU online.

Para descobrir quantos fluxos estão disponíveis no momento:

cat /sys/block/zram0/max_comp_streams

Mas existe um mito urbano comum e persistente de que o máximo de fluxos é 1.

Claramente não é verdade.

Os dois sistemas operacionais em que o zram provou que o Chrome OS e o Android são eficazes em um único dispositivo. Eles também ajustam page-cluster:

page-clustercontrola o número de páginas até as quais páginas consecutivas são lidas do swap em uma única tentativa. Esta é a contrapartida de troca para o readahead do cache da página.
A consecutividade mencionada não é em termos de endereços virtuais / físicos, mas consecutiva no espaço de troca - isso significa que eles foram trocados juntos.

É um valor logarítmico - defini-lo para zero significa "1 página", defini-lo para 1 significa "2 páginas", defini-lo para 2 significa "4 páginas", etc. Zero desativa completamente o cabeçote de leitura de troca.

O valor padrão é três (oito páginas por vez). Pode haver alguns pequenos benefícios em ajustar isso para um valor diferente se a sua carga de trabalho exigir muito uso de trocas.

Valores mais baixos significam latências mais baixas para falhas iniciais, mas, ao mesmo tempo, falhas extras e atrasos de E / S para as seguintes falhas, se elas fizessem parte das páginas consecutivas que o readahead teria trazido.

                - da documentação do kernel para/proc/sys/vm/*

Portanto, use echo "0" > /proc/sys/vm/page-clusterpara forçar uma única página.

Muito parece ter se originado no zram_config do pacote debian / ubuntu que, por algum motivo, parece ter muito pouca correlação com os documentos do kernel do zram e criou uma série de sussurros chineses que, em essência, podem estar completamente errados.

Com a troca de arquivos, você cria uma unidade de troca para cada núcleo? Talvez isso possa responder às suas perguntas. Também para fazer backup disso, no Google Chrome OS e no Android, que empregam com êxito o cluster de páginas acima, pois não corresponde a um disco, para que a latência possa ser aprimorada, em dispositivos únicos.

Também para um administrador de sistemas, o que é importante no uso real de mem ou no uso de vm mem? A maioria dos exemplos mostra a criação via disk_size e ignora totalmente o mem_limit. disk_size = tamanho da vm descompactado. mem_limit = limite real de pegada de mem.

Ele meio que torna a escolha do tamanho do disco confusa, pois é um tamanho máximo virtual dependente da proporção comp_alg e da sobrecarga de 0,1% do tamanho do disco quando não está em uso, e é realmente uma estimativa do valor mem_limit * (aprox. 2 - 4) de frugal vs otimismo.

O zram_config nem verifica o uso do serviço anterior e sobrescreve, enquanto uma simples verificação da classe zram sys, como a abaixo, 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
}
Stuart Naylor
fonte
0

Quando você ativar o zram, ele terá prioridade automaticamente.

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

Você pode editar esse arquivo (faça um backup primeiro), para diminuir a RAM real usada, alterei a linha de mem para:

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