Lastauswertungen von Linux Systemen - das hört sich recht trocken und langweilig an - ist immens wichtig, um zu ermitteln, ob das aktuell benutzte System schon an Lastgrenzen stößt, oder bald stoßen wird. Um solche Flaschenhälse (hoffentlich) rechtzeitig zu erkennen, gibt es eine ganze Latte an Tools: top, htop, ntop, munin, usw.
Das Problem bei diesen Tools: Entweder benötigen Sie eine doch recht umfangreiche Config, öffnen Netzwerk-Ports um die Daten an zentrale Systeme zu schicken, oder können nicht auf Daten in der Vergangenheit zurück greifen, um nur einige Nachteile zu nennen.
Anders ist atop.
atop ist sowohl Tool, als auch Dienst. Soll heißen: Ich kann atop aufrufen, um die aktuelle Last meines Systems zu ermitteln/sehen, aber auch atop als Dienst laufen lassen, der in einem fest definierten Intervall alle relevanten Last-Daten auf die Festplatte in eine binäre-Datei schreibt.
Um atop als Tool zu verwenden, genügt der einfach Aufruf von…
atop
Optional kann ich hinter atop (mit einem Leerzeichen getrennt) den ktualisierungs-Intervall in Sekunden angeben.
Ich denke, was atop anzeigt, ist schon recht einleuchtend und muss nicht weiter erklärt werden. Viel mehr möchte ich aber noch einige Shortcuts nennen, mit denen atop wirklich wichtige Informationen anzeigt (<d> stellt z.B. das Drücken der Taste d dar):
<d> - Disk-Aktivitäten anzeigen <g> - aktuell laufende Prozesse <f> - statische CPU-Liste aktivieren/deaktivieren <m> - Speicher-Nutzung <P> - RegEx-Prozess-Suche <a> - Anzeige aller Prozesse <n> - Netzwerk-Aktivitäten
Dies sind nur einige der Shortcuts, die atop versteht. Weitere finden sich in der Man-Page.
atop lässt sich auch als “Dienst” betreiben. Dazu gibt es unter Debian das init-Script /etc/init.d/atop, welches div. Konfigurationsmöglichkeiten gibt. Die Wichtigste Option ist:
DARGS="-a -w /var/log/atop.log 600" # -a => Show or log all processes # -w /var/log/atop.log => Schreibe Log-File nach ... # 600 => Intervall, in dem in das Log-File geschrieben werden soll
Somit werden also aller 600 Sekunden die Lastdaten in das Log-File /var/log/atop.log geschrieben.
Sofern man pro Tag ein Log-File haben möchte, muss das init-Script modifiziert werden:
[...] DAEMON=/usr/bin/atop CURRENT_DATE=$(date +%Y%m%d) DARGS="-a -w /var/log/atop/"${CURRENT_DATE}_"atop.log 600" NAME=atop [...]
Anschließend wird noch unter /var/log/ das Verzeichnis atop angelegt, Besitzer und Gruppe bleiben root:
mkdir /var/log/atop/
Nun nur noch unter /etc/cron.d/ die Datei atop mit folgendem Inhalt anlegen:
0 0 * * * root /etc/init.d/atop restart > /dev/null 2>&1
Damit wird jeden Tag 0:00 Uhr atop neu gestartet, woduch unter /var/log/atop ein neues Log-File pro Tag angelegt wird:
ls -1 /var/log/atop 20111101_atop.log 20111102_atop.log 20111103_atop.log [...]
Um nun auf diese Log-Files zuzugreifen, braucht man wieder atop, da die Files in einem binären Format vorliegen:
atop -r /var/log/atop/20111101_atop.log
Auch beim Auslesen der Logs aus der Vergangenheit stehen die Shortcuts von oben zur Verfügung. Zusätzlich kann man mit <t> und <SHIFT> + <t> in der Uhrzeit vor und zurück blättern.
Schon beim Aufruf von atop kann ein Zeitpunkt, oder eine Zeitspanne, definiert werden, die man sich anschauen möchte. Z.B. alle Einträge von 12:00 bis 13:00 Uhr:
atop -r /var/log/atop/20111101_atop.log -b 12:00 -e 13:00
Die beiden Parameter lassen sich auch einzeln nutzen…
Um atop für die Generierung von Statistiken zu nutzen, gibt es einen Schalter, der die Ausgabe mit dr libreadline deaktiviert: -P
Diese Option verlangt noch ein Label, sprich die Information, die mann auswerten möchte. Zur Auswahl stehen:
PRC Process level totals CPU CPU utilization CPL CPU load information MEM Memory occupation SWP Swap occupation and overcommit info PAG Paging frequency DSK Disk utilization NET Network utilization (TCP/IP)
Eine genauere Beschreibung derer findet sich wieder in der Man-Page.
Auf Aufruf für die CPU Last könnte also so aussehen:
atop -r /var/log/atop/20111101_atop.log -PCPL
Die Ausgabe wäre dann…
[...] CPL server01 1320147312 2011/11/01 06:35:12 600 1 0.07 0.06 0.07 140155 11868 SEP CPL server01 1320147612 2011/11/01 06:45:12 600 1 0.03 0.03 0.03 98021 12110 SEP [...]
SEP ist der Seperator, der einen neuen Eintrag kennzeichnet, bzw. den alten abschließt. Die genaue Feld-Bezeichnung ist der Man-Page zu entnehmen. In meinem Fall handelt es sich bei den Feldern 8, 9 und 10 um die Load Average der letzten Minute, der letzten 5 und der letzten 15 Minuten.
Mit diesen Informationen und etwas Bash kann man schonmal eine CSV bauen:
atop -r /var/log/atop.log -PCPL | egrep -v "^SEP" | awk '{ print "\""$4"_"$5"\";\""$8"\";\""$9"\";\""$10"\"" }' > /home/user/Desktop/atop_load.csv
Es wird der Zeitpunkt in die CSV gelogt, im Format “Datum_Uhrzeit”, und anschließend die lavg1, lavg5 und lavg15.
Dies kann man nun z.B. mit gnuplot auswerten. Ein einfaches Script, welches die Graphen in einer PNG-Datei darstellt, könnte so aussehen:
#!/usr/bin/gnuplot set timefmt "%Y/%m/%d_%H:%M:%S" set datafile missing "N/A" set datafile separator ';' set key top left set style data lines set grid set xdata time # Hier müssen Start und Endpunkt eingetragen werden, wieder im Format "Datum_Uhrzeit"! set xrange ['${start_date}':'${end_date}'] # aller 6 Stunden ein Datums-Eintrag auf der x-Achse set xtic 21600 # Ausrichtung der Bezeichnung auf der x-Achse set xtics scale 0,0 rotate by 90 set xtics out offset 0,-9.0 set mxtics 12 set format x '%Y/%m/%d_%H:%M:%S' # Bezeichung für die y-Achse set ylabel 'load average' set format y '%.2f' # Bildparameter definieren set term png small size '1280,1024' xffffff x000000 xa0a0a0 x00bf00 xbf0000 x0000bf # Ausgabe in Pfad... set outp '/home/user/Desktop/atop_load.png' set style line 1 lt rgb "#0000ff" lw '1' set style line 2 lt rgb "#006400" lw '1' set style line 3 lt rgb "#a52a2a" lw '1' plot \ '/home/user/Desktop/atop_load.csv' \ usi 1:($2) title 'lavg1' ls 1, \ '' usi 1:($3) title 'lavg5' ls 2, \ '' usi 1:($4) title 'lavg15' ls 3
Anschließend ausführbar machen (chmod +x gnuplot_script) und ausführen. Wir erhalten einen schönen Graphen…