Balkendiagramme aus Fio Logs
Das folgende Python Skript erstellt aus einer Fio Log-Datei Balkendiagramme mit der durchschnittlichen Bandbreite und den durchschnittlichen I/Os pro Sekunde. Dazu liest das Skript eine von Fio generierte Log-Datei aus, sucht in den vorhandenen Zeilen nach den Parametern und zeichnet die Grafiken. Abschließend werden die beiden Grafiken als png-Datei im Verzeichnis des Skripts abgelegt.
Fio Log-Datei
Ein Fio Log kann beim Aufruf des Fio-Befehls oder dem Ausführen eines Fio-Jobs mit dem Parameter "--output" erzeugt werden.[1] Hierzu eine Beispielausgabe eines Logs:
$ cat test-read-4k-4G-1-jobs
test-read-4k-4G-1-jobs: (g=0): rw=read, bs=4K-4K/4K-4K, ioengine=sync, iodepth=1
fio 2.0.6
Starting 1 process
test-read-4k-4G-1-jobs: Laying out IO file(s) (1 file(s) / 4096MB)
test-read-4k-4G-1-jobs: (groupid=0, jobs=1): err= 0: pid=10968
read : io=4096.0MB, bw=258159KB/s, iops=64539 , runt= 16247msec
clat (usec): min=0 , max=26127 , avg=15.16, stdev=139.21
lat (usec): min=0 , max=26127 , avg=15.21, stdev=139.21
clat percentiles (usec):
| 1.00th=[ 0], 5.00th=[ 0], 10.00th=[ 0], 20.00th=[ 0],
| 30.00th=[ 0], 40.00th=[ 1], 50.00th=[ 1], 60.00th=[ 1],
| 70.00th=[ 1], 80.00th=[ 1], 90.00th=[ 1], 95.00th=[ 1],
| 99.00th=[ 868], 99.50th=[ 876], 99.90th=[ 996], 99.95th=[ 1384],
| 99.99th=[ 1848]
bw (KB/s) : min=240640, max=275296, per=100.00%, avg=258239.25, stdev=9597.90
lat (usec) : 2=98.09%, 4=0.27%, 10=0.06%, 20=0.01%, 50=0.01%
lat (usec) : 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=1.46%
lat (msec) : 2=0.09%, 4=0.01%, 10=0.01%, 20=0.01%, 50=0.01%
cpu : usr=4.33%, sys=25.48%, ctx=17937, majf=0, minf=25
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=1048576/w=0/d=0, short=r=0/w=0/d=0
Run status group 0 (all jobs):
READ: io=4096.0MB, aggrb=258158KB/s, minb=264354KB/s, maxb=264354KB/s, mint=16247msec, maxt=16247msec
Disk stats (read/write):
dm-0: ios=1039484/31753, merge=0/0, ticks=1813896/4141716, in_queue=5955620,
util=99.54%, aggrios=8248/1668, aggrmerge=519111/17621, aggrticks=15922/22720,
aggrin_queue=38650, aggrutil=99.52%
sda: ios=0/3065, merge=0/24074, ticks=0/7932, in_queue=7952, util=3.57%
sdb: ios=16497/271, merge=1038222/11168, ticks=31844/37508, in_queue=69348, util=99.52%
Python-Skript
Das Python Skript liest ein Fio Log aus und zeichnet die Balkendiagramme. Dem Skript können als Parameter die Pfade zu den Fio Logs übergeben werden. Es kombiniert daraus die Daten in einem Diagramm. Das unten stehende Skript ist aufgrund der vorhandenen Labels auf drei Dateien ausgelegt, bei einer anderen Anzahl müssen diese Labels entsprechend angepasst werden.
Für die Generierung der Grafiken wird die Bibliothek matplotlib verwendet.
#!/usr/bin/env python
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy.numarray as na
import fileinput
def getBWs(filelist):
bwValues = []
for line in fileinput.input(filelist):
if "bw=" in line:
bwValues.append(int(line[line.find("bw=")+3:line.find("KB/s")]))
return bwValues
def getIOPs(filelist):
IopValues = []
for line in fileinput.input(filelist):
if "iops=" in line:
IopValues.append(int(line[line.find("iops=")+5:line.find(" ,")]))
return IopValues
def pltBarChart(labels,values,title,xlabel,ylabel,filename):
xlocations = na.array(range(len(values))) + 0.5
width = 0.8
plt.figure()
plt.title(title)
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.bar(xlocations, values)
plt.xticks(xlocations + (width/2), labels)
plt.xlim(0, xlocations[len(xlocations)-1] + (width*2))
plt.savefig(filename)
if __name__ == '__main__':
labels = ["4G","16G","64G"]
bwValues = getBWs(sys.argv[1:])
pltBarChart(labels, bwValues, "Fio avg bw bar chart", "File size", "KByte/s","bw-bars.png")
IOValues = getIOPs(sys.argv[1:])
pltBarChart(labels, IOValues, "Fio avg iops bar chart", "File size", "I/Os per second","io-bars.png")
Beispiel-Grafiken
Der folgende Aufruf des Skripts erzeugt zwei Grafiken:
$ python fio_bar_charts.py test-read-4k-4G-1-jobs test-read-4k-16G-1-jobs test-read-4k-64G-1-jobs
Danach befinden sich folgende Grafiken im Verzeichnis des Skripts:
Einzelnachweise
- ↑ fio man page (linux.die.net, 17.04.2012)