Auswahl eines Linux I / O Schedulers


82

Ich habe gelesen, dass es angeblich möglich ist, den E / A-Scheduler für ein bestimmtes Gerät auf einem laufenden Kernel zu ändern, indem Sie in / sys / block / [disk] / queue / scheduler schreiben. Zum Beispiel kann ich auf meinem System sehen:

anon@anon:~$ cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 

dass der Standard der völlig faire Warteschlangenplaner ist. Ich frage mich, ob es sinnvoll ist, alle vier Scheduler in meinen benutzerdefinierten Kernel aufzunehmen. Es scheint nicht sinnvoll zu sein, mehr als einen Scheduler zu kompilieren, es sei denn, der Kernel ist intelligent genug, um den richtigen Scheduler für die richtige Hardware auszuwählen, insbesondere den Noop-Scheduler für Flash-basierte Laufwerke und einen der anderen für einen herkömmlichen Festplatte.

Ist das der Fall?

Antworten:


109

Wie in dokumentiert /usr/src/linux/Documentation/block/switching-sched.txt, kann der E / A-Scheduler auf einem bestimmten Blockgerät zur Laufzeit geändert werden. Es kann zu einer gewissen Latenz kommen, da alle Anforderungen des vorherigen Schedulers gelöscht werden, bevor der neue Scheduler verwendet wird. Sie kann jedoch problemlos geändert werden, auch wenn das Gerät stark ausgelastet ist.

# cat /sys/block/hda/queue/scheduler
noop deadline [cfq]
# echo anticipatory > /sys/block/hda/queue/scheduler
# cat /sys/block/hda/queue/scheduler
noop [deadline] cfq

Idealerweise gibt es einen einzigen Scheduler, der alle Anforderungen erfüllt. Es scheint noch nicht zu existieren. Der Kernel verfügt häufig nicht über genügend Kenntnisse, um den besten Scheduler für Ihre Workload auszuwählen:

  • noop ist häufig die beste Wahl für speichergestützte Blockgeräte (z. B. RAM-Disks) und andere nicht rotierende Medien (Flash), bei denen der Versuch, E / A neu zu planen, eine Verschwendung von Ressourcen darstellt
  • deadline ist ein leichtgewichtiger Scheduler, der versucht, die Latenz stark zu begrenzen
  • cfq versucht, die systemweite Fairness der E / A-Bandbreite aufrechtzuerhalten

Die Standardeinstellung war anticipatorylange Zeit und wurde vielfach optimiert , aber in 2.6.33 (Anfang 2010) entfernt. cfqwurde vor einiger Zeit zum Standard, da die Leistung angemessen ist und Fairness ein gutes Ziel für Mehrbenutzersysteme (und sogar Einzelbenutzer-Desktops) ist. Für einige Szenarien - Datenbanken werden oft als Beispiele verwendet, da sie in der Regel bereits ihre eigenen besonderen Terminplanung und Zugriffsmuster haben, und sind oft die meisten wichtigen Dienst (so die Sorgen um Fairness?) - anticipatoryhat eine lange Geschichte von abstimmbar für die beste Leistung bei diesen Workloads und deadlineleitet alle Anforderungen sehr schnell an das zugrunde liegende Gerät weiter.


1
Tolle Infos, danke! Aber meine grundlegende Frage ist immer noch unbeantwortet: Wenn ich ein Flash-Laufwerk anschließe oder mein Netbook von einer Flash-Disk läuft, da es das Hauptlaufwerk ist, ist der Kernel intelligent genug, um Noop anstelle des Standard-CFQ auszuwählen? Oder liegt es ganz bei mir, es manuell zu machen?
Robert S. Barnes

3
Sie können den Kernel so konfigurieren, dass standardmäßig ein anderer Scheduler verwendet wird. Es wäre klug, automatisch noopauf nicht rotierenden Medien zu verwenden, aber der Kernel verfügt nicht über diese Funktionalität. Es erkennt zwar nicht rotierende Medien, ist jedoch nicht zuverlässig, da einige Festplatten sich selbst falsch melden, und es ist ohnehin noch nicht mit dem E / A-Scheduler-Code verbunden.
Ephemient

8
Sie können udev-Regeln hinzufügen, um den Scheduler basierend auf Geräteeigenschaften zu definieren, wie im Debian- Wiki ( wiki.debian.org/SSDOptimization#Low-Latency_IO-Scheduler ) # Terminplaner für nicht rotierende Festplatten festlegen ACTION == "add | change ", KERNEL ==" sd [az] ", ATTR {Warteschlange / Rotation} ==" 0 ", ATTR {Warteschlange / Scheduler} =" Frist "
Dani_l

@Dani_l Du solltest das erweitern und als Antwort hinzufügen.
Robert S. Barnes

1
Gibt es eine Möglichkeit, es zur Laufzeit für alle Laufwerke gleichzeitig zu ändern? Ebenso wird der Standard-Scheduler über den Kernel-Befehlszeilenparameter "lift" festgelegt. Vielen Dank.
SkyRaT

20

Es ist möglich, eine udev-Regel zu verwenden, um das System anhand einiger Merkmale des hw über den Scheduler entscheiden zu lassen.
Eine Beispiel-udev-Regel für SSDs und andere nicht rotierende Laufwerke könnte so aussehen

# set noop scheduler for non-rotating disks
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"

in einer neuen udev-Regeldatei (zB /etc/udev/rules.d/60-ssd-scheduler.rules). Diese Antwort basiert auf dem Debian-Wiki

Um zu überprüfen, ob SSD-Datenträger die Regel verwenden würden, können Sie im Voraus nach dem Triggerattribut suchen:

for f in /sys/block/sd?/queue/rotational; do printf "$f "; cat $f; done

Gute Antwort auf die Automatisierung der Erkennung nicht rotierender Medien und die Anwendung des E / A-Schedulers nur auf diese. Die Frist wird nicht nur für nicht drehende Medien empfohlen. Oracle empfiehlt den Deadline-Io-Scheduler für Datenbank-Workloads. Die Empfehlung von Oracle beruht wahrscheinlich auf der Tatsache, dass die Frist möglicherweise bessere synchrone Schreibvorgänge als andere E / A-Scheduler verarbeitet. Suchen Sie beispielsweise nach / sys / block / sdX / queue / iosched / writ_starved "Deadline" -Planer, der eingestellt werden kann (es gibt keinen solchen, der für Lesevorgänge eingestellt werden kann). Datenbanken weisen möglicherweise eine schlechte Leistung auf, wenn die synchronen Redo-Schreibvorgänge nicht schnell ausgeführt werden.
Tagar

7

Das Ziel, dass der Kernel verschiedene unterstützt, besteht darin, dass Sie sie ohne Neustart ausprobieren können. Anschließend können Sie Test-Workloads über das System ausführen, die Leistung messen und diese zum Standard für Ihre App machen.

Auf moderner Server-Hardware scheint nur die Noop-Hardware überhaupt nützlich zu sein. Die anderen scheinen in meinen Tests langsamer zu sein.


Wie ändert man es eigentlich zur Laufzeit?
Robert S. Barnes

Die Leistung von noop im Vergleich zu den anderen Schedulern hängt stark von der Hardware und der jeweiligen Last ab. Welche Festplatten, Controller und Tests haben Sie aus Neugier ausgeführt?
Ephemient

1
Ja, noop ist gut, wenn Sie intelligente RAID-Controller und andere Dinge haben, bei denen es mehr als der Kernel über die besten Zugriffsmuster weiß. Die Frist ist auch nicht schlecht.
Zan Lynx

1
Dies ist für mich eine reine Lernübung, in der ich versuche, den kleinstmöglichen und schnellsten Boot-Kernel zu konfigurieren, der alle Funktionen bietet, die ich auf meinem Laptop benötige. Ich habe sowohl in "Linux Kernel Development" als auch in "Essential Linux Device Drivers" nachgesehen und keine zufriedenstellende Antwort auf diese Frage gefunden, wie intelligent der Kernel bei der Auswahl eines Schedulers zur Laufzeit ist oder nur die Standardeinstellung verwendet, es sei denn Sie setzen es manuell auf etwas anderes?
Robert S. Barnes

Ephemient> das war auf DELL PERC-Controllern, auch auf DELL Powervault MD3000. Es schien besser als die Standardeinstellung (CFQ) für beide.
MarkR

0

Sie können dies beim Booten einstellen, indem Sie den Parameter "lift" zur Kernel-Cmdline hinzufügen (z. B. in grub.cfg).

Beispiel:

elevator=deadline

Dadurch wird "Deadline" zum Standard-E / A-Scheduler für alle Blockgeräte.

Wenn Sie den Scheduler nach dem Start des Systems abfragen oder ändern möchten oder einen anderen Scheduler für ein bestimmtes Blockgerät verwenden möchten , empfehlen wir , das Tool ioschedset zu installieren und zu verwenden , um dies zu vereinfachen.

https://github.com/kata198/ioschedset

Wenn Sie auf Archlinux sind, ist es in aur verfügbar:

https://aur.archlinux.org/packages/ioschedset

Einige Anwendungsbeispiele:

# Get i/o scheduler for all block devices
[username@hostname ~]$ io-get-sched
sda:    bfq
sr0:    bfq

# Query available I/O schedulers
[username@hostname ~]$ io-set-sched --list
mq-deadline kyber bfq none

# Set sda to use "kyber"
[username@hostname ~]$ io-set-sched kyber /dev/sda
Must be root to set IO Scheduler. Rerunning under sudo...

[sudo] password for username:
+ Successfully set sda to 'kyber'!

# Get i/o scheduler for all block devices to assert change
[username@hostname ~]$ io-get-sched
sda:    kyber
sr0:    bfq

# Set all block devices to use 'deadline' i/o scheduler
[username@hostname ~]$ io-set-sched deadline
Must be root to set IO Scheduler. Rerunning under sudo...

+ Successfully set sda to 'deadline'!
+ Successfully set sr0 to 'deadline'!

# Get the current block scheduler just for sda
[username@hostname ~]$ io-get-sched sda
sda:    mq-deadline

Die Verwendung sollte selbsterklärend sein. Die Tools sind eigenständig und erfordern nur Bash.

Hoffe das hilft!

EDIT: Haftungsausschluss, das sind Skripte, die ich geschrieben habe.


-3

Der Linux-Kernel ändert den IO-Scheduler zur Laufzeit nicht automatisch. Damit meine ich, dass der Linux-Kernel bis heute nicht automatisch einen "optimalen" Scheduler auswählen kann, abhängig von der Art des sekundären Speichergeräts. Während des Startvorgangs oder zur Laufzeit kann der E / A-Scheduler manuell geändert werden .

Der Standardplaner wird beim Start basierend auf dem Inhalt der Datei unter /linux-2.6 /block/Kconfig.iosched ausgewählt . Es ist jedoch möglich, den E / A-Scheduler zur Laufzeit zu ändern, indem echoein gültiger Schedulername in die Datei unter / sys / block / [DEV] / queue / scheduler eingegeben wird. Beispielsweise,echo deadline > /sys/block/hda/queue/scheduler


8
Ich verstehe nicht, warum diese Antwort so viele Abstimmungen verdient. Es ist eigentlich nicht falsch.
DepressedDaniel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.