Como ativar e usar o agendador BFQ?


16

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

O fato é que, quando verifico os agendadores de E / S disponíveis, não consigo encontrar o BFQ nem o agendador de E / S Kyber:

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

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

Respostas:


22

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

O BFQ é um agendador blk-mq (Mecanismo de enfileiramento de E / S de blocos com várias filas), portanto, você precisa ativar o blk-mq no momento da inicialização, editar seu arquivo / etc / default / grub e adicionar scsi_mod.use_blk_mq=1ao seu GRUB_CMDLINE_LINUX, este é o meu arquivo grub, como um 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, o que varia dependendo do método de inicialização . No Ubuntu, você pode simplesmente executar:

sudo update-grub

Reinicie e, se você obtiver isso:

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

Provavelmente, seu kernel foi compilado com o BFQ como um módulo , e esse também pode ser o caso do 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.confarquivo que contém bfq.

É importante observar que a ativação do blk_mq impossibilita o uso de agendadores que não sejam do blk_mq, para que você perca noop cfq e o prazo não mq

Aparentemente, o sistema de agendamento blk_mq não suporta sinalizadores de elevador no grub, as regras do udev podem ser usadas, com o bônus de oferecer um controle mais granular.

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

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

Como apontado aqui , se necessário você pode distinguir entre rotacionais (HDDs) e (SSDs) dispositivos não-rotacionais em udev regras usando o atributo ATTR{queue/rotational}. Esteja ciente de que Paolo Valente, colaborador BFQ, apontado na LinuxCon Europe que BFQ pode ser uma escolha melhor do que o noopou deadlineprogramadores em termos de garantias de baixa latência, o que faz um bom conselho para usá-lo para SSDs também.

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

Salve e recarregue e ative udev rules:

sudo udevadm control --reload
sudo udevadm trigger

3
Eu só quero observar: não faça isso em computadores com Linux <4.15 que você espera poder suspender-para-ram; <4,15 interromperão todas as E / S no currículo porque elas não possuem as correções "desativação segura de SCSI".
— Ivan Kozik

Você também pode ter problemas no kernel 4.14 onde ativar o blk-mq parece dar um "oops" ao kernel logo no início do carregamento do kernel em alguns sistemas (não é um pânico total, apenas uma desreferência nula dentro do kernel). Você pode sentir falta se não estiver procurando, mas se estiver paranóico, pode ser um sinal de que algo está quebrado.
— CR.

11
Sugiro usar 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 são dispositivos de bloco SCSI que podem usar o agendador BFQ. A regra que acabei com é a seguinte: ACTION=="add|change", SUBSYSTEM=="block", DRIVERS=="sd|sr", ATTR{queue/scheduler}!="bfq", ATTR{queue/scheduler}="bfq"evita a correspondência de padrões com os nomes dos dispositivos, o que torna a correspondência mais precisa. Ele não corresponde aos dispositivos de partição porque eles não têm o atributo "fila / agendador".
— Dan Molding

3
Também é importante notar que os kernels 4.15-4.16 sofrem de um bug bastante grave, ao atualizar o esquema de partição de uma unidade enquanto estiver usando o BFQ pode levar a um bloqueio completo de E / S. Cf .: lkml.org/lkml/2017/12/1/80
— Glutanimate

1

Para estender uma ótima resposta de RomuloPBenedetti :

Você pode testar se o agendador bfq está realmente disponível em um dispositivo específico usando a PROGRAM=="/bin/grep -E -q '(^|[[:space:]])bfq($|[[:space:]])' '$sys$devpath/queue/scheduler'"regra udev. Isso efetivamente substituirá DRIVERS=="sd|sr"e não disparará se você esquecerscsi_mod.use_blk_mq=1

Curiosidades:

  • PROGRAM- Execute um programa para determinar se há uma correspondência; a chave é verdadeira se o programa retornar com sucesso; Se nenhum caminho absoluto for fornecido, espera-se que o programa viva em / lib / udev.
  • $sys- O ponto de montagem sysfs ( /sys).
  • $devpath - O caminho do dispositivo (/ devices / pci / ...).
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.