stats.py revision 1881
11049Sbinkertn@umich.edu#!/usr/bin/env python 21758Ssaidi@eecs.umich.edu 31758Ssaidi@eecs.umich.edu# Copyright (c) 2003-2004 The Regents of The University of Michigan 41758Ssaidi@eecs.umich.edu# All rights reserved. 51758Ssaidi@eecs.umich.edu# 61758Ssaidi@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 71758Ssaidi@eecs.umich.edu# modification, are permitted provided that the following conditions are 81758Ssaidi@eecs.umich.edu# met: redistributions of source code must retain the above copyright 91758Ssaidi@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 101758Ssaidi@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 111758Ssaidi@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 121758Ssaidi@eecs.umich.edu# documentation and/or other materials provided with the distribution; 131758Ssaidi@eecs.umich.edu# neither the name of the copyright holders nor the names of its 141758Ssaidi@eecs.umich.edu# contributors may be used to endorse or promote products derived from 151758Ssaidi@eecs.umich.edu# this software without specific prior written permission. 161758Ssaidi@eecs.umich.edu# 171758Ssaidi@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 181758Ssaidi@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 191758Ssaidi@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 201758Ssaidi@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 211758Ssaidi@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 221758Ssaidi@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 231758Ssaidi@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 241758Ssaidi@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 251758Ssaidi@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 261758Ssaidi@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 271758Ssaidi@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 281758Ssaidi@eecs.umich.edu 291049Sbinkertn@umich.edufrom __future__ import division 301318Ssaidi@eecs.umich.eduimport re, sys, math 311049Sbinkertn@umich.edu 321049Sbinkertn@umich.edudef usage(): 331049Sbinkertn@umich.edu print '''\ 341881Sbinkertn@umich.eduUsage: %s [-E] [-F] [ -G <get> ] [-d <db> ] [-g <graphdir> ] [-h <host>] [-p] 351331Ssaidi@eecs.umich.edu [-s <system>] [-r <runs> ] [-T <samples>] [-u <username>] 361331Ssaidi@eecs.umich.edu <command> [command args] 371331Ssaidi@eecs.umich.edu 381331Ssaidi@eecs.umich.edu commands extra parameters description 391331Ssaidi@eecs.umich.edu ----------- ------------------ --------------------------------------- 401331Ssaidi@eecs.umich.edu bins [regex] List bins (only matching regex) 411331Ssaidi@eecs.umich.edu formula <formula> Evaluated formula specified 421331Ssaidi@eecs.umich.edu formulas [regex] List formulas (only matching regex) 431331Ssaidi@eecs.umich.edu runs none List all runs in database 441331Ssaidi@eecs.umich.edu samples none List samples present in database 451331Ssaidi@eecs.umich.edu stability <pairnum> <stats> Calculated statistical info about stats 461331Ssaidi@eecs.umich.edu stat <regex> Show stat data (only matching regex) 471331Ssaidi@eecs.umich.edu stats [regex] List all stats (only matching regex) 481596Ssaidi@eecs.umich.edu 491596Ssaidi@eecs.umich.edu database <command> Where command is drop, init, or clean 501596Ssaidi@eecs.umich.edu 511049Sbinkertn@umich.edu''' % sys.argv[0] 521049Sbinkertn@umich.edu sys.exit(1) 531049Sbinkertn@umich.edu 541049Sbinkertn@umich.edudef getopts(list, flags): 551049Sbinkertn@umich.edu import getopt 561049Sbinkertn@umich.edu try: 571049Sbinkertn@umich.edu opts, args = getopt.getopt(list, flags) 581049Sbinkertn@umich.edu except getopt.GetoptError: 591049Sbinkertn@umich.edu usage() 601049Sbinkertn@umich.edu 611049Sbinkertn@umich.edu return opts, args 621049Sbinkertn@umich.edu 631049Sbinkertn@umich.educlass CommandException(Exception): 641049Sbinkertn@umich.edu pass 651049Sbinkertn@umich.edu 661049Sbinkertn@umich.edudef commands(options, command, args): 671049Sbinkertn@umich.edu if command == 'database': 681049Sbinkertn@umich.edu if len(args) == 0: raise CommandException 691049Sbinkertn@umich.edu 701049Sbinkertn@umich.edu import dbinit 711049Sbinkertn@umich.edu mydb = dbinit.MyDB(options) 721049Sbinkertn@umich.edu 731049Sbinkertn@umich.edu if args[0] == 'drop': 741049Sbinkertn@umich.edu if len(args) > 2: raise CommandException 751049Sbinkertn@umich.edu mydb.admin() 761049Sbinkertn@umich.edu mydb.drop() 771049Sbinkertn@umich.edu if len(args) == 2 and args[1] == 'init': 781049Sbinkertn@umich.edu mydb.create() 791049Sbinkertn@umich.edu mydb.connect() 801049Sbinkertn@umich.edu mydb.populate() 811049Sbinkertn@umich.edu mydb.close() 821049Sbinkertn@umich.edu return 831049Sbinkertn@umich.edu 841049Sbinkertn@umich.edu if args[0] == 'init': 851049Sbinkertn@umich.edu if len(args) > 1: raise CommandException 861049Sbinkertn@umich.edu mydb.admin() 871049Sbinkertn@umich.edu mydb.create() 881049Sbinkertn@umich.edu mydb.connect() 891049Sbinkertn@umich.edu mydb.populate() 901049Sbinkertn@umich.edu mydb.close() 911049Sbinkertn@umich.edu return 921049Sbinkertn@umich.edu 931049Sbinkertn@umich.edu if args[0] == 'clean': 941049Sbinkertn@umich.edu if len(args) > 1: raise CommandException 951049Sbinkertn@umich.edu mydb.connect() 961049Sbinkertn@umich.edu mydb.clean() 971049Sbinkertn@umich.edu return 981049Sbinkertn@umich.edu 991049Sbinkertn@umich.edu raise CommandException 1001049Sbinkertn@umich.edu 1011049Sbinkertn@umich.edu import db, info 1021049Sbinkertn@umich.edu info.source = db.Database() 1031049Sbinkertn@umich.edu info.source.host = options.host 1041049Sbinkertn@umich.edu info.source.db = options.db 1051049Sbinkertn@umich.edu info.source.passwd = options.passwd 1061049Sbinkertn@umich.edu info.source.user = options.user 1071049Sbinkertn@umich.edu info.source.connect() 1081881Sbinkertn@umich.edu #info.source.update_dict(globals()) 1091049Sbinkertn@umich.edu 1101049Sbinkertn@umich.edu if type(options.get) is str: 1111049Sbinkertn@umich.edu info.source.get = options.get 1121049Sbinkertn@umich.edu 1131049Sbinkertn@umich.edu if options.runs is None: 1141049Sbinkertn@umich.edu runs = info.source.allRuns 1151049Sbinkertn@umich.edu else: 1161049Sbinkertn@umich.edu rx = re.compile(options.runs) 1171049Sbinkertn@umich.edu runs = [] 1181049Sbinkertn@umich.edu for run in info.source.allRuns: 1191049Sbinkertn@umich.edu if rx.match(run.name): 1201049Sbinkertn@umich.edu runs.append(run) 1211049Sbinkertn@umich.edu 1221049Sbinkertn@umich.edu info.display_run = runs[0].run 1231049Sbinkertn@umich.edu 1241049Sbinkertn@umich.edu if command == 'runs': 1251049Sbinkertn@umich.edu user = None 1261049Sbinkertn@umich.edu opts, args = getopts(args, '-u') 1271049Sbinkertn@umich.edu if len(args): 1281049Sbinkertn@umich.edu raise CommandException 1291049Sbinkertn@umich.edu for o,a in opts: 1301049Sbinkertn@umich.edu if o == '-u': 1311049Sbinkertn@umich.edu user = a 1321049Sbinkertn@umich.edu info.source.listRuns(user) 1331049Sbinkertn@umich.edu return 1341049Sbinkertn@umich.edu 1351881Sbinkertn@umich.edu if command == 'stats': 1361881Sbinkertn@umich.edu if len(args) == 0: 1371881Sbinkertn@umich.edu info.source.listStats() 1381881Sbinkertn@umich.edu elif len(args) == 1: 1391881Sbinkertn@umich.edu info.source.listStats(args[0]) 1401881Sbinkertn@umich.edu else: 1411881Sbinkertn@umich.edu raise CommandException 1421881Sbinkertn@umich.edu 1431881Sbinkertn@umich.edu return 1441881Sbinkertn@umich.edu 1451881Sbinkertn@umich.edu if command == 'bins': 1461881Sbinkertn@umich.edu if len(args) == 0: 1471881Sbinkertn@umich.edu info.source.listBins() 1481881Sbinkertn@umich.edu elif len(args) == 1: 1491881Sbinkertn@umich.edu info.source.listBins(args[0]) 1501881Sbinkertn@umich.edu else: 1511881Sbinkertn@umich.edu raise CommandException 1521881Sbinkertn@umich.edu 1531881Sbinkertn@umich.edu return 1541881Sbinkertn@umich.edu 1551881Sbinkertn@umich.edu if command == 'formulas': 1561881Sbinkertn@umich.edu if len(args) == 0: 1571881Sbinkertn@umich.edu info.source.listFormulas() 1581881Sbinkertn@umich.edu elif len(args) == 1: 1591881Sbinkertn@umich.edu info.source.listFormulas(args[0]) 1601881Sbinkertn@umich.edu else: 1611881Sbinkertn@umich.edu raise CommandException 1621881Sbinkertn@umich.edu 1631881Sbinkertn@umich.edu return 1641881Sbinkertn@umich.edu 1651881Sbinkertn@umich.edu if command == 'samples': 1661881Sbinkertn@umich.edu if len(args): 1671881Sbinkertn@umich.edu raise CommandException 1681881Sbinkertn@umich.edu 1691881Sbinkertn@umich.edu info.source.listTicks(runs) 1701881Sbinkertn@umich.edu return 1711881Sbinkertn@umich.edu 1721309Ssaidi@eecs.umich.edu if command == 'stability': 1731331Ssaidi@eecs.umich.edu if len(args) < 2: 1741331Ssaidi@eecs.umich.edu raise CommandException 1751331Ssaidi@eecs.umich.edu 1761331Ssaidi@eecs.umich.edu try: 1771331Ssaidi@eecs.umich.edu merge = int(args[0]) 1781331Ssaidi@eecs.umich.edu except ValueError: 1791331Ssaidi@eecs.umich.edu usage() 1801331Ssaidi@eecs.umich.edu stats = info.source.getStat(args[1]) 1811331Ssaidi@eecs.umich.edu info.source.get = "sum" 1821331Ssaidi@eecs.umich.edu 1831881Sbinkertn@umich.edu def disp(*args): 1841881Sbinkertn@umich.edu print "%-20s %12s %12s %4s %5s %5s %5s %10s" % args 1851881Sbinkertn@umich.edu 1861881Sbinkertn@umich.edu # temporary variable containing a bunch of dashes 1871881Sbinkertn@umich.edu d = '-' * 100 1881309Ssaidi@eecs.umich.edu 1891309Ssaidi@eecs.umich.edu #loop through all the stats selected 1901309Ssaidi@eecs.umich.edu for stat in stats: 1911881Sbinkertn@umich.edu print "%s:" % stat.name 1921881Sbinkertn@umich.edu disp("run name", "average", "stdev", ">10%", ">1SDV", ">2SDV", 1931881Sbinkertn@umich.edu "SAMP", "CV") 1941881Sbinkertn@umich.edu disp(d[:20], d[:12], d[:12], d[:4], d[:5], d[:5], d[:5], d[:10]) 1951309Ssaidi@eecs.umich.edu 1961309Ssaidi@eecs.umich.edu #loop through all the selected runs 1971309Ssaidi@eecs.umich.edu for run in runs: 1981309Ssaidi@eecs.umich.edu info.display_run = run.run; 1991309Ssaidi@eecs.umich.edu runTicks = info.source.retTicks([ run ]) 2001309Ssaidi@eecs.umich.edu #throw away the first one, it's 0 2011309Ssaidi@eecs.umich.edu runTicks.pop(0) 2021329Ssaidi@eecs.umich.edu info.globalTicks = runTicks 2031331Ssaidi@eecs.umich.edu avg = 0 2041317Ssaidi@eecs.umich.edu stdev = 0 2051317Ssaidi@eecs.umich.edu numoutsideavg = 0 2061318Ssaidi@eecs.umich.edu numoutside1std = 0 2071318Ssaidi@eecs.umich.edu numoutside2std = 0 2081331Ssaidi@eecs.umich.edu pairRunTicks = [] 2091331Ssaidi@eecs.umich.edu if float(stat) == 1e300*1e300: 2101331Ssaidi@eecs.umich.edu continue 2111331Ssaidi@eecs.umich.edu for t in range(0, len(runTicks)-(merge-1), merge): 2121331Ssaidi@eecs.umich.edu tempPair = [] 2131331Ssaidi@eecs.umich.edu for p in range(0,merge): 2141331Ssaidi@eecs.umich.edu tempPair.append(runTicks[t+p]) 2151331Ssaidi@eecs.umich.edu pairRunTicks.append(tempPair) 2161309Ssaidi@eecs.umich.edu #loop through all the various ticks for each run 2171331Ssaidi@eecs.umich.edu for tick in pairRunTicks: 2181331Ssaidi@eecs.umich.edu info.globalTicks = tick 2191331Ssaidi@eecs.umich.edu avg += float(stat) 2201331Ssaidi@eecs.umich.edu avg /= len(pairRunTicks) 2211331Ssaidi@eecs.umich.edu for tick in pairRunTicks: 2221331Ssaidi@eecs.umich.edu info.globalTicks = tick 2231331Ssaidi@eecs.umich.edu val = float(stat) 2241331Ssaidi@eecs.umich.edu stdev += pow((val-avg),2) 2251331Ssaidi@eecs.umich.edu stdev = math.sqrt(stdev / len(pairRunTicks)) 2261331Ssaidi@eecs.umich.edu for tick in pairRunTicks: 2271331Ssaidi@eecs.umich.edu info.globalTicks = tick 2281309Ssaidi@eecs.umich.edu val = float(stat) 2291309Ssaidi@eecs.umich.edu if (val < (avg * .9)) or (val > (avg * 1.1)): 2301317Ssaidi@eecs.umich.edu numoutsideavg += 1 2311317Ssaidi@eecs.umich.edu if (val < (avg - stdev)) or (val > (avg + stdev)): 2321318Ssaidi@eecs.umich.edu numoutside1std += 1 2331318Ssaidi@eecs.umich.edu if (val < (avg - (2*stdev))) or (val > (avg + (2*stdev))): 2341318Ssaidi@eecs.umich.edu numoutside2std += 1 2351331Ssaidi@eecs.umich.edu if avg > 1000: 2361881Sbinkertn@umich.edu disp(run.name, "%.1f" % avg, "%.1f" % stdev, 2371881Sbinkertn@umich.edu "%d" % numoutsideavg, "%d" % numoutside1std, 2381881Sbinkertn@umich.edu "%d" % numoutside2std, "%d" % len(pairRunTicks), 2391881Sbinkertn@umich.edu "%.3f" % (stdev/avg*100)) 2401331Ssaidi@eecs.umich.edu elif avg > 100: 2411881Sbinkertn@umich.edu disp(run.name, "%.1f" % avg, "%.1f" % stdev, 2421881Sbinkertn@umich.edu "%d" % numoutsideavg, "%d" % numoutside1std, 2431881Sbinkertn@umich.edu "%d" % numoutside2std, "%d" % len(pairRunTicks), 2441881Sbinkertn@umich.edu "%.5f" % (stdev/avg*100)) 2451331Ssaidi@eecs.umich.edu else: 2461881Sbinkertn@umich.edu disp(run.name, "%.5f" % avg, "%.5f" % stdev, 2471881Sbinkertn@umich.edu "%d" % numoutsideavg, "%d" % numoutside1std, 2481881Sbinkertn@umich.edu "%d" % numoutside2std, "%d" % len(pairRunTicks), 2491881Sbinkertn@umich.edu "%.7f" % (stdev/avg*100)) 2501309Ssaidi@eecs.umich.edu return 2511309Ssaidi@eecs.umich.edu 2521881Sbinkertn@umich.edu if command == 'all': 2531881Sbinkertn@umich.edu if len(args): 2541049Sbinkertn@umich.edu raise CommandException 2551049Sbinkertn@umich.edu 2561881Sbinkertn@umich.edu all = [ 'bps', 'rxbps', 'txbps', 'bpt', 2571881Sbinkertn@umich.edu 'misses', 'mpkb', 2581881Sbinkertn@umich.edu 'ipkb', 2591881Sbinkertn@umich.edu 'pps', 'bpp', 'txbpp', 'rxbpp', 2601881Sbinkertn@umich.edu 'rtp', 'rtb' ] 2611881Sbinkertn@umich.edu for command in all: 2621881Sbinkertn@umich.edu commands(options, command, args) 2631049Sbinkertn@umich.edu 2641881Sbinkertn@umich.edu if options.ticks: 2651881Sbinkertn@umich.edu if not options.graph: 2661881Sbinkertn@umich.edu print 'only displaying sample %s' % options.ticks 2671881Sbinkertn@umich.edu info.globalTicks = [ int(x) for x in options.ticks.split() ] 2681881Sbinkertn@umich.edu 2691881Sbinkertn@umich.edu from output import StatOutput 2701881Sbinkertn@umich.edu 2711881Sbinkertn@umich.edu def display(): 2721881Sbinkertn@umich.edu if options.graph: 2731881Sbinkertn@umich.edu output.graph(options.graphdir) 2741881Sbinkertn@umich.edu else: 2751881Sbinkertn@umich.edu output.display(options.binned, options.printmode) 2761881Sbinkertn@umich.edu 2771881Sbinkertn@umich.edu 2781881Sbinkertn@umich.edu if command == 'stat' or command == 'formula': 2791049Sbinkertn@umich.edu if len(args) != 1: 2801049Sbinkertn@umich.edu raise CommandException 2811049Sbinkertn@umich.edu 2821881Sbinkertn@umich.edu if command == 'stat': 2831881Sbinkertn@umich.edu stats = info.source.getStat(args[0]) 2841881Sbinkertn@umich.edu if command == 'formula': 2851881Sbinkertn@umich.edu stats = eval(args[0]) 2861881Sbinkertn@umich.edu 2871049Sbinkertn@umich.edu for stat in stats: 2881881Sbinkertn@umich.edu output = StatOutput(stat.name, options.jobfile) 2891881Sbinkertn@umich.edu output.stat = stat 2901881Sbinkertn@umich.edu output.label = stat.name 2911881Sbinkertn@umich.edu display() 2921301Ssaidi@eecs.umich.edu 2931049Sbinkertn@umich.edu return 2941049Sbinkertn@umich.edu 2951049Sbinkertn@umich.edu if len(args): 2961049Sbinkertn@umich.edu raise CommandException 2971049Sbinkertn@umich.edu 2981209Sbinkertn@umich.edu system = info.source.__dict__[options.system] 2991209Sbinkertn@umich.edu 3001881Sbinkertn@umich.edu from proxy import ProxyGroup 3011881Sbinkertn@umich.edu sim_ticks = info.source['sim_ticks'] 3021881Sbinkertn@umich.edu sim_seconds = info.source['sim_seconds'] 3031881Sbinkertn@umich.edu proxy = ProxyGroup(system = info.source[options.system]) 3041881Sbinkertn@umich.edu system = proxy.system 3051881Sbinkertn@umich.edu 3061881Sbinkertn@umich.edu etherdev = system.tsunami.etherdev0 3071881Sbinkertn@umich.edu bytes = etherdev.rxBytes + etherdev.txBytes 3081881Sbinkertn@umich.edu kbytes = bytes / 1024 3091881Sbinkertn@umich.edu packets = etherdev.rxPackets + etherdev.txPackets 3101881Sbinkertn@umich.edu bps = etherdev.rxBandwidth + etherdev.txBandwidth 3111881Sbinkertn@umich.edu 3121881Sbinkertn@umich.edu output = StatOutput(command, options.jobfile) 3131881Sbinkertn@umich.edu 3141049Sbinkertn@umich.edu if command == 'usertime': 3151049Sbinkertn@umich.edu import copy 3161604Srdreslin@umich.edu user = copy.copy(system.full0.numCycles) 3171049Sbinkertn@umich.edu user.bins = 'user' 3181049Sbinkertn@umich.edu 3191881Sbinkertn@umich.edu output.stat = user / system.full0.numCycles 3201881Sbinkertn@umich.edu output.label = 'User Fraction' 3211881Sbinkertn@umich.edu 3221881Sbinkertn@umich.edu display() 3231049Sbinkertn@umich.edu return 3241049Sbinkertn@umich.edu 3251049Sbinkertn@umich.edu if command == 'ticks': 3261881Sbinkertn@umich.edu output.stat = system.full0.numCycles 3271881Sbinkertn@umich.edu output.binstats = [ system.full0.numCycles ] 3281049Sbinkertn@umich.edu 3291881Sbinkertn@umich.edu display() 3301881Sbinkertn@umich.edu return 3311049Sbinkertn@umich.edu 3321881Sbinkertn@umich.edu if command == 'bytes': 3331881Sbinkertn@umich.edu output.stat = bytes 3341881Sbinkertn@umich.edu display() 3351049Sbinkertn@umich.edu return 3361049Sbinkertn@umich.edu 3371049Sbinkertn@umich.edu if command == 'packets': 3381881Sbinkertn@umich.edu output.stat = packets 3391881Sbinkertn@umich.edu display() 3401049Sbinkertn@umich.edu return 3411049Sbinkertn@umich.edu 3421049Sbinkertn@umich.edu if command == 'ppt' or command == 'tpp': 3431881Sbinkertn@umich.edu output.stat = packets / sim_ticks 3441881Sbinkertn@umich.edu output.invert = command == 'tpp' 3451881Sbinkertn@umich.edu display() 3461049Sbinkertn@umich.edu return 3471049Sbinkertn@umich.edu 3481049Sbinkertn@umich.edu if command == 'pps': 3491881Sbinkertn@umich.edu output.stat = packets / sim_seconds 3501881Sbinkertn@umich.edu output.label = 'Packets/s' 3511881Sbinkertn@umich.edu display() 3521049Sbinkertn@umich.edu return 3531049Sbinkertn@umich.edu 3541049Sbinkertn@umich.edu if command == 'bpt' or command == 'tpb': 3551881Sbinkertn@umich.edu output.stat = bytes / sim_ticks * 8 3561881Sbinkertn@umich.edu output.label = 'bps / Hz' 3571881Sbinkertn@umich.edu output.invert = command == 'tpb' 3581881Sbinkertn@umich.edu display() 3591049Sbinkertn@umich.edu return 3601049Sbinkertn@umich.edu 3611049Sbinkertn@umich.edu if command == 'rxbps': 3621881Sbinkertn@umich.edu output.stat = etherdev.rxBandwidth / 1e9 3631881Sbinkertn@umich.edu output.label = 'Bandwidth (Gbps)' 3641881Sbinkertn@umich.edu display() 3651049Sbinkertn@umich.edu return 3661049Sbinkertn@umich.edu 3671049Sbinkertn@umich.edu if command == 'txbps': 3681881Sbinkertn@umich.edu output.stat = etherdev.txBandwidth / 1e9 3691881Sbinkertn@umich.edu output.label = 'Bandwidth (Gbps)' 3701881Sbinkertn@umich.edu display() 3711049Sbinkertn@umich.edu return 3721049Sbinkertn@umich.edu 3731049Sbinkertn@umich.edu if command == 'bps': 3741881Sbinkertn@umich.edu output.stat = bps / 1e9 3751881Sbinkertn@umich.edu output.label = 'Bandwidth (Gbps)' 3761881Sbinkertn@umich.edu display() 3771049Sbinkertn@umich.edu return 3781049Sbinkertn@umich.edu 3791881Sbinkertn@umich.edu if command == 'bpp': 3801881Sbinkertn@umich.edu output.stat = bytes / packets 3811881Sbinkertn@umich.edu output.label = 'Bytes / Packet' 3821881Sbinkertn@umich.edu display() 3831881Sbinkertn@umich.edu return 3841881Sbinkertn@umich.edu 3851881Sbinkertn@umich.edu if command == 'rxbpp': 3861881Sbinkertn@umich.edu output.stat = etherdev.rxBytes / etherdev.rxPackets 3871881Sbinkertn@umich.edu output.label = 'Receive Bytes / Packet' 3881881Sbinkertn@umich.edu display() 3891881Sbinkertn@umich.edu return 3901881Sbinkertn@umich.edu 3911881Sbinkertn@umich.edu if command == 'txbpp': 3921881Sbinkertn@umich.edu output.stat = etherdev.txBytes / etherdev.txPackets 3931881Sbinkertn@umich.edu output.label = 'Transmit Bytes / Packet' 3941881Sbinkertn@umich.edu display() 3951881Sbinkertn@umich.edu return 3961881Sbinkertn@umich.edu 3971881Sbinkertn@umich.edu if command == 'rtp': 3981881Sbinkertn@umich.edu output.stat = etherdev.rxPackets / etherdev.txPackets 3991881Sbinkertn@umich.edu output.label = 'rxPackets / txPackets' 4001881Sbinkertn@umich.edu display() 4011881Sbinkertn@umich.edu return 4021881Sbinkertn@umich.edu 4031881Sbinkertn@umich.edu if command == 'rtb': 4041881Sbinkertn@umich.edu output.stat = etherdev.rxBytes / etherdev.txBytes 4051881Sbinkertn@umich.edu output.label = 'rxBytes / txBytes' 4061881Sbinkertn@umich.edu display() 4071881Sbinkertn@umich.edu return 4081881Sbinkertn@umich.edu 4091881Sbinkertn@umich.edu misses = system.l2.overall_mshr_misses 4101881Sbinkertn@umich.edu 4111049Sbinkertn@umich.edu if command == 'misses': 4121881Sbinkertn@umich.edu output.stat = misses 4131881Sbinkertn@umich.edu output.label = 'Overall MSHR Misses' 4141881Sbinkertn@umich.edu display() 4151049Sbinkertn@umich.edu return 4161049Sbinkertn@umich.edu 4171049Sbinkertn@umich.edu if command == 'mpkb': 4181881Sbinkertn@umich.edu output.stat = misses / (bytes / 1024) 4191881Sbinkertn@umich.edu output.binstats = [ misses ] 4201881Sbinkertn@umich.edu output.label = 'Misses / KB' 4211881Sbinkertn@umich.edu display() 4221049Sbinkertn@umich.edu return 4231049Sbinkertn@umich.edu 4241269Sbinkertn@umich.edu if command == 'ipkb': 4251604Srdreslin@umich.edu interrupts = system.full0.kern.faults[4] 4261881Sbinkertn@umich.edu output.stat = interrupts / kbytes 4271881Sbinkertn@umich.edu output.binstats = [ interrupts ] 4281881Sbinkertn@umich.edu output.label = 'Interrupts / KB' 4291881Sbinkertn@umich.edu display() 4301269Sbinkertn@umich.edu return 4311269Sbinkertn@umich.edu 4321049Sbinkertn@umich.edu if command == 'execute': 4331881Sbinkertn@umich.edu output.stat = system.full0.ISSUE__count 4341881Sbinkertn@umich.edu display() 4351049Sbinkertn@umich.edu return 4361049Sbinkertn@umich.edu 4371049Sbinkertn@umich.edu if command == 'commit': 4381881Sbinkertn@umich.edu output.stat = system.full0.COM__count 4391881Sbinkertn@umich.edu display() 4401049Sbinkertn@umich.edu return 4411049Sbinkertn@umich.edu 4421049Sbinkertn@umich.edu if command == 'fetch': 4431881Sbinkertn@umich.edu output.stat = system.full0.FETCH__count 4441881Sbinkertn@umich.edu display() 4451049Sbinkertn@umich.edu return 4461049Sbinkertn@umich.edu 4471049Sbinkertn@umich.edu raise CommandException 4481049Sbinkertn@umich.edu 4491049Sbinkertn@umich.edu 4501049Sbinkertn@umich.educlass Options: pass 4511049Sbinkertn@umich.edu 4521049Sbinkertn@umich.eduif __name__ == '__main__': 4531049Sbinkertn@umich.edu import getpass 4541881Sbinkertn@umich.edu from jobfile import JobFile 4551049Sbinkertn@umich.edu 4561049Sbinkertn@umich.edu options = Options() 4571881Sbinkertn@umich.edu options.host = None 4581049Sbinkertn@umich.edu options.db = None 4591049Sbinkertn@umich.edu options.passwd = '' 4601049Sbinkertn@umich.edu options.user = getpass.getuser() 4611049Sbinkertn@umich.edu options.runs = None 4621049Sbinkertn@umich.edu options.system = 'client' 4631049Sbinkertn@umich.edu options.get = None 4641076Sbinkertn@umich.edu options.binned = False 4651076Sbinkertn@umich.edu options.graph = False 4661301Ssaidi@eecs.umich.edu options.ticks = False 4671881Sbinkertn@umich.edu options.printmode = 'G' 4681881Sbinkertn@umich.edu options.jobfile = None 4691881Sbinkertn@umich.edu options.all = False 4701049Sbinkertn@umich.edu 4711881Sbinkertn@umich.edu opts, args = getopts(sys.argv[1:], '-BEFG:ad:g:h:j:pr:s:u:T:') 4721049Sbinkertn@umich.edu for o,a in opts: 4731049Sbinkertn@umich.edu if o == '-B': 4741049Sbinkertn@umich.edu options.binned = True 4751049Sbinkertn@umich.edu if o == '-E': 4761881Sbinkertn@umich.edu options.printmode = 'E' 4771049Sbinkertn@umich.edu if o == '-F': 4781881Sbinkertn@umich.edu options.printmode = 'F' 4791049Sbinkertn@umich.edu if o == '-G': 4801881Sbinkertn@umich.edu options.get = a 4811881Sbinkertn@umich.edu if o == '-a': 4821881Sbinkertn@umich.edu options.all = True 4831049Sbinkertn@umich.edu if o == '-d': 4841049Sbinkertn@umich.edu options.db = a 4851049Sbinkertn@umich.edu if o == '-g': 4861881Sbinkertn@umich.edu options.graph = True; 4871881Sbinkertn@umich.edu options.graphdir = a 4881049Sbinkertn@umich.edu if o == '-h': 4891049Sbinkertn@umich.edu options.host = a 4901881Sbinkertn@umich.edu if o == '-j': 4911881Sbinkertn@umich.edu options.jobfile = JobFile(a) 4921049Sbinkertn@umich.edu if o == '-p': 4931049Sbinkertn@umich.edu options.passwd = getpass.getpass() 4941049Sbinkertn@umich.edu if o == '-r': 4951049Sbinkertn@umich.edu options.runs = a 4961049Sbinkertn@umich.edu if o == '-u': 4971049Sbinkertn@umich.edu options.user = a 4981049Sbinkertn@umich.edu if o == '-s': 4991049Sbinkertn@umich.edu options.system = a 5001301Ssaidi@eecs.umich.edu if o == '-T': 5011301Ssaidi@eecs.umich.edu options.ticks = a 5021049Sbinkertn@umich.edu 5031881Sbinkertn@umich.edu if options.jobfile: 5041881Sbinkertn@umich.edu if not options.host: 5051881Sbinkertn@umich.edu options.host = options.jobfile.dbhost 5061881Sbinkertn@umich.edu if not options.db: 5071881Sbinkertn@umich.edu options.db = options.jobfile.statdb 5081881Sbinkertn@umich.edu 5091881Sbinkertn@umich.edu if not options.host: 5101881Sbinkertn@umich.edu sys.exit('Database server must be provided from a jobfile or -h') 5111881Sbinkertn@umich.edu 5121881Sbinkertn@umich.edu if not options.db: 5131881Sbinkertn@umich.edu sys.exit('Database name must be provided from a jobfile or -d') 5141881Sbinkertn@umich.edu 5151049Sbinkertn@umich.edu if len(args) == 0: 5161049Sbinkertn@umich.edu usage() 5171049Sbinkertn@umich.edu 5181049Sbinkertn@umich.edu command = args[0] 5191049Sbinkertn@umich.edu args = args[1:] 5201049Sbinkertn@umich.edu 5211049Sbinkertn@umich.edu try: 5221049Sbinkertn@umich.edu commands(options, command, args) 5231049Sbinkertn@umich.edu except CommandException: 5241049Sbinkertn@umich.edu usage() 525