Nettigkeiten

MĂĽssen sich mehrere Anwendungen oder gar mehrere Nutzer die Ressourcen eines Rechners teilen, gilt es, RĂĽcksicht zu nehmen. Unix respektive Linux stellt dafĂĽr eine Reihe von Werkzeugen zur VerfĂĽgung.

vorlesen Druckansicht 2 Kommentare lesen
Lesezeit: 5 Min.
Von
  • Michael Riepe

Zwar besteht generell keine Gefahr, die virtuelle Umwelt im Rechner durch Raubbau zugrunde zu richten. Dennoch ist in einer Multiuser- oder Multitasking-Umgebung Mäßigung im Umgang mit begrenzten Ressourcen wie CPU-Zeit, Plattenplatz, Hauptspeicher oder I/O-Durchsatz geboten.

Erfordern ressourcenhungrige Programme keine Interaktion mit dem Nutzer, kann man sie nachts oder am Wochenende laufen lassen, wenn der Rechner wenig zu tun hat. Das Kommando at midnight etwa führt einen Job um Mitternacht aus. Selbstverständlich darf der Nutzer auch Datum und Uhrzeit übergeben. Die auszuführenden Befehle nimmt at von der Kommandozeile entgegen; alternativ kann der Anwender ein Skript erstellen und mit –f <skriptdatei> übergeben. Alle Ausgaben und Fehlermeldungen bekommt der Nutzer per E-Mail zugeschickt. Gibt der Job keine Daten aus, kann man mit –m eine Benachrichtigung erzwingen.

Üblicherweise verfügt at über mehrere Warteschlangen (Queues) mit unterschiedlichen Prioritäten. Voreingestellt ist a, die Queue mit der höchsten Priorität. Mit der Option –q <queue> kann der Nutzer eine andere wählen. Queue b ist für den Befehl batch reserviert. Er entspricht at –q b –m now. Je nach Betriebssystem gelten jedoch besondere Regeln: Linux etwa startet Batch-Jobs erst, wenn die Systemlast unter einen bestimmten Wert fällt; voreingestellt ist 0,8. Solaris hingegen begrenzt die Zahl der gleichzeitig laufenden Batch-Jobs.

Wie viel Rechenzeit ein Programm bekommt, hängt von seiner Priorität ab. Die schwankt allerdings: Nutzt ein Prozess sein Kontingent nicht voll aus, bekommt es vom System als „Prämie“ eine höhere Priorität. In den Genuss einer solchen Rückerstattung kommen vor allem interaktive Programme: Während sie auf Benutzereingaben warten, steigt ihre Priorität. Beim nächsten Tastendruck oder Mausklick kommen sie deshalb schneller wieder an die Reihe.

Langläufer, die überwiegend rechnen, stören mitunter trotzdem – vor allem, wenn sich mehrere gegenseitig in die Quere kommen. Wer etwa beim Kompilieren größerer Projekte gern ungestört MP3s hört oder im Web surft, kann mit nice make dem Übersetzer von vornherein eine niedrigere Grundpriorität zuweisen. Sie errechnet sich aus dem sogenannten Nice-Wert, der gewöhnlich zwischen -20 und 20 liegt.

„Nette“ Prozesse mit einem positivem Nice-Wert besitzen eine niedrige Priorität. Mit der Option –n <n> oder der klassischen Variante –<n> kann der Nutzer den Nice-Wert um <n> Punkte erhöhen; voreingestellt sind 10 Punkte. Nur der Superuser darf mit einem negativen Argument den Nice-Wert senken. Verschachtelte Aufrufe haben einen kumulativen Effekt: nice nice <befehl> etwa erhöht den Nice-Wert um 20 Punkte – sofern er nicht schon vorher den Maximalwert erreicht.

Wer vergessen hat, den Nice-Wert beim Programmstart zu ändern, kann das mit renice nachholen. renice –n 15 1234 etwa erhöht den Nice-Wert des Prozesses 1234 um 15 Punkte. Soll ein Shellskript seinen eigenen Nice-Wert erhöhen, kann der Programmierer renice –n 15 $$ schreiben. Ältere, nicht Posix-kompatible Versionen des Programms erwarten statt der Option –n den Nice-Wert als erstes Argument.

Mit den Optionen –p, –g und –u lässt sich renice auf Prozesse, Prozessgruppen oder alle Prozesse bestimmter Nutzer anwenden. Allerdings muss der Auftraggeber dazu berechtigt sein. In der Regel darf nur root die Prioritäten fremder Prozesse ändern.

Leider gieren manche Anwendungen mehr nach I/O-Durchsatz als nach Rechenzeit. Eine Änderung des Nice-Wertes hilft in dem Fall wenig. Da die Prozesse häufig auf die langsamere Festplatte warten müssen, steigert das „Bonussystem“ ihre Priorität ähnlich wie bei interaktiven Programmen. Ein langer Kopiervorgang etwa kann das Arbeiten mit interaktiven Programmen erheblich erschweren.

Zumindest Linux kann den Appetit I/O-intensiver Programme zügeln. Der mit Kernel-Version 2.6.15 eingeführte und drei Ausgaben später zum Default erklärte I/O-Scheduler „Completely Fair Queue“ (CFQ) erlaubt es nämlich, Prozessen eine I/O-Priorität zuzuweisen. Welchen Scheduler der Kernel etwa für die Festplatte /dev/sda verwendet, kann man in der zugehörigen Pseudodatei /sys/block/sda/queue/scheduler nachsehen beziehungsweise ändern – vorausgesetzt, das Pseudodateisystem sysfs ist wie üblich unter /sys gemountet.

Normalerweise berechnet der Kernel die I/O-Priorität aus dem Nice-Wert. Mit dem Kommando ionice –n <prio> <befehl> kann der Nutzer jedoch explizit eine Priorität zwischen 0 (hoch) und 7 (niedrig) auswählen. Übergibt er statt eines Befehls die Option –p <pid>, ändert sich die Priorität des genannten Prozesses.

Administratoren können zusätzlich mit ionice –c 1 Prozesse in die höher priorisierte Klasse „realtime“ befördern, deren Mitglieder vor allen anderen auf die Platten zugreifen dürfen. Allerdings ist dabei Vorsicht geboten: Gerät ein Programm mit Realtime-Priorität außer Kontrolle, kann es den Rechner komplett lahmlegen. (mr)