Как включить и использовать планировщик BFQ?

16

Я только что установил ядро ​​Linux версии 4.12 в Ubuntu 17.04, используя ukuu (Утилита обновления ядра Ubuntu https://doc.ubuntu-fr.org/ubuntu_kernel_upgrade_utility ).

Дело в том, что когда я проверяю доступные планировщики ввода-вывода, я не могу найти ни BFQ, ни планировщик ввода-вывода Kyber:

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

Так как же использовать один из новых планировщиков в этой версии Linux?

Sidahmed
источник

Ответы:

22

Я не в Ubuntu, но то, что я сделал в Fedora, может вам помочь.

BFQ - это планировщик blk-mq (механизм очередей блоков многократного ввода-вывода), поэтому вам нужно включить blk-mq во время загрузки, отредактировать файл / etc / default / grub и добавить scsi_mod.use_blk_mq=1в него GRUB_CMDLINE_LINUX, это мой файл grub, так как пример:

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"

После этого вы должны обновить ваш grub. На Fedora мы должны использовать sudo grub2-mkconfig -o /path/to/grub.cfg, который варьируется в зависимости от метода загрузки . В Ubuntu вы можете просто запустить:

sudo update-grub

Перезагрузитесь, и если вы получите это:

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

Возможно, ваше ядро ​​было скомпилировано с BFQ в качестве модуля , и это может быть в случае с Kyber.

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

Вы можете добавить его во время загрузки, добавив /etc/modules-load.d/bfq.confфайл, содержащий bfq.

Важно отметить, что включение blk_mq делает невозможным использование планировщиков не blk_mq, поэтому вы потеряете noop cfq и крайний срок не mq

Очевидно, система планирования blk_mq не поддерживает флаги лифта в grub, вместо этого можно использовать правила udev с дополнительным преимуществом более детального управления.

Создайте, /etc/udev/rules.d/60-scheduler.rulesесли он не существует, и добавьте:

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

Как указано здесь, при необходимости вы можете различать ротационные (HDD) и невращающиеся (SSD) устройства в правилах udev, используя атрибут ATTR{queue/rotational}. Помните, что Paolo Valente, разработчик BFQ, указал в LinuxCon Europe, что BFQ может быть лучшим выбором, чем планировщики noopили deadlineпланировщики, с точки зрения гарантий низкой задержки, что делает хороший совет использовать его и для твердотельных накопителей.

Сравнение Паоло: https://www.youtube.com/watch?v=1cjZeaCXIyM&feature=youtu.be

Сохраните его, перезагрузите и запустите udev rules:

sudo udevadm control --reload
sudo udevadm trigger
RomuloPBenedetti
источник
3
Я просто хочу отметить: не делайте этого на компьютерах с Linux <4.15, которые, как вы ожидаете, могут быть приостановлены; <4.15 повесит все операции ввода-вывода при возобновлении, поскольку в них отсутствуют исправления «безопасного отключения SCSI».
Иван Козик
У вас также могут возникнуть проблемы с ядром 4.14, когда включение blk-mq, по-видимому, дает ядру «упс» в самом начале загрузки ядра в некоторых системах (это не полная паника остановки, а просто нулевая разыменование внутри ядра). Вы можете пропустить это, если не ищете, но если вы параноик, это может быть признаком того, что что-то сломано.
кр.
1
Я бы предложил немного более точное правило udev. Когда я попробовал тот, который показан здесь, udev попытался установить планировщик для некоторых устройств, имена которых соответствуют этому шаблону, но не являются блочными устройствами SCSI, которые могут использовать планировщик BFQ. Правило, с которым я закончил, таково: ACTION=="add|change", SUBSYSTEM=="block", DRIVERS=="sd|sr", ATTR{queue/scheduler}!="bfq", ATTR{queue/scheduler}="bfq"оно позволяет избежать сопоставления с именами устройств, что делает сопоставление более точным. Он не будет соответствовать устройствам разделов, потому что они не имеют атрибута «очередь / планировщик».
Дэн Молдинг
3
Также важно отметить, что ядра 4.15-4.16 страдают от довольно серьезной ошибки, когда обновление схемы разбиения диска при использовании BFQ может привести к полной блокировке ввода-вывода. См .: lkml.org/lkml/2017/12/1/80
Glutanimate
1

Чтобы выразить отличный ответ РомулоПБенедетти :

Вы можете проверить, доступен ли планировщик bfq на конкретном устройстве, используя PROGRAM=="/bin/grep -E -q '(^|[[:space:]])bfq($|[[:space:]])' '$sys$devpath/queue/scheduler'"правило udev. Это фактически заменит DRIVERS=="sd|sr"и просто не сработает, если кто-то забылscsi_mod.use_blk_mq=1

Общая информация:

  • PROGRAM- выполнить программу, чтобы определить, есть ли совпадение; ключ верен, если программа успешно возвращается; Если абсолютный путь не указан, ожидается, что программа будет жить в / lib / udev.
  • $sys- Точка монтирования sysfs ( /sys).
  • $devpath - Devpath устройства (/ devices / pci / ...).
Арано-кай
источник