Linux bietet zahlreiche praktische Werkzeuge, die viel Arbeit sparen und für Komfort sorgen – sofern man sie denn kennt und einzusetzen weiß. Loadwatch gehört zu den weniger bekannten kleinen Helfern.
Hintergrunddienste sollen, wie der Name schon sagt, ihre Arbeit im Verborgenen erledigen, ohne dass sie den Anwender stören. Schießt eine leistungshungrige Anwendung da quer, muss man sich selbst helfen. Ein möglicher Ansatz dazu sähe wie folgt aus: Fällt die Systemlast über einen längeren Zeitraum unter einen definierten Wert, startet ein Daemon Aufgaben, die viel Rechenzeit benötigen und damit normalerweise die interaktive Arbeit am Rechner stören würden. Unter Linux lässt sich dieses Prinzip leicht mit einfachen Skripten und Anwendungen umsetzen.
Fremdgesteuert
Wichtige Systeminformationen, wie etwa die Daten zur aktuellen und bisherigen Rechnerauslastung, stellt Linux in Textform im Proc-Dateisystem unter /proc/ zur Verfügung. Zum Auslesen der Informationen benötigen Sie keine komplizierten Routinen: Auch als schlichter User können Sie von einem Terminal aus mit cat /proc/loadavg den Inhalt der jeweiligen Datei ausgeben (Listing 1). Die Bedeutung der einzelnen Zahlen schlüsselt die sehr ausführliche Manpage man 5 proc auf. Suchen Sie darin mit /loadavg nach der entsprechenden Passage, dann erfahren Sie, dass sich die ersten drei Angaben auf die Systemlast laufender (running, also mit R gekennzeichneter) Prozesse in den letzten 1, 5 und 15 Minuten beziehen.
Listing 1
$ cat /proc/loadavg 2.83 3.02 2.95 2/580 1462
Loadwatch [1] klinkt sich nun in diesen Bereich ein: Das Programm prüft regelmäßig die Höhe der Systemauslastung und hält, sobald die Last eine vorab definierte Schwelle überschreitet, einen zuvor ausgewählten Prozess an und aktiviert ihn erst nach dem Unterschreiten einer zweiten Schwelle automatisch wieder. Ein zweites Programm, lw-ctl, ermöglicht es, die von Loadwatch gesteuerten Prozesse von außen zu kontrollieren. Das Tool kommuniziert dazu mit Loadwatch und erlaubt so beispielsweise, gerade angehaltene Prozesse wieder zu starten oder laufende zu stoppen.
Praxisbeispiel
Als Beispiel soll Loadwatch nun bei Leerlauf des Rechners den Bildbetrachter Digikam [2] starten und die Datenbanken des Programms automatisch und im Hintergrund aktualisieren, insbesondere die pHash-Fingerabdrücke [3] für unscharfe Bildersuchen und -vergleiche, ohne dass diese mit viel Rechenarbeit verbundene Aktion den gesamten Rechner lahmlegt. Dazu richten Sie das Programm ein (siehe Kasten “Loadwatch installieren”) und rufen dann über Loadwatch Digikam auf.
Loadwatch installieren
Loadwatch findet sich bisher nur in den Paketquellen von Debian, aus denen sich auch Ubuntu bedient. Für alle anderen Distributionen müssen Sie das Programm selbst aus den Quelltexten übersetzen. Über das Paketverzeichnis von Debian [6] laden Sie die zwei für die Installation benötigten Dateien herunter: Das Archiv loadwatch_1.0+1.1alpha1.orig.tar.gz enthält den kompletten Quelltext der Anwendung, mit loadwatch_1.0+1.1alpha1-5.diff.gz erhalten Sie einen zusätzlichen Patch, der die Korrekturen für die letzten Alpha-Versionen enthält.
Speichern Sie beide Dateien in einem Verzeichnis Ihrer Wahl ab und wechseln Sie in einem Terminalfenster dorthin. Nun führen für die Installation die Anweisungen aus Listing 2 aus, die den Quellcode entpacken und den zugehörigen Patch einspielen. Zu guter Letzt führen Sie den üblichen Linux-Dreisatz aus, der das Programm kompiliert und am Ende nach /usr/local/ installiert.
Listing 2
$ tar xzf loadwatch_1.0+1.1alpha1.orig.tar.gz $ cd loadwatch-1.1 $ zcat ../loadwatch_1.0+1.1alpha1-5.diff | patch -p1 $ ./configure && make && sudo make install
Das entsprechende Startkommando müssen Sie dabei allerdings ein wenig anpassen, denn einfach nur den Startbefehl von Digikam anzufügen, triggert bereits eine zu hohe Last. Die Initialisierung von Digikam benötigt bereits so viel Rechenzeit, dass Loadwatch umgehend in den Warte-Modus wechselt und das Programm wieder stoppt (Listing 3). Daher müssen Sie beim Aufruf ein oberes Limit angeben, sodass Digikam (oder eine andere von Loadwatch gesteuerte Anwendung) nicht schon gleich beim Start ausgebremst wird (siehe Tabelle “Loadwatch-Optionen”). Eine Alternative wäre es, zunächst mittels lw-ctr die Anwendung im RUN-Modus zu starten und dann nach WATCH zu wechseln (siehe Abschnitt “Handsteuerung”).
Listing 3
$ loadwatch -- digikam Wed Dec 16 16:00:56 2015: load too high, stopping.
Aus Erfahrung wissen wir vom Testrechner, dass dieser bis zu einer Last von 2 vernünftig arbeitet. Um bei Engpässen ausreichend Kapazitäten zu gewährleisten, setzen wir das obere Limit bei einer Last von 1,8 an (2 minus 10 Prozent). Da es immer einen Moment dauert, bis die Systemlast nach einer Lastspitze absinkt, sollte das untere Limit nicht zu tief liegen: Anderenfalls behindert Loadwatch die Ausführung des Programms unnötig lange. Daher setzen wir die untere Lastgrenze auf einen Wert von 1.6. Um mit lw-ctr auf den Prozess zugreifen zu können, richten wir zudem einen Socket im Verzeichnis /tmp/ ein. Den entsprechenden Aufruf mit allen Optionen zeigt Listing 4.
Listing 4
$ loadwatch -l 1.6 -h 1.8 -u /tmp/tst.loadwatch -- digikam
Wie erhofft startet das Programm nun ohne größere Probleme. Die Systemlast erreicht dabei zunächst nicht die kritische Grenze, da die Schwelle hoch genug liegt, um einen Start ohne Unterbrechungen zu gewährleisten. Im Menüpunkt Extras von Digikam erhalten Sie nun unter Wartung die Möglichkeit, die Datenbanken separat und gezielt zu aktualisieren (Abbildung 1). Tatsächlich erweisen sich die gewählten Parameter für den Testrechner als optimal: Das Aktualisieren der Datenbanken verläuft völlig unauffällig im Hintergrund, ohne dass die dafür benötigte Zeit sich ins Endlose ausdehnt. Ein Blick ins Terminal zeigt den Wechsel zwischen den beiden Zuständen, zudem erscheinen hier auch Meldungen des von Loadwatch gesteuerten Programms (Listing 5).
Listing 5
[...] Wed Dec 16 17:00:55 2015: load low, continuing. Wed Dec 16 17:01:15 2015: load too high, stopping. Wed Dec 16 17:03:45 2015: load low, continuing. Wed Dec 16 17:03:55 2015: load too high, stopping. Wed Dec 16 17:04:55 2015: load low, continuing. digikam(8477)/digikam (core) Digikam::PreviewLoadingTask::execute: Cannot extract preview for "32bit_8040963.tif" digikam(8477)/digikam (core) Digikam::PreviewLoadingTask::execute: Cannot extract preview for "32bit_8040963.tif" Wed Dec 16 17:05:05 2015: load too high, stopping. [...]
Loadwatch-Optionen
| Option | Funktion |
|---|---|
-- |
Die Pseudo-Option trennt die Optionen des aufgerufenen Programms von denen für Loadwatch. Kollidieren die Optionen nicht, dürfen Sie den Trenner auch weglassen. |
-h Last |
Obere Lastgrenze, bei der Loadwatch das gesteuerte Programm stoppt. |
-l Last |
Untere Lastgrenze, bei der Loadwatch das Programm wieder fortsetzt. |
-d Verzögerung |
Intervall in Sekunden zwischen den einzelnen Abrufen der Systemlast. |
-n Kopien |
Anzahl an Kopien des kontrollierten Programms, die Loadwatch startet (Voreinstellung?*1). |
-u Socket |
Definiert die Socket-Datei zur Kommunikation mit lw-ctr. |
-p PID |
Koppelt Loadwatch über die PID des Prozesses nachträglich an ein bereits laufendes Programm. Das funktioniert nicht immer und führt in seltenen Fällen zu Problemen mit dem System, wie etwa zu blockierten Input-Devices. |
Handsteuerung
Manche Situationen machen es erforderlich, händisch in den durch Loadwatch ausgelösten Mechanismus einzugreifen. So lässt sich zum Beispiel das kontrollierte Programm nicht beenden, wenn es durch Loadwatch in einen Schlafzustand versetzt wurde. In diesen Fällen hilft das Kommando lw-ctr alias Loadwatch-Control weiter.
Zur Kommunikation benötigen Loadwatch und Lw-Ctr eine gemeinsame Schnittstelle in Form eines Sockets. Den initialisieren Sie wie in Listing 4 gezeigt bei Start von Loadwatch mittels der Option -u Socket. Bei jedem Aufruf von Lw-ctr geben Sie nun diesen Socket an. Als zweite Option teilen Sie Loadwatch-Control mit, was mit dem Prozess geschehen soll:
$ lw-ctr Socket Kommando
Auf diese Weise stoppen und starten Sie das Programm manuell beziehungsweise übergeben die Steuerung wieder an Loadwatch (siehe Tabelle “Anweisungen für Loadwatch-Control”). Ein Beispiel zeigt Listing 6.
Listing 6
$ lw-ctr /tmp/tst.loadwatch RUN
Anweisungen für Loadwatch-Control
| Kommando | Funktion |
|---|---|
RUN |
Startet das durch Loadwatch kontrollierte Programm. |
STOP |
Stoppt das durch Loadwatch kontrollierte Programm. |
WATCH |
Überlässt die Steuerung wieder Loadwatch, wobei die zuvor definierten Lastgrenzen weiterhin gelten. |
Amtshilfe
Bei Anwendungen wie Mediathek-View [4], die sich nicht gut über die Befehlszeile fernsteuern lassen, findet Loadwatch ein weiteres Einsatzgebiet. Um beispielsweise einen Live-Stream zu einer unglücklichen Sendezeit aufzunehmen, gehen Sie wie folgt vor: Starten Sie das Programm via Loadwatch mit so hohen Schwellen, dass es sicher unterbrechungsfrei läuft. Nun nimmt Mediathek-View alle erforderlichen Initialisierungen vor. Anschließend wählen Sie den Live-Stream und starten die Aufnahme.
Nun halten Sie die Ausführung des Programms mittels Loadwatch-Control wieder an (lw-ctr [...] STOP) und senden ihm durch sleep 1h && lw-ctr [...] START oder besser mithilfe eines At-Jobs [5] zur gewünschten Zeit das entsprechende START-Kommando zu. Im Fall von Mediathek-View setzt das Programm dann automatisch die Aufnahme des Live-Streams fort.
Fazit
Freilich ließen sich Anwendungen und Prozesse ähnlich wie mit Loadwatch aus einem Terminal heraus mit kill -stop PID und kill -cont PID oder grafischen Tools wie der Gnome-Systemüberwachung (Abbildung 2) unterbrechen und fortsetzen. Solche Ansätze beziehen jedoch nicht die Systemlast ein – Loadwatch dagegen setzt einen entsprechenden Mechanismus zur lastabhängigen Prozesssteuerung praxisgerecht um.

Abbildung 2: Mit Systemtools wie der Gnome-Systemüberwachung lassen sich ebenfalls Prozesse unterbrechen.
Eingangs fällt es beim Einsatz des Programms nicht ganz leicht, die passenden Parameter für die Lastgrenzen zu finden. Mit ein wenig Erfahrung lassen sich die Grenzen aber auf verschiedene Anwendungen übertragen. Für die Zukunft würden wir uns von den Entwicklern wünschen, dass sich die Grenzen nachträglich mithilfe von Lw-ctr anpassen ließen – dann gelänge das Einrichten eines Loadwatch-Jobs deutlich leichter.
Infos
[1] Loadwatch: https://tracker.debian.org/pkg/loadwatch
[2] Digikam: https://www.digikam.org
[3] pHash: http://www.phash.org
[4] Mediathek-View: http://zdfmediathk.sourceforge.net/
[5] Cron und At: Heike Jurzik, “Punktlandung”, LU 02/2006, S. 94, http://linux-community.de/9812
[6] Quelltext: https://packages.debian.org/source/sid/loadwatch






