Linux-Befehl nice: Priorität festlegen, mit renice ändern und den CPU-Anteil bei Konkurrenz messen

Der Linux-Befehl nice legt den nice-Wert (-20 bis 19) fest, der bestimmt, wie viel CPU ein Programm beim Ausführen an andere abgibt. Auf einem AlmaLinux-9-Server wurden zwei Tasks an einen einzigen CPU-Kern gebunden und mit wechselnden nice-Werten gemessen: Aufgeteilt wurde nur, wenn sie um die CPU konkurrierten, und der Task mit nice 19 nutzte nur 1,4 %.
Bereits laufende Prozesse änderst du mit renice, und für das Zurückstecken beim Datenträger ist ionice zuständig. Für alle drei Befehle steht hier genau die Ausgabe, die sie bei der Ausführung als root und als normaler Benutzer lieferten.
1️⃣ Linux-Befehl nice: Wertebereich und CPU-Anteil bei Konkurrenz
Der nice-Wert ist eine Zahl, die festlegt, wie stark ein Prozess beim Aufteilen der CPU-Zeit zurücksteckt; möglich sind -20 bis 19. Programme laufen normalerweise mit 0, -20 kommt zuerst an die Reihe und 19 steckt am meisten zurück.
Man könnte meinen, eine größere Zahl komme zuerst dran, doch beim nice-Wert ist es umgekehrt. Der Linux-Scheduler gibt jedem nice-Wert ein Gewicht und verteilt die CPU-Zeit in diesem Verhältnis: nice 0 hat 1024, 10 hat 110 und 19 hat 15.
Zurückgesteckt wird nur, wenn um die CPU konkurriert wird. Gibt es eine freie CPU, läuft auch ein Task mit nice 19 ohne Wartezeit. Das ist wie bei den Vorrangsitzen im Bus: Sind sie frei, darf sich jeder setzen – Platz gemacht wird nur, wenn der Bus voll ist.
Die Gewichtstabelle ist das Array [sched_prio_to_weight] im Linux-Kernel-Quellcode [kernel/sched/core.c]; sie ist so festgelegt, dass jeder Schritt nach oben beim nice-Wert die CPU-Zeit um etwa 10 % senkt.
2️⃣ nice-Grundlagen: +10 ohne Zahlenangabe und Werte außerhalb des Bereichs
Hängst du einen Befehl an nice an, läuft dieser mit geändertem nice-Wert; ohne Befehl gibt nice den nice-Wert der aktuellen Shell aus.
nice0In den folgenden Beispielen gibt die gestartete bash ihren eigenen nice-Wert mit [ps -o ni=] aus. Ohne -n wird 10 zum aktuellen Wert addiert, mit -n 5 wird 5 addiert.
nice bash -c 'ps -o ni= -p $$' 10nice -n 5 bash -c 'ps -o ni= -p $$' 5Werte außerhalb des Bereichs werden ohne Fehler auf den Grenzwert gesetzt; -n 50 läuft also mit 19.
nice -n 50 bash -c 'ps -o ni= -p $$' 19Nur root kann einen Prozess mit einem negativen Wert vorziehen. Ein normaler Benutzer erhält die Warnung [cannot set niceness], und der Befehl läuft trotzdem mit nice 0.
# als normaler Benutzer
nice -n -5 bash -c 'ps -o ni= -p $$'nice: cannot set niceness: Permission denied
0# als root
nice -n -5 bash -c 'ps -o ni= -p $$' -5Auch Kindprozesse, die ein mit nice gestarteter Befehl startet, laufen mit demselben nice-Wert.
nice -n 7 bash -c 'sleep 1 & ps -o ni= -p $!' 7Startest du also ein Skript mit nice, steckt jeder Befehl darin zurück.
3️⃣ renice: nice-Wert eines laufenden Prozesses ändern
nice legt den Wert nur beim Start fest, einen bereits laufenden Prozess änderst du daher mit renice. Prüfe zuerst PID und aktuellen Wert in der NI-Spalte von top oder mit ps.
ps -o pid,ni,cmd -p 201643 PID NI CMD
201643 5 sleep 600renice -n 10 -p 201643201643 (process ID) old priority 5, new priority 10Wie die Ausgabe zeigt, addiert renice -n nicht zum aktuellen Wert, sondern setzt den angegebenen Wert: Heraus kommt 10, nicht 5 + 10 = 15. Das ist nicht wie ein Druck auf ▲ an der Fernbedienung der Klimaanlage, der eine Stufe höher schaltet, sondern wie das Einstellen der Wunschtemperatur auf 24 Grad.
Auch die offizielle util-linux-Dokumentation beschreibt -n als absoluten Wert; das Addieren übernimmt in neueren Versionen die Option [--relative]. Im getesteten util-linux 2.37.4 gab es diese Option noch nicht.
Ein normaler Benutzer kann den Wert seiner eigenen Prozesse nur erhöhen und einen einmal erhöhten Wert nicht wieder senken.
# als normaler Benutzer
renice -n 10 -p 201649201649 (process ID) old priority 0, new priority 10renice -n 5 -p 201649renice: failed to set priority for 201649 (process ID): Permission deniedroot kann ihn auch senken; im selben Test wurde 10 direkt auf 3 geändert.
🔲 Simulator für nice · renice
Im Simulator unten, angemeldet als normaler Benutzer, kannst du nice und renice selbst eingeben und sehen, wie sich der nice-Wert ändert.
4️⃣ CPU-Anteil bei Konkurrenz gemessen: nice 0 vs. 0·10·19
Ein höherer nice-Wert macht einen Task nicht immer langsamer. Sein Anteil sinkt nur, wenn er mit einem anderen Task um dieselbe CPU konkurriert.
Zwei Tasks wurden an einen einzigen CPU-Kern gebunden (taskset) und führten gleichzeitig das folgende Skript aus, das 5 Sekunden lang hochzählt. Je höher die Zahl, desto mehr CPU-Zeit hat der Task bekommen.
#!/bin/bash
end=$((SECONDS+5)); n=0
while [ $SECONDS -lt $end ]; do n=$((n+1)); done
echo $nDas Skript erhöht n so lange um 1, bis 5 Sekunden vergangen sind, und gibt dann den letzten Wert aus.
Zwei nice-0-Tasks teilten sich die Zeit zur Hälfte, nice 10 bekam etwa 10 % und nice 19 nur 1,4 %. Das entspricht den aus den Kernel-Gewichten berechneten Verhältnissen (1024 : 110 ergibt 90,3 : 9,7, 1024 : 15 ergibt 98,6 : 1,4).
Allein auf demselben Kern erreichte der nice-19-Task in 5 Sekunden etwa 650.000 bis 1.140.000 Zählungen. Ohne Konkurrenz nutzt auch nice 19 die CPU voll; die Serverlast (Load Average) lag während des Tests bei 3 bis 5.
5️⃣ ionice: beim Datenträger zurückstecken und den Scheduler prüfen
nice regelt nur den CPU-Anteil; Aufgaben, die lange auf den Datenträger lesen und schreiben – etwa Backups –, lassen mit ionice auch beim Datenträger anderen den Vortritt. Mit -c3 (idle) werden sie nur bedient, wenn kein anderes Programm den Datenträger nutzt.
ionice -c3 bash -c 'ionice -p $$'idleionice -p $$none: prio 0Ein Prozess ohne Angabe wird als [none] angezeigt; laut Kernel-Dokumentation gilt er als best-effort, und seine Priorität wird aus dem CPU-nice-Wert berechnet.
ionice-Klassen wirken nur, wenn der Datenträger-Scheduler sie unterstützt; die Kernel-Dokumentation nennt bfq und mq-deadline als unterstützte Scheduler. Der in eckigen Klammern angezeigte ist der aktuell genutzte Scheduler.
cat /sys/block/nvme0n1/queue/scheduler[none] mq-deadline kyber bfqDie NVMe-Platte des Testservers nutzt [none]; laut offizieller Dokumentation kann ionice dort also wirkungslos sein – die Wirkung wurde nicht eigens gemessen. Den Namen des Datenträgers zeigt lsblk.
6️⃣ Wo nice sinnvoll ist: Backups · Cron · wp-cli
nice gehört vor Aufgaben, die lange dauern, aber nicht eilig sind. Das Komprimieren von Backups beansprucht CPU und Datenträger zugleich, daher setzt du nice und ionice zusammen.
nice -n 19 ionice -c3 tar czf backup.tgz /home/exampleBremst eine bereits laufende Aufgabe den Server aus, suchst du in top die PID und erhöhst den Wert mit renice; bei täglich laufenden Cron-Jobs setzt du nice vor den Befehl.
0 3 * * * nice -n 10 /usr/local/bin/backup.shFührst du auf einem WordPress-Server große wp-cli-Aufgaben wie Suchen und Ersetzen oder das Neuerzeugen von Bildern mit nice -n 10 aus, bekommt bei ausgelasteter CPU zuerst php-fpm die CPU, das die Besucheranfragen bearbeitet.
nice -n 10 wp media regenerate --yesUmgekehrt erhöhst du den nice-Wert von php-fpm oder dem Webserver selbst nicht. Stecken die Prozesse zurück, die Besuchern antworten, reagieren Seiten bei ausgelasteter CPU langsamer.
🔢 FAQ & empfohlene Inhalte









ℹ️ Affiliate-Hinweis
Die Inhalte dieser Website enthalten Affiliate-Links. Kauft ein Besucher über einen dieser Links ein Produkt oder eine Dienstleistung, erhält die Website vom Verkäufer eine Provision. Der Betrag, den der Käufer zahlt(bei Aktionsrabatten sinkt er ↓), steigt dadurch nicht. Angegebene Preise, Rabatte und Lagerbestände entsprechen dem Stand bei Erstellung und können abweichen; prüfe sie daher vor dem Kauf beim Verkäufer. Produkte werden nach eigenen Kriterien ausgewählt und bewertet, und Provisionen beeinflussen weder die Reihenfolge noch den Inhalt der Bewertungen.
