Totally re-work the way that jobfiles are done so there is more

information that can be used for other aspects of sending jobs.
New graphing output stuff with matplotlib.

util/pbs/job.py:
    Shuffle code around and create the JobDir class which encapsulates
    all of the functionality needed for making, organizing, and cleaning
    a job directory.
    Better status output
util/pbs/jobfile.py:
    Majory re-working of the jobfile code.
    A job file now consists of several objects that describe how
    jobs should be run, it includes information about checkpoints,
    and graphing.
util/pbs/send.py:
    use the new jobfile code.
    deal with the 15 character limit of pbs by truncating the name and
    using the raj hack.
util/stats/db.py:
    fix the __str__ function for nodes
    provide __getitem__ for the Database class
util/stats/stats.py:
    use the jobfile stuff to figure out what the proper naming
    and organziation of the graphs should be.
    move all output code to output.py, get rid of ploticus and use
    matplotlib

--HG--
rename : util/categories.py => util/stats/categories.py
extra : convert_revision : 0d793cbf6ad9492290e8ec875ce001c84095e1f7
This commit is contained in:
Nathan Binkert
2005-09-17 16:51:26 -04:00
parent f88d7c7456
commit 02098f8e7b
11 changed files with 1606 additions and 644 deletions

View File

@@ -29,10 +29,9 @@
from __future__ import division
import re, sys, math
def usage():
print '''\
Usage: %s [-E] [-F] [-d <db> ] [-g <get> ] [-h <host>] [-p]
Usage: %s [-E] [-F] [ -G <get> ] [-d <db> ] [-g <graphdir> ] [-h <host>] [-p]
[-s <system>] [-r <runs> ] [-T <samples>] [-u <username>]
<command> [command args]
@@ -61,143 +60,6 @@ def getopts(list, flags):
return opts, args
def printval(name, value, invert = False):
if invert and value != 0.0:
value = 1 / value
if value == (1e300*1e300):
return
if printval.mode == 'G':
print '%s: %g' % (name, value)
elif printval.mode != 'F' and value > 1e6:
print '%s: %0.5e' % (name, value)
else:
print '%s: %f' % (name, value)
printval.mode = 'G'
def unique(list):
set = {}
map(set.__setitem__, list, [])
return set.keys()
#benchmarks = [ 'm', 's', 'snt', 'nb1', 'w1', 'w2', 'w3', 'w4', 'nm', 'ns', 'nw1', 'nw2', 'nw3' ]
def graphdata(runs, options, tag, label, value):
import info
bench_system = {
'm' : 'client',
's' : 'client',
'snt' : 'client',
'nb1' : 'server',
'nb2' : 'server',
'nt1' : 'server',
'nt2' : 'server',
'w1' : 'server',
'w2' : 'server',
'w3' : 'server',
'w4' : 'server',
'w1s' : 'server',
'w2s' : 'server',
'w3s' : 'server',
'ns' : 'natbox',
'nm' : 'natbox',
'nw1' : 'natbox',
'nw2' : 'natbox',
'nw3' : 'natbox'
}
system_configs = {
's1' : 'Uni 4GHz',
'm1' : 'Uni 6GHz',
'f1' : 'Uni 8GHz',
'q1' : 'Uni 10GHz',
's2' : 'Dual 4GHz',
'm2' : 'Dual 6GHz',
's4' : 'Quad 4GHz',
'm4' : 'Quad 6GHz' }
configs = ['ste', 'hte', 'htd', 'ocm', 'occ', 'ocp' ]
benchmarks = [ 'm', 'snt', 'w2', 'nm', 'nw2' ]
caches = [ '0', '2', '4' ]
names = []
for bench in benchmarks:
if bench_system[bench] != options.system:
continue
for cache in caches:
names.append([bench, cache])
for bench,cache in names:
base = '%s.%s' % (bench, cache)
fname = 'data/uni.%s.%s.dat' % (tag, base)
f = open(fname, 'w')
print >>f, '#set TITLE = '
print >>f, '#set ylbl = %s' % label
#print >>f, '#set sublabels = %s' % ' '.join(configs)
print >>f, '#set sublabels = ste hte htd ocm occ ocs'
for speed in ('s1', 'm1', 'f1', 'q1'):
label = system_configs[speed]
print >>f, '"%s"' % label,
for conf in configs:
name = '%s.%s.%s.%s' % (conf, bench, cache, speed)
run = info.source.allRunNames[name]
info.display_run = run.run;
val = float(value)
if val == 1e300*1e300:
print >>f, 0.0,
else:
print >>f, "%f" % val,
print >>f
f.close()
configs = ['ste', 'hte', 'htd', 'ocm', 'occ', 'ocp' ]
benchmarks = [ 'w2']
caches = [ '0', '2', '4' ]
names = []
for bench in benchmarks:
if bench_system[bench] != options.system:
continue
for cache in caches:
names.append([bench, cache])
for bench,cache in names:
base = '%s.%s' % (bench, cache)
fname = 'data/mp.%s.%s.dat' % (tag, base)
f = open(fname, 'w')
print >>f, '#set TITLE = '
print >>f, '#set ylbl = %s' % label
#print >>f, '#set sublabels = %s' % ' '.join(configs)
print >>f, '#set sublabels = ste hte htd ocm occ ocs'
for speed in ('s2', 'm2', 's4', 'm4'):
label = system_configs[speed]
print >>f, '"%s"' % label,
for conf in configs:
name = '%s.%s.%s.%s' % (conf, bench, cache, speed)
run = info.source.allRunNames[name]
info.display_run = run.run;
val = float(value)
if val == 1e300*1e300:
print >>f, 0.0,
else:
print >>f, "%f" % val,
print >>f
f.close()
def printdata(runs, value, invert = False):
import info
for run in runs:
info.display_run = run.run;
val = float(value)
printval(run.name, val)
class CommandException(Exception):
pass
@@ -243,7 +105,7 @@ def commands(options, command, args):
info.source.passwd = options.passwd
info.source.user = options.user
info.source.connect()
info.source.update_dict(globals())
#info.source.update_dict(globals())
if type(options.get) is str:
info.source.get = options.get
@@ -270,6 +132,43 @@ def commands(options, command, args):
info.source.listRuns(user)
return
if command == 'stats':
if len(args) == 0:
info.source.listStats()
elif len(args) == 1:
info.source.listStats(args[0])
else:
raise CommandException
return
if command == 'bins':
if len(args) == 0:
info.source.listBins()
elif len(args) == 1:
info.source.listBins(args[0])
else:
raise CommandException
return
if command == 'formulas':
if len(args) == 0:
info.source.listFormulas()
elif len(args) == 1:
info.source.listFormulas(args[0])
else:
raise CommandException
return
if command == 'samples':
if len(args):
raise CommandException
info.source.listTicks(runs)
return
if command == 'stability':
if len(args) < 2:
raise CommandException
@@ -281,16 +180,19 @@ def commands(options, command, args):
stats = info.source.getStat(args[1])
info.source.get = "sum"
def disp(*args):
print "%-20s %12s %12s %4s %5s %5s %5s %10s" % args
# temporary variable containing a bunch of dashes
d = '-' * 100
#loop through all the stats selected
for stat in stats:
print "%s:" % stat.name
print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \
("run name", "average", "stdev", ">10%", ">1SDV", ">2SDV", "SAMP", "CV")
print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \
("--------------------", "------------",
"------------", "----", "-----", "-----", "-----", "----------")
disp("run name", "average", "stdev", ">10%", ">1SDV", ">2SDV",
"SAMP", "CV")
disp(d[:20], d[:12], d[:12], d[:4], d[:5], d[:5], d[:5], d[:10])
#loop through all the selected runs
for run in runs:
info.display_run = run.run;
@@ -331,130 +233,63 @@ def commands(options, command, args):
if (val < (avg - (2*stdev))) or (val > (avg + (2*stdev))):
numoutside2std += 1
if avg > 1000:
print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \
(run.name, "%.1f" % avg, "%.1f" % stdev,
"%d" % numoutsideavg, "%d" % numoutside1std,
"%d" % numoutside2std, "%d" % len(pairRunTicks),
"%.3f" % (stdev/avg*100))
disp(run.name, "%.1f" % avg, "%.1f" % stdev,
"%d" % numoutsideavg, "%d" % numoutside1std,
"%d" % numoutside2std, "%d" % len(pairRunTicks),
"%.3f" % (stdev/avg*100))
elif avg > 100:
print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \
(run.name, "%.1f" % avg, "%.1f" % stdev,
"%d" % numoutsideavg, "%d" % numoutside1std,
"%d" % numoutside2std, "%d" % len(pairRunTicks),
"%.5f" % (stdev/avg*100))
disp(run.name, "%.1f" % avg, "%.1f" % stdev,
"%d" % numoutsideavg, "%d" % numoutside1std,
"%d" % numoutside2std, "%d" % len(pairRunTicks),
"%.5f" % (stdev/avg*100))
else:
print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \
(run.name, "%.5f" % avg, "%.5f" % stdev,
"%d" % numoutsideavg, "%d" % numoutside1std,
"%d" % numoutside2std, "%d" % len(pairRunTicks),
"%.7f" % (stdev/avg*100))
disp(run.name, "%.5f" % avg, "%.5f" % stdev,
"%d" % numoutsideavg, "%d" % numoutside1std,
"%d" % numoutside2std, "%d" % len(pairRunTicks),
"%.7f" % (stdev/avg*100))
return
if command == 'stats':
if len(args) == 0:
info.source.listStats()
elif len(args) == 1:
info.source.listStats(args[0])
else:
raise CommandException
return
if command == 'stat':
if len(args) != 1:
raise CommandException
stats = info.source.getStat(args[0])
for stat in stats:
if options.graph:
graphdata(runs, options, stat.name, stat.name, stat)
else:
if options.ticks:
print 'only displaying sample %s' % options.ticks
info.globalTicks = [ int(x) for x in options.ticks.split() ]
if options.binned:
print 'kernel ticks'
stat.bins = 'kernel'
printdata(runs, stat)
print 'idle ticks'
stat.bins = 'idle'
printdata(runs, stat)
print 'user ticks'
stat.bins = 'user'
printdata(runs, stat)
print 'interrupt ticks'
stat.bins = 'interrupt'
printdata(runs, stat)
print 'total ticks'
stat.bins = None
print stat.name
printdata(runs, stat)
return
if command == 'formula':
if len(args) != 1:
raise CommandException
stats = eval(args[0])
for stat in stats:
if options.graph:
graphdata(runs, options, stat.name, stat.name, stat)
else:
if options.binned:
print 'kernel ticks'
stat.bins = 'kernel'
printdata(runs, stat)
print 'idle ticks'
stat.bins = 'idle'
printdata(runs, stat)
print 'user ticks'
stat.bins = 'user'
printdata(runs, stat)
print 'interrupt ticks'
stat.bins = 'interrupt'
printdata(runs, stat)
print 'total ticks'
stat.bins = None
print args[0]
printdata(runs, stat)
return
if command == 'bins':
if len(args) == 0:
info.source.listBins()
elif len(args) == 1:
info.source.listBins(args[0])
else:
raise CommandException
return
if command == 'formulas':
if len(args) == 0:
info.source.listFormulas()
elif len(args) == 1:
info.source.listFormulas(args[0])
else:
raise CommandException
return
if command == 'samples':
if command == 'all':
if len(args):
raise CommandException
info.source.listTicks(runs)
all = [ 'bps', 'rxbps', 'txbps', 'bpt',
'misses', 'mpkb',
'ipkb',
'pps', 'bpp', 'txbpp', 'rxbpp',
'rtp', 'rtb' ]
for command in all:
commands(options, command, args)
if options.ticks:
if not options.graph:
print 'only displaying sample %s' % options.ticks
info.globalTicks = [ int(x) for x in options.ticks.split() ]
from output import StatOutput
def display():
if options.graph:
output.graph(options.graphdir)
else:
output.display(options.binned, options.printmode)
if command == 'stat' or command == 'formula':
if len(args) != 1:
raise CommandException
if command == 'stat':
stats = info.source.getStat(args[0])
if command == 'formula':
stats = eval(args[0])
for stat in stats:
output = StatOutput(stat.name, options.jobfile)
output.stat = stat
output.label = stat.name
display()
return
if len(args):
@@ -462,273 +297,151 @@ def commands(options, command, args):
system = info.source.__dict__[options.system]
from proxy import ProxyGroup
sim_ticks = info.source['sim_ticks']
sim_seconds = info.source['sim_seconds']
proxy = ProxyGroup(system = info.source[options.system])
system = proxy.system
etherdev = system.tsunami.etherdev0
bytes = etherdev.rxBytes + etherdev.txBytes
kbytes = bytes / 1024
packets = etherdev.rxPackets + etherdev.txPackets
bps = etherdev.rxBandwidth + etherdev.txBandwidth
output = StatOutput(command, options.jobfile)
if command == 'usertime':
import copy
kernel = copy.copy(system.full0.numCycles)
kernel.bins = 'kernel'
user = copy.copy(system.full0.numCycles)
user.bins = 'user'
if options.graph:
graphdata(runs, options, 'usertime', 'User Fraction',
user / system.full0.numCycles)
else:
printdata(runs, user / system.full0.numCycles)
output.stat = user / system.full0.numCycles
output.label = 'User Fraction'
display()
return
if command == 'ticks':
if options.binned:
print 'kernel ticks'
system.full0.numCycles.bins = 'kernel'
printdata(runs, system.full0.numCycles)
print 'idle ticks'
system.full0.numCycles.bins = 'idle'
printdata(runs, system.full0.numCycles)
print 'user ticks'
system.full0.numCycles.bins = 'user'
printdata(runs, system.full0.numCycles)
print 'total ticks'
system.full0.numCycles.bins = None
printdata(runs, system.full0.numCycles)
return
if command == 'packets':
packets = system.tsunami.etherdev0.rxPackets
if options.graph:
graphdata(runs, options, 'packets', 'Packets', packets)
else:
printdata(runs, packets)
return
if command == 'ppt' or command == 'tpp':
ppt = system.tsunami.etherdev0.rxPackets / sim_ticks
printdata(runs, ppt, command == 'tpp')
return
if command == 'pps':
pps = system.tsunami.etherdev0.rxPackets / sim_seconds
if options.graph:
graphdata(runs, options, 'pps', 'Packets/s', pps)
else:
printdata(runs, pps)
return
if command == 'bpt' or command == 'tpb':
bytes = system.tsunami.etherdev0.rxBytes + system.tsunami.etherdev0.txBytes
bpt = bytes / sim_ticks * 8
if options.graph:
graphdata(runs, options, 'bpt', 'bps / Hz', bpt)
else:
printdata(runs, bpt, command == 'tpb')
return
if command == 'bptb' or command == 'tpbb':
bytes = system.tsunami.etherdev0.rxBytes + system.tsunami.etherdev0.txBytes
print 'kernel stats'
bytes.bins = 'kernel'
printdata(runs, bytes / ticks)
print 'idle stats'
bytes.bins = 'idle'
printdata(runs, bytes / ticks)
print 'user stats'
bytes.bins = 'user'
printdata(runs, bytes / ticks)
output.stat = system.full0.numCycles
output.binstats = [ system.full0.numCycles ]
display()
return
if command == 'bytes':
stat = system.tsunami.etherdev0.rxBytes + system.tsunami.etherdev0.txBytes
output.stat = bytes
display()
return
if options.binned:
print '%s kernel stats' % stat.name
stat.bins = 'kernel'
printdata(runs, stat)
if command == 'packets':
output.stat = packets
display()
return
print '%s idle stats' % stat.name
stat.bins = 'idle'
printdata(runs, stat)
if command == 'ppt' or command == 'tpp':
output.stat = packets / sim_ticks
output.invert = command == 'tpp'
display()
return
print '%s user stats' % stat.name
stat.bins = 'user'
printdata(runs, stat)
if command == 'pps':
output.stat = packets / sim_seconds
output.label = 'Packets/s'
display()
return
print '%s total stats' % stat.name
stat.bins = None
printdata(runs, stat)
if command == 'bpt' or command == 'tpb':
output.stat = bytes / sim_ticks * 8
output.label = 'bps / Hz'
output.invert = command == 'tpb'
display()
return
if command == 'rxbps':
gbps = system.tsunami.etherdev0.rxBandwidth / 1e9
if options.graph:
graphdata(runs, options, 'rxbps', 'Bandwidth (Gbps)', gbps)
else:
printdata(runs, gbps)
output.stat = etherdev.rxBandwidth / 1e9
output.label = 'Bandwidth (Gbps)'
display()
return
if command == 'txbps':
gbps = system.tsunami.etherdev0.txBandwidth / 1e9
if options.graph:
graphdata(runs, options, 'txbps', 'Bandwidth (Gbps)', gbps)
else:
printdata(runs, gbps)
output.stat = etherdev.txBandwidth / 1e9
output.label = 'Bandwidth (Gbps)'
display()
return
if command == 'bps':
rxbps = system.tsunami.etherdev0.rxBandwidth
txbps = system.tsunami.etherdev0.txBandwidth
gbps = (rxbps + txbps) / 1e9
if options.graph:
graphdata(runs, options, 'bps', 'Bandwidth (Gbps)', gbps)
else:
printdata(runs, gbps)
output.stat = bps / 1e9
output.label = 'Bandwidth (Gbps)'
display()
return
if command == 'bpp':
output.stat = bytes / packets
output.label = 'Bytes / Packet'
display()
return
if command == 'rxbpp':
output.stat = etherdev.rxBytes / etherdev.rxPackets
output.label = 'Receive Bytes / Packet'
display()
return
if command == 'txbpp':
output.stat = etherdev.txBytes / etherdev.txPackets
output.label = 'Transmit Bytes / Packet'
display()
return
if command == 'rtp':
output.stat = etherdev.rxPackets / etherdev.txPackets
output.label = 'rxPackets / txPackets'
display()
return
if command == 'rtb':
output.stat = etherdev.rxBytes / etherdev.txBytes
output.label = 'rxBytes / txBytes'
display()
return
misses = system.l2.overall_mshr_misses
if command == 'misses':
stat = system.l2.overall_mshr_misses
if options.binned:
print '%s kernel stats' % stat.name
stat.bins = 'kernel'
printdata(runs, stat)
print '%s idle stats' % stat.name
stat.bins = 'idle'
printdata(runs, stat)
print '%s user stats' % stat.name
stat.bins = 'user'
printdata(runs, stat)
print '%s total stats' % stat.name
stat.bins = None
if options.graph:
graphdata(runs, options, 'misses', 'Overall MSHR Misses', stat)
else:
printdata(runs, stat)
output.stat = misses
output.label = 'Overall MSHR Misses'
display()
return
if command == 'mpkb':
misses = system.l2.overall_mshr_misses
rxbytes = system.tsunami.etherdev0.rxBytes
txbytes = system.tsunami.etherdev0.txBytes
if options.binned:
print 'mpkb kernel stats'
misses.bins = 'kernel'
mpkb = misses / ((rxbytes + txbytes) / 1024)
printdata(runs, mpkb)
print 'mpkb idle stats'
misses.bins = 'idle'
mpkb = misses / ((rxbytes + txbytes) / 1024)
printdata(runs, mpkb)
print 'mpkb user stats'
misses.bins = 'user'
mpkb = misses / ((rxbytes + txbytes) / 1024)
printdata(runs, mpkb)
print 'mpkb total stats'
mpkb = misses / ((rxbytes + txbytes) / 1024)
misses.bins = None
if options.graph:
graphdata(runs, options, 'mpkb', 'Misses / KB', mpkb)
else:
printdata(runs, mpkb)
output.stat = misses / (bytes / 1024)
output.binstats = [ misses ]
output.label = 'Misses / KB'
display()
return
if command == 'ipkb':
interrupts = system.full0.kern.faults[4]
rxbytes = system.tsunami.etherdev0.rxBytes
txbytes = system.tsunami.etherdev0.txBytes
if options.binned:
print 'ipkb kernel stats'
interrupts.bins = 'kernel'
ipkb = interrupts / ((rxbytes + txbytes) / 1024)
printdata(runs, ipkb)
print 'ipkb idle stats'
interrupts.bins = 'idle'
ipkb = interrupts / ((rxbytes + txbytes) / 1024)
printdata(runs, ipkb)
print 'ipkb user stats'
interrupts.bins = 'user'
ipkb = interrupts / ((rxbytes + txbytes) / 1024)
printdata(runs, ipkb)
print 'ipkb total stats'
ipkb = interrupts / ((rxbytes + txbytes) / 1024)
interrupts.bins = None
if options.graph:
graphdata(runs, options, 'ipkb', 'Interrupts / KB', ipkb)
else:
printdata(runs, ipkb)
output.stat = interrupts / kbytes
output.binstats = [ interrupts ]
output.label = 'Interrupts / KB'
display()
return
if command == 'execute':
printdata(runs, system.full0.ISSUE__count)
output.stat = system.full0.ISSUE__count
display()
return
if command == 'commit':
printdata(runs, system.full0.COM__count)
output.stat = system.full0.COM__count
display()
return
if command == 'fetch':
printdata(runs, system.full0.FETCH__count)
return
if command == 'bpp':
ed = system.tsunami.etherdev0
bpp = (ed.rxBytes + ed.txBytes) / (ed.rxPackets + ed.txPackets)
if options.graph:
graphdata(runs, options, 'bpp', 'Bytes / Packet', bpp)
else:
printdata(runs, bpp)
return
if command == 'rxbpp':
bpp = system.tsunami.etherdev0.rxBytes / system.tsunami.etherdev0.rxPackets
if options.graph:
graphdata(runs, options, 'rxbpp', 'Receive Bytes / Packet', bpp)
else:
printdata(runs, bpp)
return
if command == 'txbpp':
bpp = system.tsunami.etherdev0.txBytes / system.tsunami.etherdev0.txPackets
if options.graph:
graphdata(runs, options, 'txbpp', 'Transmit Bytes / Packet', bpp)
else:
printdata(runs, bpp)
return
if command == 'rtp':
rtp = system.tsunami.etherdev0.rxPackets / system.tsunami.etherdev0.txPackets
if options.graph:
graphdata(runs, options, 'rtp', 'rxPackets / txPackets', rtp)
else:
printdata(runs, rtp)
return
if command == 'rtb':
rtb = system.tsunami.etherdev0.rxBytes / system.tsunami.etherdev0.txBytes
if options.graph:
graphdata(runs, options, 'rtb', 'rxBytes / txBytes', rtb)
else:
printdata(runs, rtb)
output.stat = system.full0.FETCH__count
display()
return
raise CommandException
@@ -738,9 +451,10 @@ class Options: pass
if __name__ == '__main__':
import getpass
from jobfile import JobFile
options = Options()
options.host = 'zizzer.pool'
options.host = None
options.db = None
options.passwd = ''
options.user = getpass.getuser()
@@ -750,23 +464,31 @@ if __name__ == '__main__':
options.binned = False
options.graph = False
options.ticks = False
options.printmode = 'G'
options.jobfile = None
options.all = False
opts, args = getopts(sys.argv[1:], '-6BEFGd:g:h:pr:s:u:T:')
opts, args = getopts(sys.argv[1:], '-BEFG:ad:g:h:j:pr:s:u:T:')
for o,a in opts:
if o == '-B':
options.binned = True
if o == '-E':
printval.mode = 'E'
options.printmode = 'E'
if o == '-F':
printval.mode = 'F'
options.printmode = 'F'
if o == '-G':
options.graph = True;
options.get = a
if o == '-a':
options.all = True
if o == '-d':
options.db = a
if o == '-g':
options.get = a
options.graph = True;
options.graphdir = a
if o == '-h':
options.host = a
if o == '-j':
options.jobfile = JobFile(a)
if o == '-p':
options.passwd = getpass.getpass()
if o == '-r':
@@ -778,6 +500,18 @@ if __name__ == '__main__':
if o == '-T':
options.ticks = a
if options.jobfile:
if not options.host:
options.host = options.jobfile.dbhost
if not options.db:
options.db = options.jobfile.statdb
if not options.host:
sys.exit('Database server must be provided from a jobfile or -h')
if not options.db:
sys.exit('Database name must be provided from a jobfile or -d')
if len(args) == 0:
usage()