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