iostat Performance-Messung als CSV extrahieren
Die Abfrage einiger Performance-Messwerte muss nicht zwangsläufig mit einer kompletten Systemmonitoring Lösung ala check_MK einhergehen. Manchmal reichen schon kleinere Linux-Bordmittel aus, um sich einen groben Überblick über die Hardwareauslastung zu verschaffen. Eine Möglichkeit hierzu findet sich im Tool „iostat“, welches neben Input/Output Statistiken für Festplatten, Partitionen und Netzlaufwerke auch jene für die CPU-Auslastung bereitstellt. Mit einem einfachen Trick, lassen sich diese Daten außerdem als .csv-Datei abspeichern und grafisch in z.B. LibreOffice Calc darstellen.
Installation
In der Standardinstallation sollte dieses Tool nicht enthalten sein, kann jedoch einfach folgendermaßen installiert werden:
.DEB Installation
sudo apt-get install sysstat
.RPM Installation
sudo yum install sysstat
Bedienung
Ist das erledigt, kanns auch direkt mit
iostat
losgehen. Ohne die Angabe weiterer Parameter, wird eine Übersicht zur CPU und sämtlichen Festplatten (die vom System unter /dev gefunden wurden) ausgegeben. In der CPU-Übersicht zu finden ist etwa die prozentuale CPU-Auslastung auf Anwender und Kernel-Ebene, wie auch die im idle-Betrieb. Der Festplatten-Report ist etwas umfangreicher und verrät neben dem Lese-/Schreibzugriff (wahlweise in Mega-/ und Kilobyte), Details zu Block- und Sektorenzugriff. Dies aber nur als Randnotiz, denn die eigentlich ohnehin schon üppige Ausgabe lässt sich mit folgendem Parameter noch um einige Punkte für die Festplatten-Analyse erweitern.
iostat -x
Hier noch eine Erklärung zu den abgefragten Parametern (Quelle: Manpage iostat):
CPU Utilization Report %user Show the percentage of CPU utilization that occurred while executing at the user level (application). %nice Show the percentage of CPU utilization that occurred while executing at the user level with nice priority. %system Show the percentage of CPU utilization that occurred while executing at the system level (kernel). %iowait Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request. %steal Show the percentage of time spent in involuntary wait by the virtual CPU or CPUs while the hypervisor was servicing another virtual processor. %idle Show the percentage of time that the CPU or CPUs were idle and the system did not have an outstanding disk I/O request.
Device Utilization Report tps Indicate the number of transfers per second that were issued to the device. A transfer is an I/O request to the device. Multiple logical requests can be combined into a single I/O request to the device. A transfer is of indeterminate size kB_read/s Indicate the amount of data read from the device expressed in kilobytes per second. kB_wrtn/s Indicate the amount of data written to the device expressed in kilobytes per second. Blk_dscd/s (kB_dscd/s, MB_dscd/s) Indicate the amount of data discarded for the device expressed in a number of blocks (kilobytes, megabytes) per second. kB_read The total number of kilobytes read. kB_wrtn The total number of kilobytes written. Blk_dscd (kB_dscd, MB_dscd) The total number of blocks (kilobytes, megabytes) discarded.
Automatischer Report als CSV-Datei
Schön und gut, diese Ausgabe bietet uns nun aber nur eine Momentaufnahme.
Ein kurzes und simples Bash-Skript schafft da Abhilfe. Es sorgt dafür, dass wir auch über einen längeren Zeitraum Daten sammeln und diese mit einem Zeitstempel versehen können.
Und das kann folgendermaßen aussehen:
#!/bin/bash
iostat_dir=$HOME/iostat
iostat_cpu=$iostat_dir/iostat_cpu.csv
iostat_disk=$iostat_dir/iostat_disk.csv
if [ -e $iostat_dir ]; then : ; else mkdir -p "$iostat_dir" ; fi
if [ -e $iostat_cpu ]; then
:
else
echo '"time";"%user";"%nice";"%system";"%iowait";"%steal";"%idle"' > $iostat_cpu
fi
result_cpu=`iostat -c 1 3 | tail -n4 | head -n1 | awk -v 's="' '{ print s$1s ";" s$2s ";" s$3s ";" s$4s ";" s$5s ";" s$6s }'`
echo "\"`date +%H:%M:%S`\";$result_cpu" >> $iostat_cpu
if [ -e $iostat_disk ]; then
:
else
echo '"time";"tps";"MB_read/s";"MB_wrtn/s";"MB_dscd/s";"MB_read";"MB_wrtn";"MB_dscd"' > $iostat_disk
fi
result_disk=`iostat -dm 1 3 $1 | tail -n5 | grep . | tail -n1 | awk -v 's="' '{ print s$2s ";" s$3s ";" s$4s ";" s$5s ";" s$6s ";" s$7s ";" s$8s }'`
echo "\"`date +%H:%M:%S`\";$result_disk" >> $iostat_disk
Was geschieht?!
Es wird uns in unserem Home-Vereichnis der Unterordner „iostat“ angelegt und die beiden CSV-Dateien „iostat_cpu.csv“ und „iostat_disk.csv“ darin erstellen. Wie die Namen andeuten, sind die Daten für CPU und Festplatte in diesen beiden Dateien separiert. Die erste Spalte ist außerdem für die aktuelle Uhrzeit reserviert. Da mehrere Festplatten vorhanden sind/sein können, muss dem Skript bei Ausführung als Parameter die Festplatte oder die Partition mitgegeben werden, in etwa so:
./iostat_csv.sh /dev/nvme0n1p2
Nun sind wir soweit, die generierten CSV-Dateien grafisch als Chart darzustellen.
Wir navigieren also in den Unterordner ~/iostat/ und öffnen hierfür die jeweilige Datei und markieren sämtliche darzustellende Werte.
Anschließend klicken wir in der oberen Menüleiste auf „Einfügen“ -> „Diagramm“. Nun können wir uns die Diagramm-Art aussuchen. Aufgrund der vielen Werte entscheide ich mich für ein 3-Dimensionales Liniendiagramm. Normalerweise sollte Libreoffice die X-/ und Y-Achse bereits in korrekter Reihenfolge darstellen (X-Achse = Zeit / Y-Achse = Prozent). Falls dem nicht so ist, kann dies im Diagramm-Assistenten nachjustiert werden. Hierbei ist es wichtig, im dritten Punkt „Datenreihe“ den Wert für „Kategorien“ auf die Werte der ersten Spalte zu legen.
Ist alles richtig eingegeben, sollten wir in etwa folgendes Bild vorfinden:
Anmerkung: Dabei zu bedenken ist, dass die X-Achse (Zeit) davon beeinflusst wird, in welchem zeitlichen Abstand und zu welchem Zeitpunkt das Skript ausgeführt wurde. Werden nachträglich Daten hinzugefügt, sind diese aufgrund einer nicht konstanten Zeitlinie verfälscht. Es macht also eher Sinn sich auf die Daten zu stützen, die in einem einzelnen Durchlauf zusammengetragen wurden.
Das wärs soweit. Weit von Professionalität entfernt, aber eine mögliche Quick and Dirty Lösung.