3 # Sergey Senozhatsky, 2015
4 # sergey.senozhatsky.work@gmail.com
6 # This software is licensed under the terms of the GNU General Public
7 # License version 2, as published by the Free Software Foundation, and
8 # may be copied, distributed, and modified under those terms.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
16 # This program is intended to plot a `slabinfo -X' stats, collected,
17 # for example, using the following command:
18 # while [ 1 ]; do slabinfo -X >> stats; sleep 1; done
20 # Use `slabinfo-gnuplot.sh stats' to pre-process collected records
21 # and generate graphs (totals, slabs sorted by size, slabs sorted
24 # Graphs can be [individually] regenerate with different ranges and
25 # size (-r %d,%d and -s %d,%d options).
27 # To visually compare N `totals' graphs, do
28 # slabinfo-gnuplot.sh -t FILE1-totals FILE2-totals ... FILEN-totals
40 echo "Usage: [-s W,H] [-r MIN,MAX] [-t|-l] FILE1 [FILE2 ..]"
41 echo "FILEs must contain 'slabinfo -X' samples"
42 echo "-t - plot totals for FILE(s)"
43 echo "-l - plot slabs stats for FILE(s)"
44 echo "-s %d,%d - set image width and height"
45 echo "-r %d,%d - use data samples from a given range"
50 if [ ! -f "$1" ]; then
51 echo "File '$1' does not exist"
60 local range
="every ::$xmin"
62 local xtic_rotate
="norotate"
66 check_file_exist
"$file"
68 out_file
=`basename "$file"`
69 if [ $xmax -ne 0 ]; then
74 wc_lines
=`cat "$file" | wc -l`
75 if [ $?
-ne 0 ] ||
[ "$wc_lines" -eq 0 ] ; then
79 if [ "$wc_lines" -lt "$lines" ]; then
83 if [ $
((width
/ lines
)) -gt $min_slab_name_size ]; then
89 #!/usr/bin/env gnuplot
91 set terminal png enhanced size $width,$height large
92 set output '$out_file.png'
96 set style histogram columnstacked title textcolor lt -1
97 set style fill solid 0.15
98 set xtics rotate $xtic_rotate
99 set key left above Left title reverse
101 plot "$file" $range u 2$xtic title 'SIZE' with boxes,\
102 '' $range u 3 title 'LOSS' with boxes
105 if [ $?
-eq 0 ]; then
113 local range
="every ::$xmin"
116 if [ $xmax -ne 0 ]; then
117 range
="$range::$xmax"
120 for i
in "${t_files[@]}"; do
121 check_file_exist
"$i"
123 file="$file"`basename "$i"`
124 gnuplot_cmd
="$gnuplot_cmd '$i' $range using 1 title\
125 '$i Memory usage' with lines,"
126 gnuplot_cmd
="$gnuplot_cmd '' $range using 2 title \
127 '$i Loss' with lines,"
131 #!/usr/bin/env gnuplot
133 set terminal png enhanced size $width,$height large
135 set output '$file.png'
138 set key left above Left title reverse
143 if [ $?
-eq 0 ]; then
154 check_file_exist
"$in"
156 # use only 'TOP' slab (biggest memory usage or loss)
158 out
=`basename "$in"`"-slabs-by-loss"
159 `cat "$in" | grep -A "$lines" 'Slabs sorted by loss' |\
160 egrep -iv '\-\-|Name|Slabs'\
161 | awk '{print $1" "$4+$2*$3" "$4}' > "$out"`
162 if [ $?
-eq 0 ]; then
163 do_slabs_plotting
"$out"
167 out
=`basename "$in"`"-slabs-by-size"
168 `cat "$in" | grep -A "$lines" 'Slabs sorted by size' |\
169 egrep -iv '\-\-|Name|Slabs'\
170 | awk '{print $1" "$4" "$4-$2*$3}' > "$out"`
171 if [ $?
-eq 0 ]; then
172 do_slabs_plotting
"$out"
175 out
=`basename "$in"`"-totals"
176 `cat "$in" | grep "Memory used" |\
177 awk '{print $3" "$7}' > "$out"`
178 if [ $?
-eq 0 ]; then
188 while getopts "tlr::s::h" opt
; do
197 array
=(${OPTARG//,/ })
202 array
=(${OPTARG//,/ })
211 echo "Invalid option: -$OPTARG" >&2
215 echo "-$OPTARG requires an argument." >&2
249 parse_args
"${@:$argstart}"
251 if [ ${#files[@]} -eq 0 ] && [ ${#t_files[@]} -eq 0 ]; then
258 for i
in "${files[@]}"; do
266 for i
in "${files[@]}"; do
267 do_slabs_plotting
"$i"
271 echo "Unknown mode $mode" >&2