aboutsummaryrefslogtreecommitdiffstats
path: root/ci/plot-results.sh
blob: a2c305ffde3bb76ca6b850464d7a235176b8da89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/bin/bash
#
# Copyright 2017 Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Script for graphical representation of VSPERF results
#
# Usage:
#   ./create_graph ["test names" [filter [directory]]]
#
# where:
#       "test names" is a !!! quoted !!! string with vsperf testcase names separated
#           by spaces
#           Default value: "phy2phy_tput"
#
#       "filter" is used to select matching VSPERF results; Its value
#           will be used as PATTERN of grep command executed on selected
#           csv result files.
#           Default value: ",OvsDpdkVhost,"
#
#       "directory" is a directory name, where vsperf results (i.e. results_*
#           subdirectories) are located
#           Default value: "/tmp"
#
# Example of invocation:
#   ./create_graph "phy2phy_tput phy2phy_cont pvp_cont pvvp_cont" ",OvsVanilla,"

TESTS="phy2phy_tput"    # default set of TCs to be plotted
FILTER=",OvsDpdkVhost," # default filter to be applied on matching CSV files
NUMBER_OF_RESULTS=50    # max number of recent results to be compared in graph
CSV_RESULT_COL=2        # column number with result to be plotted, e.g. 2 for rx_throughput_fps
B2B_CSV_RESULT_COL=1    # column number with result to be plotted for back2back TCs
CSV_PKT_SIZE_COL=12     # column number with frame/packet size
B2B_CSV_PKT_SIZE_COL=4  # column number with frame/packet size for back2back TCs
NUMBER_OF_PKT_SIZES=0   # to be detected automatically
MAX_NUMBER_OF_PKT_SIZES=10
DIR="/tmp"              # directory where vsperf results are stored
PNG_PREFIX='vsperf_'
TYPE="TPUT"             # customization of graph for TPUT or B2B

function clean_data() {
    rm -rf *csv
    rm -rf *plot
    rm -rf *png
}

function prepare_data() {
    for test_name in $TESTS; do
        FIRST=1
        CSV_LIST=`grep -r ",${test_name}," ${DIR}/results_*/*csv | grep $FILTER | cut -d':' -f1 | uniq | sort | tail -n ${NUMBER_OF_RESULTS}`
        for result_file in $CSV_LIST ; do
            tmp_dir=`dirname $result_file`
            TIMESTAMP=`basename $tmp_dir | cut -d'_' -f2-`
            if [ $FIRST -eq 1 ] ; then
                NUMBER_OF_PKT_SIZES=$((`wc -l ${result_file} | cut -d' ' -f1`-1))
                if [ $NUMBER_OF_PKT_SIZES -gt $MAX_NUMBER_OF_PKT_SIZES ] ; then
                    NUMBER_OF_PKT_SIZES=$MAX_NUMBER_OF_PKT_SIZES
                fi
                if grep back2back ${result_file} &> /dev/null ; then
                    PKT_SIZE_COL=$B2B_CSV_PKT_SIZE_COL
                    RES_COL=$B2B_CSV_RESULT_COL
                    TYPE="B2B"
                else
                    PKT_SIZE_COL=$CSV_PKT_SIZE_COL
                    RES_COL=$CSV_RESULT_COL
                    TYPE="TPUT"
                fi
                RESULT_HEADER=`tail -n+2 ${result_file} | head -n ${NUMBER_OF_PKT_SIZES} | cut -d',' -f${PKT_SIZE_COL} | paste -d',' -s`
                echo "[$TYPE] Date/PKT Size [B],${RESULT_HEADER}" > "${test_name}.csv"
                FIRST=0
            fi
            RESULT_4ALL_PKT_SIZES=`tail -n+2 ${result_file} | head -n ${NUMBER_OF_PKT_SIZES} | cut -d',' -f${RES_COL} | paste -d',' -s`
            echo "${TIMESTAMP},${RESULT_4ALL_PKT_SIZES}" >> "${test_name}.csv"
        done
    done
}

function plot_data() {
    echo "Created graphs:"
    SUFFIX=`echo $FILTER | tr -d -C [:alnum:]`
    for TEST_CSV in *csv; do
        [ ! -f $TEST_CSV ] && continue
        TEST_NAME=`basename ${TEST_CSV} .csv`"_${SUFFIX}"
        OUTPUT="$TEST_NAME.plot"
        cat > $OUTPUT <<- EOM
set datafile separator ","
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set format x "%m-%d"
set xlabel "date"
set format y "%8.0f"
set term png size 1024,768
EOM

        if grep '^\[B2B\]' ${TEST_CSV} &> /dev/null ; then
            echo 'set ylabel "frames"' >> $OUTPUT
            echo 'set log y' >> $OUTPUT
            echo 'set yrange [1:]' >> $OUTPUT
        else
            echo 'set ylabel "fps"' >> $OUTPUT
            echo 'set yrange [0:]' >> $OUTPUT
        fi

        iter=0
        echo "set title \"$TEST_NAME\"" >> $OUTPUT
        echo "set output \"${PNG_PREFIX}${TEST_NAME}.png\"" >> $OUTPUT
        echo -n "plot " >> $OUTPUT
        SEP=""
        while [ $iter -lt $NUMBER_OF_PKT_SIZES ] ; do
            COL=$((2+$iter))
            echo $"$SEP '$TEST_CSV' using 1:$COL with linespoints title columnheader($COL) \\" >> $OUTPUT
            iter=$(($iter+1))
            SEP=","
        done
        echo -e "\t${PNG_PREFIX}${TEST_NAME}.png"
        gnuplot $OUTPUT
    done
}

#
# Main body
#

# override default set of TESTS if specified by 1st parameter
if [ "$1" != "" ] ; then
    TESTS="$1"
fi

# override default filter if specified by 2nd parameter
if [ "$2" != "" ] ; then
    FILTER="$2"
fi

# override default directory with results by 3rd parameter
if [ "$3" != "" ] ; then
    DIR="$3"
fi
clean_data

echo -e "Plot data input:"
echo -e "\tTESTS: $TESTS"
echo -e "\tFilter: $FILTER"
echo -e "\tResults direcotry: $DIR"

prepare_data
plot_data