Blame btt/bno_plot.py

Packit Service 767812
#!/usr/libexec/platform-python
Packit c4abd9
#
Packit c4abd9
# btt blkno plotting interface
Packit c4abd9
#
Packit c4abd9
#  (C) Copyright 2008 Hewlett-Packard Development Company, L.P.
Packit c4abd9
#
Packit c4abd9
#  This program is free software; you can redistribute it and/or modify
Packit c4abd9
#  it under the terms of the GNU General Public License as published by
Packit c4abd9
#  the Free Software Foundation; either version 2 of the License, or
Packit c4abd9
#  (at your option) any later version.
Packit c4abd9
#
Packit c4abd9
#  This program is distributed in the hope that it will be useful,
Packit c4abd9
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit c4abd9
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit c4abd9
#  GNU General Public License for more details.
Packit c4abd9
#
Packit c4abd9
#  You should have received a copy of the GNU General Public License
Packit c4abd9
#  along with this program; if not, write to the Free Software
Packit c4abd9
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit c4abd9
#
Packit c4abd9
"""
Packit c4abd9
bno_plot.py
Packit c4abd9
	[ -h | --help       ]
Packit c4abd9
	[ -K | --keys-below ]
Packit c4abd9
	[ -v | --verbose    ]
Packit c4abd9
	[ <file...>         ]
Packit c4abd9
Packit c4abd9
Utilizes gnuplot to generate a 3D plot of the block number output
Packit c4abd9
from btt.  If no <files> are specified, it will utilize all files
Packit c4abd9
generated after btt was run with -B blknos (meaning: all files of the
Packit c4abd9
form blknos*[rw].dat).
Packit c4abd9
Packit c4abd9
The -K option forces bno_plot.py to put the keys below the graph,
Packit c4abd9
typically all keys for input files are put in the upper right corner
Packit c4abd9
of the graph. If the number of devices exceed 10, then bno_plot.py will
Packit c4abd9
automatically push the keys under the graph.
Packit c4abd9
Packit c4abd9
To exit the plotter, enter 'quit' or ^D at the 'gnuplot> ' prompt.
Packit c4abd9
"""
Packit c4abd9
Packit Service c53734
from __future__ import absolute_import
Packit Service c53734
from __future__ import print_function
Packit c4abd9
import getopt, glob, os, sys, tempfile
Packit c4abd9
Packit c4abd9
verbose	= 0
Packit c4abd9
cmds	= """
Packit c4abd9
set title 'btt Generated Block Accesses'
Packit c4abd9
set xlabel 'Time (secs)'
Packit c4abd9
set ylabel 'Block Number'
Packit c4abd9
set zlabel '# Blocks per IO'
Packit c4abd9
set grid
Packit c4abd9
"""
Packit c4abd9
Packit c4abd9
Packit c4abd9
#-----------------------------------------------------------------------------
Packit c4abd9
def parse_args(in_args):
Packit c4abd9
	global verbose
Packit c4abd9
Packit c4abd9
	keys_below = False
Packit c4abd9
	s_opts = 'hKv'
Packit c4abd9
	l_opts = [ 'help', 'keys-below', 'verbose' ]
Packit c4abd9
Packit c4abd9
	try:
Packit c4abd9
		(opts, args) = getopt.getopt(in_args, s_opts, l_opts)
Packit Service c53734
	except getopt.error as msg:
Packit Service c53734
		print(msg, file=sys.stderr)
Packit Service c53734
		print(__doc__, file=sys.stderr)
Packit c4abd9
		sys.exit(1)
Packit c4abd9
Packit c4abd9
	for (o, a) in opts:
Packit c4abd9
		if o in ('-h', '--help'):
Packit Service c53734
			print(__doc__)
Packit c4abd9
			sys.exit(0)
Packit c4abd9
		elif o in ('-v', '--verbose'):
Packit c4abd9
			verbose += 1
Packit c4abd9
		elif o in ('-K', '--keys-below'):
Packit c4abd9
			keys_below = True
Packit c4abd9
Packit c4abd9
	if len(args) > 0:	bnos = args
Packit c4abd9
	else:			bnos = glob.glob('blknos*[rw].dat')
Packit c4abd9
Packit c4abd9
	return (bnos, keys_below)
Packit c4abd9
Packit c4abd9
#-----------------------------------------------------------------------------
Packit c4abd9
if __name__ == '__main__':
Packit c4abd9
	(bnos, keys_below) = parse_args(sys.argv[1:])
Packit c4abd9
Packit c4abd9
	if verbose:
Packit Service c53734
		print('Using files:', end=' ')
Packit Service c53734
		for bno in bnos: print(bno, end=' ')
Packit Service c53734
		if keys_below:	print('\nKeys are to be placed below graph')
Packit Service c53734
		else:		print('')
Packit c4abd9
Packit c4abd9
	tmpdir = tempfile.mktemp()
Packit c4abd9
	os.mkdir(tmpdir)
Packit c4abd9
Packit c4abd9
	plot_cmd = None
Packit c4abd9
	for f in bnos:
Packit c4abd9
		t = '%s/%s' % (tmpdir, f)
Packit c4abd9
Packit c4abd9
		fo = open(t, 'w')
Packit c4abd9
		for line in open(f, 'r'):
Packit c4abd9
			fld = line.split(None)
Packit Service c53734
			print(fld[0], fld[1], int(fld[2])-int(fld[1]), file=fo)
Packit c4abd9
		fo.close()
Packit c4abd9
Packit c4abd9
		t = t[t.rfind('/')+1:]
Packit c4abd9
		if plot_cmd == None: plot_cmd = "splot '%s'" % t
Packit c4abd9
		else:                plot_cmd = "%s,'%s'" % (plot_cmd, t)
Packit c4abd9
Packit c4abd9
	fo = open('%s/plot.cmds' % tmpdir, 'w')
Packit Service c53734
	print(cmds, file=fo)
Packit Service c53734
	if len(bnos) > 10 or keys_below: print('set key below', file=fo)
Packit Service c53734
	print(plot_cmd, file=fo)
Packit c4abd9
	fo.close()
Packit c4abd9
Packit c4abd9
	pid = os.fork()
Packit c4abd9
	if pid == 0:
Packit c4abd9
		cmd = 'gnuplot %s/plot.cmds -' % tmpdir
Packit c4abd9
Packit Service c53734
		if verbose: print('Executing %s' % cmd)
Packit c4abd9
Packit c4abd9
		os.chdir(tmpdir)
Packit c4abd9
		os.system(cmd)
Packit c4abd9
		sys.exit(1)
Packit c4abd9
Packit c4abd9
	os.waitpid(pid, 0)
Packit c4abd9
	os.system('/bin/rm -rf ' + tmpdir)