Como habilitar e usar o escalonador BFQ?

Acabei de instalar a versão 4.12 do kernel Linux no Ubuntu 17.04 usando ukuu (Utilitário de atualização do kernel do Ubuntu https://doc.ubuntu-fr.org/ubuntu_kernel_upgrade_utility ).

Acontece que, quando eu verifico os agendadores de I / O disponíveis, não consigo encontrar o BFQ nem o Kyber I / O planejador:

cat /sys/class/block/sda/queue/scheduler > noop deadline [cfq] 

Então, como usar um dos novos planejadores nesta versão do Linux?

Resposta

Não estou no Ubuntu, mas o que fiz no Fedora pode ajudá-lo.

O BFQ é um blk-mq (Multi-Queue Block IO Queuing Programador de mecanismo), então você precisa habilitar blk-mq no momento da inicialização, editar seu arquivo / etc / default / grub e adicionar scsi_mod.use_blk_mq=1 ao seu GRUB_CMDLINE_LINUX, este é meu arquivo grub, por exemplo:

GRUB_TIMEOUT=3 GRUB_DISTRIBUTOR="$(sed "s, release .*$,,g" /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=false GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="quiet vt.global_cursor_default=0 scsi_mod.use_blk_mq=1" GRUB_DISABLE_RECOVERY="true" 

Depois disso, você deve atualizar seu grub. No Fedora, temos que usar sudo grub2-mkconfig -o /path/to/grub.cfg, que varia dependendo do método de inicialização . No Ubuntu, você pode simplesmente executar:

sudo update-grub 

Reinicialize e, se conseguir:

cat /sys/block/sda/queue/scheduler [mq-deadline] none 

Provavelmente seu kernel foi compilado com BFQ como um módulo , e este pode ser o caso também para Kyber.

sudo modprobe bfq sudo cat /sys/block/sda/queue/scheduler [mq-deadline] bfq none 

Você pode adicioná-lo no momento da inicialização adicionando um /etc/modules-load.d/bfq.conf arquivo contendo bfq.

É importante notar que habilitar blk_mq torna impossível usar agendadores não blk_mq, então você perderá noop cfq e o não mq deadline

Aparentemente, o sistema de agendamento blk_mq não oferece suporte a flags de elevador no grub, regras udev podem ser usadas, com a vantagem de oferecer um controle mais granular.

Crie /etc/udev/rules.d/60-scheduler.rules se não existisse e adicione:

ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/scheduler}="bfq" 

Conforme indicado aqui se necessário, você pode distinguir entre rotaçãoa Dispositivos l (HDDs) e não rotacionais (SSDs) em regras udev usando o atributo ATTR{queue/rotational}. Esteja ciente de que Paolo Valente, desenvolvedor BFQ, apontou na LinuxCon Europe que o BFQ pode ser uma escolha melhor do que os programadores noop ou deadline em termos de garantias de baixa latência, o que é um bom conselho para usá-lo também para SSDs.

Comparação de Paolo: https://www.youtube.com/watch?v=1cjZeaCXIyM&feature=youtu.be

Salve-o, recarregue e acione udev rules:

sudo udevadm control --reload sudo udevadm trigger 

Comentários

  • Quero apenas observar: não ' faça isso em computadores com Linux < 4.15 que você espera poder suspender para ram; < 4.15 irá travar todo o IO na retomada porque falta o " quiesce SCSI seguro " correções.
  • Você também pode ter problemas no kernel 4.14, onde habilitar blk-mq parece dar um kernel " oops " logo no início g de carregar o kernel em alguns sistemas (' não é um pânico de ponto final, apenas uma desreferência nula dentro do kernel). Você pode perdê-lo se ' não estiver procurando por ele, mas se ' for paranóico, pode ser um sinal de que algo está quebrado.
  • Eu ' d sugiro o uso de uma regra udev um pouco mais precisa. Quando tentei o mostrado aqui, o udev tentou definir o agendador para alguns dispositivos cujos nomes correspondem a esse padrão, mas não ' t dispositivos de bloco SCSI que podem usar o agendador BFQ. A regra que terminei é esta: ACTION=="add|change", SUBSYSTEM=="block", DRIVERS=="sd|sr", ATTR{queue/scheduler}!="bfq", ATTR{queue/scheduler}="bfq" Evita correspondência de padrões com nomes de dispositivos, o que torna a correspondência mais precisa. Ele não ' corresponderá aos dispositivos de partição porque eles não ' t têm a " fila / planejador " atributo.
  • Também é importante notar que os kernels 4.15-4.16 sofrem de um bug bastante grave em que atualizar o esquema de partição de uma unidade durante o uso do BFQ pode levar a um bloqueio de E / S completo. Cf .: lkml.org/lkml/2017/12/1/80
  • Você também pode echo bfq > /sys/block/sda/queue/scheduler como root. (sudo não funcionou para mim no Ubuntu 18.04) Isso deve torná-lo efetivo imediatamente.

Resposta

Para extend great Resposta RomuloPBenedetti :

Você pode testar se o agendador bfq está realmente disponível em determinado dispositivo usando PROGRAM=="/bin/grep -E -q "(^|[[:space:]])bfq($|[[:space:]])" "$sys$devpath/queue/scheduler"" na regra udev.Isso efetivamente substituirá DRIVERS=="sd|sr" e não será acionado se alguém esquecer scsi_mod.use_blk_mq=1

Curiosidades:

  • PROGRAM – Executar um programa para determinar se há uma correspondência; a chave é verdadeira se o programa retornar com sucesso; Se nenhum caminho absoluto for fornecido, o programa deve residir em / lib / udev.
  • $sys – O ponto de montagem sysfs (/sys).
  • $devpath – O devpath do dispositivo (/ devices / pci / …).

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *