Home | History | Annotate | Download | only in btt
      1 #! /usr/bin/env python
      2 #
      3 # btt blkno plotting interface
      4 #
      5 #  (C) Copyright 2008 Hewlett-Packard Development Company, L.P.
      6 #
      7 #  This program is free software; you can redistribute it and/or modify
      8 #  it under the terms of the GNU General Public License as published by
      9 #  the Free Software Foundation; either version 2 of the License, or
     10 #  (at your option) any later version.
     11 #
     12 #  This program is distributed in the hope that it will be useful,
     13 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 #  GNU General Public License for more details.
     16 #
     17 #  You should have received a copy of the GNU General Public License
     18 #  along with this program; if not, write to the Free Software
     19 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     20 #
     21 """
     22 bno_plot.py
     23 	[ -h | --help       ]
     24 	[ -K | --keys-below ]
     25 	[ -v | --verbose    ]
     26 	[ <file...>         ]
     27 
     28 Utilizes gnuplot to generate a 3D plot of the block number output
     29 from btt.  If no <files> are specified, it will utilize all files
     30 generated after btt was run with -B blknos (meaning: all files of the
     31 form blknos*[rw].dat).
     32 
     33 The -K option forces bno_plot.py to put the keys below the graph,
     34 typically all keys for input files are put in the upper right corner
     35 of the graph. If the number of devices exceed 10, then bno_plot.py will
     36 automatically push the keys under the graph.
     37 
     38 To exit the plotter, enter 'quit' or ^D at the 'gnuplot> ' prompt.
     39 """
     40 
     41 import getopt, glob, os, sys, tempfile
     42 
     43 verbose	= 0
     44 cmds	= """
     45 set title 'btt Generated Block Accesses'
     46 set xlabel 'Time (secs)'
     47 set ylabel 'Block Number'
     48 set zlabel '# Blocks per IO'
     49 set grid
     50 """
     51 
     52 
     53 #-----------------------------------------------------------------------------
     54 def parse_args(in_args):
     55 	global verbose
     56 
     57 	keys_below = False
     58 	s_opts = 'hKv'
     59 	l_opts = [ 'help', 'keys-below', 'verbose' ]
     60 
     61 	try:
     62 		(opts, args) = getopt.getopt(in_args, s_opts, l_opts)
     63 	except getopt.error, msg:
     64 		print >>sys.stderr, msg
     65 		print >>sys.stderr, __doc__
     66 		sys.exit(1)
     67 
     68 	for (o, a) in opts:
     69 		if o in ('-h', '--help'):
     70 			print __doc__
     71 			sys.exit(0)
     72 		elif o in ('-v', '--verbose'):
     73 			verbose += 1
     74 		elif o in ('-K', '--keys-below'):
     75 			keys_below = True
     76 
     77 	if len(args) > 0:	bnos = args
     78 	else:			bnos = glob.glob('blknos*[rw].dat')
     79 
     80 	return (bnos, keys_below)
     81 
     82 #-----------------------------------------------------------------------------
     83 if __name__ == '__main__':
     84 	(bnos, keys_below) = parse_args(sys.argv[1:])
     85 
     86 	if verbose:
     87 		print 'Using files:',
     88 		for bno in bnos: print bno,
     89 		if keys_below:	print '\nKeys are to be placed below graph'
     90 		else:		print ''
     91 
     92 	tmpdir = tempfile.mktemp()
     93 	os.mkdir(tmpdir)
     94 
     95 	plot_cmd = None
     96 	for f in bnos:
     97 		t = '%s/%s' % (tmpdir, f)
     98 
     99 		fo = open(t, 'w')
    100 		for line in open(f, 'r'):
    101 			fld = line.split(None)
    102 			print >>fo, fld[0], fld[1], int(fld[2])-int(fld[1])
    103 		fo.close()
    104 
    105 		t = t[t.rfind('/')+1:]
    106 		if plot_cmd == None: plot_cmd = "splot '%s'" % t
    107 		else:                plot_cmd = "%s,'%s'" % (plot_cmd, t)
    108 
    109 	fo = open('%s/plot.cmds' % tmpdir, 'w')
    110 	print >>fo, cmds
    111 	if len(bnos) > 10 or keys_below: print >>fo, 'set key below'
    112 	print >>fo, plot_cmd
    113 	fo.close()
    114 
    115 	pid = os.fork()
    116 	if pid == 0:
    117 		cmd = '/usr/bin/gnuplot %s/plot.cmds -' % tmpdir
    118 
    119 		if verbose: print 'Executing %s' % cmd
    120 
    121 		cmd = cmd.split(None)
    122 		os.chdir(tmpdir)
    123 		os.execvp(cmd[0], cmd)
    124 		sys.exit(1)
    125 
    126 	os.waitpid(pid, 0)
    127 	os.system('/bin/rm -rf ' + tmpdir)
    128