Runter vom Gas – Prozesse unter Linux drosseln

Eltern wissen es bereits und ein tüchtiger Linux Administrator kennt es ebenfalls: Grenzen setzen! Meist ist es zwar gewünscht Prozesse so schnell wie möglich wieder abzuschließen, manchmal möchte man aber doch etwas auf die Bremse treten und den einen oder anderen Prozess künstlich langsamer machen etwa, um nebenbei noch ungestört arbeiten zu können. Zum Glück gibt es unter Linux einige raffinierte Tools um genau das zu erledigen!

CPU-Zeit limitieren

Moderne Prozessoren werden zwar immer schneller und können dank mehrerer Kerne und Technologien wie Hyper-Threading mehrere Task parallel abarbeiten, gerade auf kleinen virtuellen Servern, schwachen Atom Systemen oder generell angestaubter Hardware kann es aber dazu kommen, dass ein einzelner Prozess die gesamte CPU-Zeit in Anspruch nimmt. Scannt man etwa mit clamav eine größere Datenmenge, kann der Rechner schon einmal einige Stunden mit 100% CPU-Auslastung arbeiten. Sollen nebenbei aber auch noch andere Aufgaben erfüllt werden, kann es zu teilweise beträchtlichen Verzögerungen kommen. Hier kommt Prozess-Priorisierung ins Spiel.

Seit nice und vertragt euch!

Um die Priorität eines Prozesses zu beeinflussen gibt es unter Linux das Programm nice. Mittels einer Zahl kann man angeben, wie „nett“ ein Prozess gegenüber anderen Prozessen sein sollte. Die Werte reichen dabei von -20 bis 19 wobei minus Werte den Prozess bevorzugen, während ihn positive Werte verlangsamen (daher der Prozess ist freundlicher gegenüber anderen). Einfache Benutzer können normalerweise nur positive Werte vergeben (ansonsten könnte ein Benutzer anderen Benutzern einfach alle Ressourcen wegschnappen), während der Benutzer root auch negative Werte setzen kann. Der Aufruf funktioniert dabei wie folgt:
nice -n 15 tar cvzf archiv.tgz filename
Mit diesem Befehl wird das Programm tar mit dem nice-Wert 15 gestartet. Da der Prozess dabei nur priorisiert und nicht limitiert wird, wird das System, falls es nichts Wichtigeres zu tun hat, dennoch alle Ressourcen dem einen Prozess geben. Anderes gesagt, ist das System nicht ausgelastet, wird der Prozess genauso schnell fertig sein, als würde er ohne nice-Wert laufen, kommt allerdings etwas Wichtigeres dazwischen, wird er vom System als unwichtig erkannt und gebremst.

Läuft der Prozess den man priorisieren möchte bereits und möchte man ihn nicht mehr unterbrechen, so bietet sich das Programm renice an. Damit ist es möglich, die Priorität auch nach dem Start des Programms noch zu beeinflussen. Der Aufruf ist ganz einfach, allerdings benötigt man neben dem nice-Wert auch noch die PID des Prozesses:
renice -n 8 -p 5748
Mit renice ist es außerdem möglich, alle Prozesse eines Nutzer gleichzeitig zu beeinflussen. Um etwa alle Prozesse des Benutzers root als wichtig zu markieren könnte man folgenden Befehl verwenden:
renice -n -12 -u root

Sowohl nice als auch renice sind meist standardmäßig installiert. Mehr Informationen finden sich etwa im Ubuntuusers Wiki.

cpulimit setzt härtere Limits!

Eine andere Möglichkeit die Ressource CPU zu schonen bietet das Programm cpulimit. Anders als mit nice wird hier die CPU-Zeit mit einem festen Prozentsatz limitiert, das heißt, auch wenn das System nichts zu tun hat, wird der Prozess nie mehr CPU-Zeit bekommen, als mit cpulimit vorgegeben. Nützlich ist diese Funktion etwa, wenn ein Notebook bei zu langer Dauerbelastung überhitzt und sich einfach ausschaltet oder wenn man verhindern möchte, dass ein fehlerhafter Prozess plötzlich die gesamten CPU-Ressourcen verschlingt. Kennt man die PID des Prozesses kann man cpulimit so aufrufen:
cpulimit -l 30 -p 10042
Der Wert hinter dem Parameter -l legt dabei die CPU-Rechenzeit in Prozent fest. Alternativ kann man cpulimit auch mit dem Namen des Programmes aufrufen, dass man beschränken möchte:
cpulimit -l 80 -e tar
Das Programm muss dabei weiterlaufen, also sperrt man es am Besten in eine screen-Sitzung oder schiebt es durch Anhängen eines „&“ in den Hintergrund.

cpulimit ist im Gegensatz zu nice meist separat aus den Repositorien der einzelnen Distributionen zu installieren. Mehr Informationen finden sich wieder im Ubuntuusers Wiki.

I/O-Ressourcen limitieren

Neben der CPU gibt es noch weitere Ressourcen die limitiert werden können, eine davon ist die I/O-Zeit, die etwa den Zugriff auf die Festplatte regelt. Wer schon einmal große Datenmengen unter Linux kopiert hat, kennt vielleicht das Problem des ruckelnden Mauszeigers. Mit dem Programm ionice kann man ähnlich wie mit nice eine Priorisierung vornehmen. Dabei gibt es vier verschiedene Werte:

Wert Name Beschreibung
0 None Standardwert, bei neuen Prozessen.
1 Real-Time Der I/O-Vorgang wird sofort ausgeführt und unterbricht eventuell sogar andere Prozesse.
2 Best-Effort Der I/O-Vorgang wird so schnell wie möglich durchgeführt, andere Prozesse haben ggf. jedoch Vorrang.
3 Idle Der I/O-Vorgang wird nur ausgeführt, wenn kein anderer Prozess auf Datenträger zugreifen möchte

Zusätzlich gibt es noch eine zweite Skala mit 7-Stufen, welche die Modi „Real-Time“ und „Best-Effort“ noch weiter unterteilt. Null ist innerhalb der Gruppe am Wichtigsten, während 7 sehr unwichtig ist. Der Aufruf des Programmes erfolgt somit so:
ionice -c 2 -n 5 -p 1089
Der Prozess mit der PID 1089 wird daher von nun an nach dem „Best-Effort“ Modus behandelt (-c 2) und ist innerhalb dieser Gruppe mit dem nice-Wert von 5 versehen (-n 5), also eher unwichtig. Weiters kann man mit ionice auch direkte einen Prozess starten und ihn priorisieren:
ionice -c 3 rsync

ionice ist schon ein sehr spezielles Programm zur Priorisierung und wohl nur in seltenen Fällen wirklich nützlich. Einige Distributionen nutzen es aber zum Beispiel um cron-Jobs wie man-db oder logrotate zu priorisieren. Das Programm findet man unter vielen Distributionen im Paket util-linux und ist normalerweise bereits im System vorhanden.

Bandbreite limitieren

Mit dem Programm trickle lässt sich sehr einfach die zur Verfügung stehende Bandbreite für ein Programm limitieren. Das ist etwa dann nützlich, wenn man große Datenmengen hochladen möchte, ohne dass dabei die Downloadrate zusammenbricht oder, wenn man große Downloads langsamer machen möchte, um weiterhin unbekümmert surfen zu können. Der Aufruf von trickle funktioniert dabei ganz einfach:
trickle -d 150 -u 40 rsync
Der Wert hinter -d gibt die maximale Downloadrate in kb an und -u die maximale Uploadrate ebenfalls in kb. Leider funktioniert trickle nur mit dynamisch gelinkten Programmen (glibc), eine einfache Möglichkeit herauszufinden ob ein Programm limitiert werden kann ist folgender Befehl:
ldd $(which filezilla) | grep libc.so
Ein weiterer Nachteil von trickle ist, dass man die Bandbreite im laufenden Betrieb nicht mehr verändern kann. Hat man ein Programm mit zu geringen / hohen Werten gestartet muss man es zuvor beenden, um es mit neuen Werten wieder starten zu können. Besser als mit trickle funktioniert die Bandbreitenbeschränkung mit QoS (Quality of Service) für das gesamte Netzwerk. Damit können einzelne Anwendungstypen priorisiert werden und somit dynamische Bandbreitenbeschränkungen etwa für FTP-Downloads festgelegt werden, damit wichtigere Programme wie Skype oder ein Browser immer genügend Ressourcen zur Verfügung haben. QoS würden den Rahmen dieses Artikels jedoch sprengen.

Trickle findet man in den Repositorien der meisten Linux-Distributionen. Weiter Infos findet man wieder im Ubuntuusers Wiki.

Die hier vorgestellten Programme stellen natürlich nur eine kleine Auswahl an Möglichkeiten dar, Ressourcen unter Linux für einzelne Nutzer zu beschränken. So gibt es etwa mit der Datei limits.conf die Möglichkeit recht detailliert einzelne Ressourcen für Benutzer oder Gruppen zu regeln oder mit Quota den maximalen Festplattenspeicher für jeden Nutzer zu limitieren.

  1. Paradiesstaub sagt:

    Hi

    Lustigerweise wollte ich gerade zu dem Thema bei AskUbuntu eine Frage stellen, nämlich:

    Wie lässt sich ein Programm immer mit einem niedrigeren ’nice-Wert‘ starten? Eclipse schwächelt auf meinem älteren Laptop etwas vor sich hin. Klar könnte ich mir meinen eigene .desktop-Datei schreiben und den Starter ‚Eclipse+‘ nennen, doch wie mach man es sauberer/für alle Nutzer? Wie muss ‚/usr/share/applications/eclipse.desktop‘ bearbeitet werden um ein Programm Standardmäßig mit einem niedrigeren ’nice-Wert‘ zu starten?

  2. schneida sagt:

    Grundsätzlich kannst du einfach bei „Exec“ und „TryExec“ einen nice-Befehl davor schreiben. Negative nice-Werte kann allerdings nur der Nutzer Root setzen, du müsstest also allen Benutzern die Eclipse laufen lassen wollen auch das Recht geben nice mit sudo auszuführen, was aber eigentlich eine Sicherheitslücke ist, da somit jeder Benutzer seine Programme mit höheren nice-Werten laufen lassen kann. Alternativ könntest du aber auch ein Script schreiben das mit root-Rechten läuft und alle paar Minuten jeden Prozess von eclipse einen neuen nice-Wert gibt, etwa einen cron-Job der alle 5 Minuten läuft…

  3. schneida sagt:

    Stimmt, indem man nicht nice als Befehl für sudo zulässt sondern ein Script in dem eclipse mit nice aufgerufen wird umgeht man das Problem mit der Sicherheitslücke!

  4. xabbu sagt:

    Hallo,

    bei cpulimit, genauer bein der Angabe der Prozentzahl, scheint dir ein Fehler in der Syntax unterlaufen zu sein.
    Entweder -l 30 oder –limit=30 aber nicht -l=30.

  1. Es gibt noch keine Trackbacks für diesen Post!