Configuração de leitura antecipada de blockdev persistente

13

Tenho alguns SSDs montados em /dev/sda1 e /dev/sdb1 em um servidor SLES 11 SP2 e consegui ajustar a configuração de leitura antecipada com blockdev --setra :

sudo blockdev --setra 4096 /dev/sda
sudo blockdev --setra 4096 /dev/sdb
sudo blockdev --getra /dev/sda
4096
sudo blockdev --getra /dev/sdb
4096

Como faço para manter essa configuração na inicialização? Especificamente, existe uma configuração correspondente em sysctl.conf , ou terei de me conformar com um script rc para que isso aconteça?

    
por Banjer 05.04.2013 / 19:19

3 respostas

15

Eu sugiro que você use o udev para definir parâmetros para os discos SSD. Dessa forma, você pode configurar um agendador de filas específico mais apropriado para SSD, etc. Você também pode aplicar parâmetros apenas a alguns dos dispositivos, com base em vários parâmetros.

Você pode obter os atributos específicos necessários para corresponder aos seus dispositivos (por exemplo, o modelo de disco e o fabricante) executando:

udevadm info -a -p /sys/block/sda

e verificar todos os pares ATTR para o seu dispositivo de bloco.

Outro benefício é a capacidade de definir os parâmetros para discos conectáveis (por exemplo, em gabinetes ou compartimentos hotswap) e a configuração será aplicada a todos os novos dispositivos, desde que os parâmetros do dispositivo correspondam.

Aqui está um exemplo para aplicar um agendador específico para SSDs da Intel, seu valor de leitura desejado (4096 blocos = 2048 kb) e também aplicar um agendador diferente para todos os outros SSDs:

cat /etc/udev/rules.d/99-ssd.rules
# http://unix.stackexchange.com/a/71409/36574
# Setting specific kernel parameters for a subset of block devices (Intel SSDs)
SUBSYSTEM=="block", ATTRS{model}=="Intel SSDSC*", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{bdi/read_ahead_kb}="2048", ATTR{queue/scheduler}="deadline"
# for all other non-rotational block devices set a scheduler to 'noop' and readahead to 1024KB
SUBSYSTEM=="block", ATTR{queue/rotational}=="0", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{bdi/read_ahead_kb}="1024", ATTR{queue/scheduler}="noop"

Depois de salvar o arquivo, você pode testar se sua regra corresponderá ao dispositivo e o que o udev fará usando o udevadm:

udevadm test --action=add /sys/block/sda

Isso imprime todas as regras que o udev carrega, o que combina, o que não e quais decisões o udev toma quando o dispositivo é conectado.

Espero que isso ajude.

    
por 06.04.2013 / 02:13
10

Observe que a leitura antecipada pode ser definida pelo menos por /sys ( /sys/class/block/sda/queue/read_ahead_kb ), blockdev e hdparm ( hdparm -a ).

hdparm no Debian e seus derivados vem com um hdparm.conf que especifica os atributos por dispositivo a serem definidos no boot, e no hot-plug (via regras udev ).

Então você pode ter:

/dev/disk/by-id/my-disk... {
  read_ahead_sect = 4096
}

(é melhor usar IDs do que sda , o que pode mudar de uma inicialização para a próxima).

    
por 05.04.2013 / 21:30
-1

Não há nada correspondente em sysctl , então, sim, /etc/rc.local é uma maneira ou semelhante. E cuidado, - Eu pessoalmente notei que no Ubuntu, - essas mudanças vão ainda mais longe, mesmo depois de inicializar, então, pode até ter sentido usar crontab para mantê-lo.

    
por 05.04.2013 / 20:47