Balkendiagramme aus Fio Logs

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche

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:

Fio-python-bw-bars.png Fio-python-io-bars.png

Einzelnachweise

  1. fio man page (linux.die.net, 17.04.2012)

Das könnte Sie auch interessieren

Fio
Fio Grundlagen
Fio Logs mit fio2gnuplot visualisieren