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 anticipatory
lange Zeit und wurde vielfach optimiert , aber in 2.6.33 (Anfang 2010) entfernt. cfq
wurde 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?) - anticipatory
hat eine lange Geschichte von abstimmbar für die beste Leistung bei diesen Workloads und deadline
leitet alle Anforderungen sehr schnell an das zugrunde liegende Gerät weiter.
noop
auf 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.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
in einer neuen udev-Regeldatei (zB
/etc/udev/rules.d/60-ssd-scheduler.rules
). Diese Antwort basiert auf dem Debian-WikiUm zu überprüfen, ob SSD-Datenträger die Regel verwenden würden, können Sie im Voraus nach dem Triggerattribut suchen:
quelle
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.
quelle
Sie können dies beim Booten einstellen, indem Sie den Parameter "lift" zur Kernel-Cmdline hinzufügen (z. B. in grub.cfg).
Beispiel:
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:
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.
quelle
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
echo
ein gültiger Schedulername in die Datei unter / sys / block / [DEV] / queue / scheduler eingegeben wird. Beispielsweise,echo deadline > /sys/block/hda/queue/scheduler
quelle