[Tutorial] Configurar regras de I/O scheduler no Fedora 32

tallescg
editado August 2020 em Tutoriais

Introdução

Em meu antigo Notebook eu usava apenas um SSD Samsung EVO 120GB, e atualmente estou usando este SSD no Notebook da patroa, dividindo espaço com um HD de 500GB em um cady.
Neste cenário, forçar um único I/O scheduler global seja via o TLP ou via parâmetro do sistema fica inviável.

Definindo I/O scheduler automaticamente

Para solucionar isso e definir a configuração correta conforme o tipo de unidade de armazenamento precisamos criar as regras de I/O scheduler:

Edite/crie o arquivo 60-ioschedulers.rules:
sudo nano /etc/udev/rules.d/60-ioschedulers.rules
Adicione as linhas:
# set scheduler for NVMe

ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"

# set scheduler for SSD and eMMC

ACTION=="add|change", KERNEL=="sd[a-z]|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"

# set scheduler for rotating disks

ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"


Use Ctrl+O para salvar, confirme o nome do arquivo e use Ctrl+X para sair.

Para automatizar o processo descrito acima durante uma nova instalação, adicionei a seguinte linha no meu script pessoal ( Instalação Mínima KDE Plasma Fedora 32 ):

echo -e '# set scheduler for NVMe\nACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"\n# set scheduler for SSD and eMMC\nACTION=="add|change", KERNEL=="sd[a-z]|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"\n# set scheduler for rotating disks\nACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"' | tee -a /etc/udev/rules.d/60-ioschedulers.rules

Agora basta reiniciar para que as modificações fiquem ativas. Assim que o sistema subir vc pode para se certificar que as configurações estão ativas, use:
cat /sys/block/sdX/queue/scheduler(onde X é a letra das unidades instaladas)
No exemplo abaixo verifico meu SSD (sda) e o HD(sdb):

Entendendo as regras:

Para cada NVME o sistema usará o scheduler none;
Para cada SSD e eMMC com parâmetro rotational = 0, será usado o mq-deadline;
Para cada HDD com parâmetro rotational =1 será usado bfq;

Atenção:
Desde a versão 5.0, os Single-queue schedulers( NOOP, Deadline e CFQ) foram removidos do kernel, estando disponíveis os Multi-queue schedulers( None, mq-deadline, kyber e BFQ).
As configurações acima descritas foram testadas no Fedora 32 e podem ser diferentes para versões anteriores do sistema/kernel!!

Abraços!!

Comentários