1b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius#!/bin/sh
2b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius#
3b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# This script is an almost total rewrite by Louwrentius 
4b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# of the original fio_generate_plots script provided as part of the FIO storage
5b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# benchmark utiliy. I only retained how GNUplot is used to generate graphs, as
6b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# that is something I know nothing about.
7b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius#
8b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# The script uses the files generated by FIO to create nice graphs in the
9b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# SVG format. This output format is supported by most modern browsers and
10de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov# allows resolution independent graphs to be generated.
11b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius#
12b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# This script supports GNUPLOT 4.4 and higher.
13b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# 
14b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# Version 1.0 @ 20121231
15b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius#
16b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# 
17b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius#
18b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
19b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusif [ -z "$1" ]; then
20b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius	echo "Usage: fio_generate_plots subtitle [xres yres]"
21ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	exit 1
22ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboefi
23ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
241618495b30517fb10f6e47c052689dc57ff78df7Jens AxboeGNUPLOT=$(which gnuplot)
25bd33a2f5f6b20e6e7eddc6e1e896c4f12daec9bbMartin Steigerwaldif [ ! -x "$GNUPLOT" ]
26b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusthen
271618495b30517fb10f6e47c052689dc57ff78df7Jens Axboe	echo You need gnuplot installed to generate graphs
281618495b30517fb10f6e47c052689dc57ff78df7Jens Axboe	exit 1
291618495b30517fb10f6e47c052689dc57ff78df7Jens Axboefi
301618495b30517fb10f6e47c052689dc57ff78df7Jens Axboe
31b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusTITLE="$1"
32ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
334d1577b1be7c6cf6972e96d3d87ffaf367560b17Martin Steigerwald# set resolution
34b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusif [ ! -z "$2" ] && [ ! -z "$3" ]
35b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusthen
364d1577b1be7c6cf6972e96d3d87ffaf367560b17Martin Steigerwald	XRES="$2"
374d1577b1be7c6cf6972e96d3d87ffaf367560b17Martin Steigerwald	YRES="$3"
384d1577b1be7c6cf6972e96d3d87ffaf367560b17Martin Steigerwaldelse
39b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius	XRES=1280
404d1577b1be7c6cf6972e96d3d87ffaf367560b17Martin Steigerwald	YRES=768
414d1577b1be7c6cf6972e96d3d87ffaf367560b17Martin Steigerwaldfi
424d1577b1be7c6cf6972e96d3d87ffaf367560b17Martin Steigerwald
43b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusif [ -z "$SAMPLE_DURATION" ]
44b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusthen
45b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    SAMPLE_DURATION="*"
46ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboefi
47ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
48b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_GRID_LINE_TYPE=3
49b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_LINE_WIDTH=2
50b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_LINE_COLORS="
51b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusset object 1 rectangle from screen 0,0 to screen 1,1 fillcolor rgb\"#ffffff\" behind 
52b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusset style line 1 lc rgb \"#E41A1C\" lw $DEFAULT_LINE_WIDTH lt 1;
53b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusset style line 2 lc rgb \"#377EB8\" lw $DEFAULT_LINE_WIDTH lt 1;
54b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusset style line 3 lc rgb \"#4DAF4A\" lw $DEFAULT_LINE_WIDTH lt 1;
55b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusset style line 4 lc rgb \"#984EA3\" lw $DEFAULT_LINE_WIDTH lt 1;
56b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusset style line 5 lc rgb \"#FF7F00\" lw $DEFAULT_LINE_WIDTH lt 1;
57b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusset style line 6 lc rgb \"#DADA33\" lw $DEFAULT_LINE_WIDTH lt 1;
58b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusset style line 7 lc rgb \"#A65628\" lw $DEFAULT_LINE_WIDTH lt 1;
59b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusset style line 20 lc rgb \"#000000\" lt $DEFAULT_GRID_LINE_TYPE lw $DEFAULT_LINE_WIDTH;
60b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius"
61b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
62b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_TERMINAL="set terminal svg enhanced dashed size $XRES,$YRES dynamic"
63b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_TITLE_FONT="\"Helvetica,28\""
64b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_AXIS_FONT="\"Helvetica,14\""
65b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_AXIS_LABEL_FONT="\"Helvetica,16\""
66b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_XLABEL="set xlabel \"Time (sec)\" font $DEFAULT_AXIS_LABEL_FONT"
67b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_XTIC="set xtics font $DEFAULT_AXIS_FONT"
68b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_YTIC="set ytics font $DEFAULT_AXIS_FONT"
69b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_MXTIC="set mxtics 0"
70b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_MYTIC="set mytics 2"
71b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_XRANGE="set xrange [0:$SAMPLE_DURATION]"
72b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_YRANGE="set yrange [0:*]"
73b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_GRID="set grid ls 20"
74b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_KEY="set key outside bottom center ; set key box enhanced spacing 2.0 samplen 3 horizontal width 4 height 1.2 "
75b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_SOURCE="set label 30 \"Data source: http://example.com\" font $DEFAULT_AXIS_FONT tc rgb \"#00000f\" at screen 0.976,0.175 right"
76b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusDEFAULT_OPTS="$DEFAULT_LINE_COLORS ; $DEFAULT_GRID_LINE ; $DEFAULT_GRID ; $DEFAULT_GRID_MINOR ; $DEFAULT_XLABEL ; $DEFAULT_XRANGE ; $DEFAULT_YRANGE ; $DEFAULT_XTIC ;  $DEFAULT_YTIC ; $DEFAULT_MXTIC ; $DEFAULT_MYTIC ; $DEFAULT_KEY ; $DEFAULT_TERMINAL ; $DEFAULT_SOURCE"
77b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
78b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusplot () {
79b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    
80b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    if [ -z "$TITLE" ]
81b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    then	
82b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius        PLOT_TITLE=" set title \"$1\" font $DEFAULT_TITLE_FONT"
83b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    else
84b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius        PLOT_TITLE=" set title \"$TITLE\\\n\\\n{/*0.6 "$1"}\" font $DEFAULT_TITLE_FONT"
85b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    fi
86b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    FILETYPE="$2"
87b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    YAXIS="set ylabel \"$3\" font $DEFAULT_AXIS_LABEL_FONT"
88b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    SCALE=$4
89b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
90b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    echo "Title: $PLOT_TITLE"
91b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    echo "File type: $FILETYPE"
92b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    echo "yaxis: $YAXIS"
93b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
94b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    i=0
95b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    
96b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    for x in *_"$FILETYPE".log
97b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    do
98b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius        i=$((i+1))
99b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius        PT=$(echo $x | sed s/_"$FILETYPE".log//g)
100b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius        if [ ! -z "$PLOT_LINE" ]
101b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius        then
102b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius            PLOT_LINE=$PLOT_LINE", "
103b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius        fi
104b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
105b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius        DEPTH=$(echo $PT | cut -d "-" -f 4)
106b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius	    PLOT_LINE=$PLOT_LINE"'$x' using (\$1/1000):(\$2/$SCALE) title \"Queue depth $DEPTH\" with lines ls $i" 
107b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius        
108b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    done
109b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
110b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    OUTPUT="set output \"$TITLE-$FILETYPE.svg\" "
111b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
112b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    echo " $PLOT_TITLE ; $YAXIS ; $DEFAULT_OPTS ; show style lines ; $OUTPUT ; plot "  $PLOT_LINE  | $GNUPLOT -
113b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius    unset PLOT_LINE
114b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius}
115b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
116b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius#
117b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius# plot <sub title> <file name tag> <y axis label> <y axis scale>
118b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius#
119b35c036c8db9ece002b019f4a462a303ceb130faLouwrentius
120b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusplot "I/O Latency" lat "Time (msec)" 1000
121b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusplot "I/O Operations Per Second" iops "IOPS" 1
122b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusplot "I/O Submission Latency" slat "Time (μsec)" 1
123b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusplot "I/O Completion Latency" clat "Time (msec)" 1000
124b35c036c8db9ece002b019f4a462a303ceb130faLouwrentiusplot "I/O Bandwidth" bw "Throughput (KB/s)" 1
125c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe
126ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
127