Wie aktiviere und verwende ich den BFQ-Scheduler?

16

Ich habe gerade den Linux-Kernel 4.12 unter Ubuntu 17.04 mit ukuu (Ubuntu Kernel Update Utility https://doc.ubuntu-fr.org/ubuntu_kernel_upgrade_utility ) installiert .

Wenn ich die verfügbaren E / A-Scheduler überprüfe, kann ich anscheinend weder den BFQ noch den Kyber-E / A-Scheduler finden:

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

Wie verwende ich einen der neuen Scheduler in dieser Linux-Version?

Sidahmed
quelle

Antworten:

22

Ich bin nicht in Ubuntu, aber was ich in Fedora getan habe, kann Ihnen helfen.

BFQ ist ein BLK-MQ-Scheduler (Multi-Queue Block IO Queuing Mechanism). Sie müssen BLK-MQ also beim Booten aktivieren, Ihre / etc / default / grub-Datei bearbeiten und scsi_mod.use_blk_mq=1zu Ihrer hinzufügen GRUB_CMDLINE_LINUX. Dies ist meine grub-Datei als ein Beispiel:

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"

Danach müssen Sie Ihr Grub aktualisieren. Auf Fedora müssen wir verwenden sudo grub2-mkconfig -o /path/to/grub.cfg, was je nach Bootmethode variiert . Unter Ubuntu können Sie einfach Folgendes ausführen:

sudo update-grub

Starten Sie neu und wenn Sie dies bekommen:

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

Wahrscheinlich wurde Ihr Kernel mit BFQ als Modul kompiliert , und dies kann auch für Kyber der Fall sein.

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

Sie können es beim Booten hinzufügen, indem Sie eine /etc/modules-load.d/bfq.confDatei hinzufügen, die Folgendes enthält bfq.

Es ist wichtig zu beachten, dass die Aktivierung von "blk_mq" die Verwendung von nicht-blk_mq-Schedulern unmöglich macht, sodass Sie "noop cfq" und die Nicht-mq-Frist verlieren

Anscheinend unterstützt das blk_mq-Scheduling-System keine Lift-Flags in Grub. Stattdessen können udev-Regeln verwendet werden.

Erstellen Sie, /etc/udev/rules.d/60-scheduler.ruleswenn sie nicht vorhanden und fügen:

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

Wie hier gezeigt , können Sie bei Bedarf anhand des Attributs in udev-Regeln zwischen rotierenden (HDDs) und nicht rotierenden (SSDs) Geräten unterscheiden ATTR{queue/rotational}. Beachten Sie, dass Paolo Valente, BFQ-Entwickler, auf der LinuxCon Europe darauf hingewiesen hat, dass BFQ in Bezug auf Garantien mit geringer Latenz eine bessere Wahl sein kann als der noopoder die Planer. Dies deadlineist ein guter Ratschlag, um es auch für SSDs zu verwenden.

Paolos Vergleich: https://www.youtube.com/watch?v=1cjZeaCXIyM&feature=youtu.be

Speichern und neu laden und auslösen udev rules:

sudo udevadm control --reload
sudo udevadm trigger
RomuloPBenedetti
quelle
3
Ich möchte nur Folgendes erwähnen: Tun Sie dies nicht auf Computern mit Linux <4.15, von denen Sie erwarten, dass sie in der Lage sind, den RAM-Vorgang zu unterbrechen. <4.15 lässt alle E / A-Vorgänge beim Fortsetzen hängen, da ihnen die Fixes für die "sichere SCSI-Stilllegung" fehlen.
Ivan Kozik
Unter Kernel 4.14 kann es auch zu Problemen kommen, wenn die Aktivierung von blk-mq zu Beginn des Ladens des Kernels auf einigen Systemen ein "Hoppla" des Kernels zu verursachen scheint (dies ist keine vollständige Panik, sondern lediglich eine Null-Dereferenzierung innerhalb des Kernels). Sie könnten es verpassen, wenn Sie nicht danach suchen, aber wenn Sie paranoid sind, könnte es ein Zeichen dafür sein, dass etwas kaputt ist.
CR.
1
Ich würde vorschlagen, eine etwas genauere udev-Regel zu verwenden. Als ich das hier gezeigte ausprobierte, versuchte udev, den Scheduler für einige Geräte einzustellen, deren Namen mit diesem Muster übereinstimmen, aber keine SCSI-Blockgeräte, die den BFQ-Scheduler verwenden können. Die Regel, mit der ich am Ende fertig war, lautet: ACTION=="add|change", SUBSYSTEM=="block", DRIVERS=="sd|sr", ATTR{queue/scheduler}!="bfq", ATTR{queue/scheduler}="bfq"Es wird vermieden, dass Muster mit Gerätenamen abgeglichen werden, wodurch der Abgleich genauer wird. Partitionsgeräte werden nicht zugeordnet, da sie nicht über das Attribut "Warteschlange / Scheduler" verfügen.
Dan Moulding
3
Es ist auch wichtig zu beachten, dass die Kernel 4.15-4.16 unter einem ziemlich schweren Fehler leiden, bei dem das Aktualisieren des Partitionsschemas eines Laufwerks während der Verwendung von BFQ zu einer vollständigen E / A-Sperrung führen kann. Vgl .: lkml.org/lkml/2017/12/1/80
Glutanimate
1

Um die Antwort von RomuloPBenedetti zu erweitern :

Sie können mithilfe von PROGRAM=="/bin/grep -E -q '(^|[[:space:]])bfq($|[[:space:]])' '$sys$devpath/queue/scheduler'"in udev rule testen, ob der bfq scheduler tatsächlich auf einem bestimmten Gerät verfügbar ist . Dies wird effektiv ersetzen DRIVERS=="sd|sr"und nur nicht feuern, wenn man vergessen hatscsi_mod.use_blk_mq=1

Wissenswertes:

  • PROGRAM- Führen Sie ein Programm aus, um festzustellen, ob eine Übereinstimmung vorliegt. der Schlüssel ist wahr, wenn das Programm erfolgreich zurückkehrt; Wenn kein absoluter Pfad angegeben wird, wird erwartet, dass das Programm in / lib / udev abgelegt ist.
  • $sys- Der sysfs-Einhängepunkt ( /sys).
  • $devpath - Der Pfad des Geräts (/ devices / pci / ...).
Arano-Kai
quelle