[[Vorlage(Getestet, general)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Paketquellen_freischalten: Bearbeiten von Paketquellen] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(1)]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] [github:karelzak/util-linux/tree/master/schedutils:schedutils] {en} ist die Abkürzung für "scheduler utilities". Diese umfassen die drei Kommandozeilen-Programme [#chrt chrt], [#taskset taskset] und [#ionice ionice], die eine fortgeschrittene Prozesskontrolle ermöglichen. = Installation = Alle drei Programme befinden sich im vorinstallierten Paket {{{#!vorlage Paketinstallation util-linux }}} Man muss also nichts installieren, um diese Programme benutzen zu können. = chrt = Der Befehl ``chrt`` ermöglicht es, die Echtzeit-Priorität von Prozessen zu ändern. Für "normale" Prozesspriorisierung ist [:Shell/nice:nice] zuständig. == Priorität == Die Priorität liegt üblicherweise im Bereich bis 99. Letzteres ist die höchste Priorität. Es handelt sich letztlich um negative Werte (und so werden sie auch in Prozesslisten angezeigt), quasi in Fortsetzung der bis -19 reichenden normalen Prioritäten von nice. In chrt werden die Prioritäten aber vorzeichenlos angegeben. == Scheduler == chrt ermöglicht es, den Scheduler eines Prozesses zu ändern. Folgende Scheduler sind möglich: {{{#!vorlage Tabelle <-2 tableclass="zebra_start3" rowclass="titel" :>Scheduler von chrt +++ Option <:>Beschreibung +++ ``-o`` Other: der Standardscheduler, für Prozesse ohne Echtzeitanforderung. Der Standard für normale / die meisten Prozesse +++ `-i` Idle: Scheduler für sehr lange Prozesse, die im Hintergrund laufen sollen +++ ``-b`` Batch: Prozess läuft "batch-ähnlich" +++ ``-f`` [wikipedia:First_In_–_First_Out:Fifo]: eine simple Warteschleife ohne Zeitbegrenzung für die einzelnen Prozesse; kommt nur Realtime-Prozessen zum Einsatz +++ ``-r`` [wikipedia:Round_Robin_(Informatik):RoundRobin]: Fifo mit Zeitbegrenzung für die einzelnen Prozesse. Der Standard für Realtime-Prozesse }}} Detaillierte Informationen zu den verschiedenen Schedulern bietet die Manpage namens "sched_setscheduler". == Benutzung == Der Befehl chrt kann einem anderen Kommando vorausgestellt werden, um dieses mit entsprechender Priorität laufen zu lassen. {{{#!vorlage Befehl chrt PRIORITÄT BEFEHL ARGUMENTE }}} Für chrt sind in der Regel [:sudo:Root-Rechte] notwendig. Ausserdem ist die Manipulation laufender Prozesse möglich: {{{#!vorlage Befehl sudo chrt SCHEDULER -p PRIORITÄT PID }}} Beispiel: Setzen des Prozesses, der bei Verwendung eines [:Kernel#Echtzeitkernel:Echtzeitkernels] für die Behandlung von Interrupt 8 zuständig ist, auf 80, und Umstellung auf den Scheduler "Fifo": {{{#!vorlage Befehl sudo chrt -f -p 80 `pidof "IRQ-8"` }}} Auch Auskunft über einen Prozess ist möglich: {{{#!vorlage Befehl sudo chrt -p PID }}} Beispiel, in dem Informationen zum Prozess mit der PID 1805 abgerufen werden: {{{#!vorlage Befehl sudo chrt 1805 }}} {{{ pid 1805's current scheduling policy: SCHED_OTHER pid 1805's current scheduling priority: 0 }}} = taskset = Mit ``taskset`` ist es möglich, auf Systemen mit mehreren Prozessoren oder Kernen Prozesse gezielt bestimmten Prozessoren/Kernen zuzuweisen. Der Linux-Kernel verteilt die Prozesse zwar auch automatisch auf die vorhandenen Prozessoren, jedoch kann es unter Umständen sinnvoll sein, dies zu beeinflussen. == Nutzung == Die allgemeine Syntax von taskset lautet: {{{#!vorlage Befehl taskset OPTION MASKE BEFEHL #alternativ: taskset OPTION MASKE PID }}} wobei [:sudo:Root-Rechte] notwendig sind, wenn ein Prozess beeinflusst werden soll. Um den Status eines Prozesses abzufragen sind diese nicht notwendig. ``MASKE`` gibt dabei an, welcher Prozessor dem Befehl bzw. Prozess zugewiesen werden soll, wobei die Angaben standardmässig als Hexadezimalzahl erfolgt. Die Zählung der Prozessoren beginnt dabei bei 1 (und nicht bei 0, wie Linux das üblicherweise tut!). D.h. 01 entspricht dem 1. Prozessor, 02 dem zweiten, 03 dem 1.+2. usw. taskset kennt nur drei Optionen: {{{#!vorlage Tabelle <-2 rowclass="titel" :>Optionen von taskset +++ Option <:>Beschreibung +++ `-p ZAHL` oder `--pid ZAHL` `ZAHL` ist die PID des zu beeinflussenden Prozesses angeben +++ `-c ZAHL` oder `--cpu-list ZAHL` zu benutzende CPU(s)/Kerne im Listen-Format an- / ausgeben, die CPU-Nummern können durch Kommata getrennt werden +++ `-h` kurze Hilfe anzeigen }}} Im folgenden drei Beispiele für taskset. Der Befehl {{{#!vorlage Befehl taskset -p 123 }}} gibt aus, welche CPU(s) vom Prozess mit der PID 123 genutzt werden. Der Befehl {{{#!vorlage Befehl taskset -p 456 03 }}} legt fest, dass der Prozess mit der PID 456 den 1. und 2. Prozessor nutzen soll. Die gleiche Funktion erfüllt der Befehl {{{#!vorlage Befehl taskset -p 456 -c 1,2 }}} Für Ubuntu 18.04 hat sich die Syntax geändert. Der Befehl lautet nun: {{{#!vorlage Befehl taskset -cp 1,2 456 }}} Im letzten Beispiel {{{#!vorlage Befehl taskset -c 2 PROGRAMM }}} wird "PROGRAMM" gestartet und via taskset angewiesen, dass "PROGRAMM" ausschliesslich auf der der 2. CPU laufen soll. = ionice = Mit Hilfe von `ionice` kann die Priorität eines Prozesses, der das I/O Interface des Kernels nutzt, beeinflusst werden. == Nutzung == Die allgemeine Syntax von ionice lautet: {{{#!vorlage Befehl ionice OPTION BEFEHL }}} Wobei je nach Prozess [:sudo:Root-Rechte] benötigt werden. ionice kennt nur vier Optionen: {{{#!vorlage Tabelle <-2 rowclass="titel" :>Optionen von ionice +++ Option <:>Beschreibung +++ `-cZAHL` Hiermit wird die "scheduling class" festgelegt, also wann der Befehl abgearbeitet werden soll. Es gibt drei "scheduling classes": [[BR]] 1 = Real-Time: Der I/O Vorgang wird sofort ausgeführt, dafür werden ggf. sogar andere (laufende) Prozesse abgebrochen; das Verhalten kann im Detail mit der Option `-n` weiter beeinflusst werden.[[BR]] 2 = Best-Effort: Der I/O Vorgang wird "so bald wie möglich" durchgeführt, basierend auf der niceness des Prozesses. Auch hier kann das Verhalten mit der Option `-n` im Detail beeinflusst werden.[[BR]] 3= Idle: Der I/O Vorgang wird nur ausgeführt, wenn kein anderer Prozess I/O Zeit benötigt.[[BR]] +++ `-nZAHL` Dient zur detaillierten Einstellung von `-c1` und `-c2`, indem es die Priorität innerhalb der gewählten "scheduling class" festlegt. `ZAHL` kann einen Wert zwischen 0 und 7 haben, 0 hat die höchste Priorität. +++ `-pPID` Hiermit wird die PID eines laufendes Prozesse an ionice übergeben, für den man die "scheduling class" ändern bzw. abfragen möchte. +++ `-t` Fehler beim Ändern der Priorität werden ignoriert. Diese Option kann in Skripten nützlich sein. +++ `-h` Zeigt eine kurze Hilfe an }}} Im folgenden dazu drei kurze Beispiele: Der Befehl {{{#!vorlage Befehl ionice -p8 }}} zeigt die Priorität des Prozesse mit der PID 8 an. Lautet die Ausgabe {{{none: prio 0 }}} so ist für diesen Prozess keine Priorität vergeben. Der Befehl {{{#!vorlage Befehl ionice -c3 -p123 }}} ändert die I/O Priorität der Prozesses mit der PID 123 auf `3`, d.h. es wird ein "Idle-Prozess". Der Befehl {{{#!vorlage Befehl ionice -c2 -n0 Programm }}} startet "Programm" mit der scheduling class 2 = best effort, in dieser Klasse hat "Programm" aber die höchste Priorität (0). = Links = * [:Shell/Befehlsübersicht:] {Übersicht} Übersicht über verschiedene Shell-Befehle * [https://git.kernel.org/cgit/utils/util-linux/util-linux.git/tree/ Quelle util-linux (beinhaltet schedutils)] {en} #tag: Shell, System