stats.py revision 1758
1#!/usr/bin/env python 2 3# Copyright (c) 2003-2004 The Regents of The University of Michigan 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are 8# met: redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer; 10# redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution; 13# neither the name of the copyright holders nor the names of its 14# contributors may be used to endorse or promote products derived from 15# this software without specific prior written permission. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29#Permission is granted to use, copy, create derivative works and 30#redistribute this software and such derivative works for any purpose, 31#so long as the copyright notice above, this grant of permission, and 32#the disclaimer below appear in all copies made; and so long as the 33#name of The University of Michigan is not used in any advertising or 34#publicity pertaining to the use or distribution of this software 35#without specific, written prior authorization. 36# 37#THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE 38#UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND WITHOUT 39#WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER EXPRESS OR 40#IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF 41#MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE REGENTS OF 42#THE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE FOR ANY DAMAGES, 43#INCLUDING DIRECT, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 44#DAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR IN CONNECTION 45#WITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS HEREAFTER 46#ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 47 48from __future__ import division 49import re, sys, math 50 51 52def usage(): 53 print '''\ 54Usage: %s [-E] [-F] [-d <db> ] [-g <get> ] [-h <host>] [-p] 55 [-s <system>] [-r <runs> ] [-T <samples>] [-u <username>] 56 <command> [command args] 57 58 commands extra parameters description 59 ----------- ------------------ --------------------------------------- 60 bins [regex] List bins (only matching regex) 61 formula <formula> Evaluated formula specified 62 formulas [regex] List formulas (only matching regex) 63 runs none List all runs in database 64 samples none List samples present in database 65 stability <pairnum> <stats> Calculated statistical info about stats 66 stat <regex> Show stat data (only matching regex) 67 stats [regex] List all stats (only matching regex) 68 69 database <command> Where command is drop, init, or clean 70 71''' % sys.argv[0] 72 sys.exit(1) 73 74def getopts(list, flags): 75 import getopt 76 try: 77 opts, args = getopt.getopt(list, flags) 78 except getopt.GetoptError: 79 usage() 80 81 return opts, args 82 83def printval(name, value, invert = False): 84 if invert and value != 0.0: 85 value = 1 / value 86 87 if value == (1e300*1e300): 88 return 89 90 if printval.mode == 'G': 91 print '%s: %g' % (name, value) 92 elif printval.mode != 'F' and value > 1e6: 93 print '%s: %0.5e' % (name, value) 94 else: 95 print '%s: %f' % (name, value) 96 97printval.mode = 'G' 98 99def unique(list): 100 set = {} 101 map(set.__setitem__, list, []) 102 return set.keys() 103 104#benchmarks = [ 'm', 's', 'snt', 'nb1', 'w1', 'w2', 'w3', 'w4', 'nm', 'ns', 'nw1', 'nw2', 'nw3' ] 105 106def graphdata(runs, options, tag, label, value): 107 import info 108 109 bench_system = { 110 'm' : 'client', 111 's' : 'client', 112 'snt' : 'client', 113 'nb1' : 'server', 114 'nb2' : 'server', 115 'nt1' : 'server', 116 'nt2' : 'server', 117 'w1' : 'server', 118 'w2' : 'server', 119 'w3' : 'server', 120 'w4' : 'server', 121 'w1s' : 'server', 122 'w2s' : 'server', 123 'w3s' : 'server', 124 'ns' : 'natbox', 125 'nm' : 'natbox', 126 'nw1' : 'natbox', 127 'nw2' : 'natbox', 128 'nw3' : 'natbox' 129 } 130 131 system_configs = { 132 's1' : 'Uni 4GHz', 133 'm1' : 'Uni 6GHz', 134 'f1' : 'Uni 8GHz', 135 'q1' : 'Uni 10GHz', 136 's2' : 'Dual 4GHz', 137 'm2' : 'Dual 6GHz', 138 's4' : 'Quad 4GHz', 139 'm4' : 'Quad 6GHz' } 140 141 configs = ['ste', 'hte', 'htd', 'ocm', 'occ', 'ocp' ] 142 benchmarks = [ 'm', 'snt', 'w2', 'nm', 'nw2' ] 143 caches = [ '0', '2', '4' ] 144 145 names = [] 146 for bench in benchmarks: 147 if bench_system[bench] != options.system: 148 continue 149 150 for cache in caches: 151 names.append([bench, cache]) 152 153 for bench,cache in names: 154 base = '%s.%s' % (bench, cache) 155 fname = 'data/uni.%s.%s.dat' % (tag, base) 156 f = open(fname, 'w') 157 print >>f, '#set TITLE = ' 158 print >>f, '#set ylbl = %s' % label 159 #print >>f, '#set sublabels = %s' % ' '.join(configs) 160 print >>f, '#set sublabels = ste hte htd ocm occ ocs' 161 162 for speed in ('s1', 'm1', 'f1', 'q1'): 163 label = system_configs[speed] 164 print >>f, '"%s"' % label, 165 for conf in configs: 166 name = '%s.%s.%s.%s' % (conf, bench, cache, speed) 167 run = info.source.allRunNames[name] 168 info.display_run = run.run; 169 val = float(value) 170 if val == 1e300*1e300: 171 print >>f, 0.0, 172 else: 173 print >>f, "%f" % val, 174 print >>f 175 f.close() 176 177 configs = ['ste', 'hte', 'htd', 'ocm', 'occ', 'ocp' ] 178 benchmarks = [ 'w2'] 179 caches = [ '0', '2', '4' ] 180 181 names = [] 182 for bench in benchmarks: 183 if bench_system[bench] != options.system: 184 continue 185 186 for cache in caches: 187 names.append([bench, cache]) 188 189 for bench,cache in names: 190 base = '%s.%s' % (bench, cache) 191 fname = 'data/mp.%s.%s.dat' % (tag, base) 192 f = open(fname, 'w') 193 print >>f, '#set TITLE = ' 194 print >>f, '#set ylbl = %s' % label 195 #print >>f, '#set sublabels = %s' % ' '.join(configs) 196 print >>f, '#set sublabels = ste hte htd ocm occ ocs' 197 198 for speed in ('s2', 'm2', 's4', 'm4'): 199 label = system_configs[speed] 200 print >>f, '"%s"' % label, 201 for conf in configs: 202 name = '%s.%s.%s.%s' % (conf, bench, cache, speed) 203 run = info.source.allRunNames[name] 204 info.display_run = run.run; 205 val = float(value) 206 if val == 1e300*1e300: 207 print >>f, 0.0, 208 else: 209 print >>f, "%f" % val, 210 print >>f 211 f.close() 212 213def printdata(runs, value, invert = False): 214 import info 215 for run in runs: 216 info.display_run = run.run; 217 val = float(value) 218 printval(run.name, val) 219 220class CommandException(Exception): 221 pass 222 223def commands(options, command, args): 224 if command == 'database': 225 if len(args) == 0: raise CommandException 226 227 import dbinit 228 mydb = dbinit.MyDB(options) 229 230 if args[0] == 'drop': 231 if len(args) > 2: raise CommandException 232 mydb.admin() 233 mydb.drop() 234 if len(args) == 2 and args[1] == 'init': 235 mydb.create() 236 mydb.connect() 237 mydb.populate() 238 mydb.close() 239 return 240 241 if args[0] == 'init': 242 if len(args) > 1: raise CommandException 243 mydb.admin() 244 mydb.create() 245 mydb.connect() 246 mydb.populate() 247 mydb.close() 248 return 249 250 if args[0] == 'clean': 251 if len(args) > 1: raise CommandException 252 mydb.connect() 253 mydb.clean() 254 return 255 256 raise CommandException 257 258 import db, info 259 info.source = db.Database() 260 info.source.host = options.host 261 info.source.db = options.db 262 info.source.passwd = options.passwd 263 info.source.user = options.user 264 info.source.connect() 265 info.source.update_dict(globals()) 266 267 if type(options.get) is str: 268 info.source.get = options.get 269 270 if options.runs is None: 271 runs = info.source.allRuns 272 else: 273 rx = re.compile(options.runs) 274 runs = [] 275 for run in info.source.allRuns: 276 if rx.match(run.name): 277 runs.append(run) 278 279 info.display_run = runs[0].run 280 281 if command == 'runs': 282 user = None 283 opts, args = getopts(args, '-u') 284 if len(args): 285 raise CommandException 286 for o,a in opts: 287 if o == '-u': 288 user = a 289 info.source.listRuns(user) 290 return 291 292 if command == 'stability': 293 if len(args) < 2: 294 raise CommandException 295 296 try: 297 merge = int(args[0]) 298 except ValueError: 299 usage() 300 stats = info.source.getStat(args[1]) 301 info.source.get = "sum" 302 303 304 #loop through all the stats selected 305 for stat in stats: 306 307 print "%s:" % stat.name 308 print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ 309 ("run name", "average", "stdev", ">10%", ">1SDV", ">2SDV", "SAMP", "CV") 310 print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ 311 ("--------------------", "------------", 312 "------------", "----", "-----", "-----", "-----", "----------") 313 #loop through all the selected runs 314 for run in runs: 315 info.display_run = run.run; 316 runTicks = info.source.retTicks([ run ]) 317 #throw away the first one, it's 0 318 runTicks.pop(0) 319 info.globalTicks = runTicks 320 avg = 0 321 stdev = 0 322 numoutsideavg = 0 323 numoutside1std = 0 324 numoutside2std = 0 325 pairRunTicks = [] 326 if float(stat) == 1e300*1e300: 327 continue 328 for t in range(0, len(runTicks)-(merge-1), merge): 329 tempPair = [] 330 for p in range(0,merge): 331 tempPair.append(runTicks[t+p]) 332 pairRunTicks.append(tempPair) 333 #loop through all the various ticks for each run 334 for tick in pairRunTicks: 335 info.globalTicks = tick 336 avg += float(stat) 337 avg /= len(pairRunTicks) 338 for tick in pairRunTicks: 339 info.globalTicks = tick 340 val = float(stat) 341 stdev += pow((val-avg),2) 342 stdev = math.sqrt(stdev / len(pairRunTicks)) 343 for tick in pairRunTicks: 344 info.globalTicks = tick 345 val = float(stat) 346 if (val < (avg * .9)) or (val > (avg * 1.1)): 347 numoutsideavg += 1 348 if (val < (avg - stdev)) or (val > (avg + stdev)): 349 numoutside1std += 1 350 if (val < (avg - (2*stdev))) or (val > (avg + (2*stdev))): 351 numoutside2std += 1 352 if avg > 1000: 353 print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ 354 (run.name, "%.1f" % avg, "%.1f" % stdev, 355 "%d" % numoutsideavg, "%d" % numoutside1std, 356 "%d" % numoutside2std, "%d" % len(pairRunTicks), 357 "%.3f" % (stdev/avg*100)) 358 elif avg > 100: 359 print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ 360 (run.name, "%.1f" % avg, "%.1f" % stdev, 361 "%d" % numoutsideavg, "%d" % numoutside1std, 362 "%d" % numoutside2std, "%d" % len(pairRunTicks), 363 "%.5f" % (stdev/avg*100)) 364 else: 365 print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ 366 (run.name, "%.5f" % avg, "%.5f" % stdev, 367 "%d" % numoutsideavg, "%d" % numoutside1std, 368 "%d" % numoutside2std, "%d" % len(pairRunTicks), 369 "%.7f" % (stdev/avg*100)) 370 return 371 372 if command == 'stats': 373 if len(args) == 0: 374 info.source.listStats() 375 elif len(args) == 1: 376 info.source.listStats(args[0]) 377 else: 378 raise CommandException 379 380 return 381 382 if command == 'stat': 383 if len(args) != 1: 384 raise CommandException 385 386 stats = info.source.getStat(args[0]) 387 for stat in stats: 388 if options.graph: 389 graphdata(runs, options, stat.name, stat.name, stat) 390 else: 391 if options.ticks: 392 print 'only displaying sample %s' % options.ticks 393 info.globalTicks = [ int(x) for x in options.ticks.split() ] 394 395 if options.binned: 396 print 'kernel ticks' 397 stat.bins = 'kernel' 398 printdata(runs, stat) 399 400 print 'idle ticks' 401 stat.bins = 'idle' 402 printdata(runs, stat) 403 404 print 'user ticks' 405 stat.bins = 'user' 406 printdata(runs, stat) 407 408 print 'interrupt ticks' 409 stat.bins = 'interrupt' 410 printdata(runs, stat) 411 412 print 'total ticks' 413 414 stat.bins = None 415 print stat.name 416 printdata(runs, stat) 417 return 418 419 if command == 'formula': 420 if len(args) != 1: 421 raise CommandException 422 423 stats = eval(args[0]) 424 for stat in stats: 425 if options.graph: 426 graphdata(runs, options, stat.name, stat.name, stat) 427 else: 428 if options.binned: 429 print 'kernel ticks' 430 stat.bins = 'kernel' 431 printdata(runs, stat) 432 433 print 'idle ticks' 434 stat.bins = 'idle' 435 printdata(runs, stat) 436 437 print 'user ticks' 438 stat.bins = 'user' 439 printdata(runs, stat) 440 441 print 'interrupt ticks' 442 stat.bins = 'interrupt' 443 printdata(runs, stat) 444 445 print 'total ticks' 446 447 stat.bins = None 448 print args[0] 449 printdata(runs, stat) 450 return 451 452 if command == 'bins': 453 if len(args) == 0: 454 info.source.listBins() 455 elif len(args) == 1: 456 info.source.listBins(args[0]) 457 else: 458 raise CommandException 459 460 return 461 462 if command == 'formulas': 463 if len(args) == 0: 464 info.source.listFormulas() 465 elif len(args) == 1: 466 info.source.listFormulas(args[0]) 467 else: 468 raise CommandException 469 470 return 471 472 if command == 'samples': 473 if len(args): 474 raise CommandException 475 476 info.source.listTicks(runs) 477 return 478 479 if len(args): 480 raise CommandException 481 482 system = info.source.__dict__[options.system] 483 484 if command == 'usertime': 485 import copy 486 kernel = copy.copy(system.full0.numCycles) 487 kernel.bins = 'kernel' 488 489 user = copy.copy(system.full0.numCycles) 490 user.bins = 'user' 491 492 if options.graph: 493 graphdata(runs, options, 'usertime', 'User Fraction', 494 user / system.full0.numCycles) 495 else: 496 printdata(runs, user / system.full0.numCycles) 497 return 498 499 if command == 'ticks': 500 if options.binned: 501 print 'kernel ticks' 502 system.full0.numCycles.bins = 'kernel' 503 printdata(runs, system.full0.numCycles) 504 505 print 'idle ticks' 506 system.full0.numCycles.bins = 'idle' 507 printdata(runs, system.full0.numCycles) 508 509 print 'user ticks' 510 system.full0.numCycles.bins = 'user' 511 printdata(runs, system.full0.numCycles) 512 513 print 'total ticks' 514 515 system.full0.numCycles.bins = None 516 printdata(runs, system.full0.numCycles) 517 return 518 519 if command == 'packets': 520 packets = system.tsunami.etherdev0.rxPackets 521 if options.graph: 522 graphdata(runs, options, 'packets', 'Packets', packets) 523 else: 524 printdata(runs, packets) 525 return 526 527 if command == 'ppt' or command == 'tpp': 528 ppt = system.tsunami.etherdev0.rxPackets / sim_ticks 529 printdata(runs, ppt, command == 'tpp') 530 return 531 532 if command == 'pps': 533 pps = system.tsunami.etherdev0.rxPackets / sim_seconds 534 if options.graph: 535 graphdata(runs, options, 'pps', 'Packets/s', pps) 536 else: 537 printdata(runs, pps) 538 return 539 540 if command == 'bpt' or command == 'tpb': 541 bytes = system.tsunami.etherdev0.rxBytes + system.tsunami.etherdev0.txBytes 542 bpt = bytes / sim_ticks * 8 543 if options.graph: 544 graphdata(runs, options, 'bpt', 'bps / Hz', bpt) 545 else: 546 printdata(runs, bpt, command == 'tpb') 547 return 548 549 if command == 'bptb' or command == 'tpbb': 550 bytes = system.tsunami.etherdev0.rxBytes + system.tsunami.etherdev0.txBytes 551 552 print 'kernel stats' 553 bytes.bins = 'kernel' 554 printdata(runs, bytes / ticks) 555 556 print 'idle stats' 557 bytes.bins = 'idle' 558 printdata(runs, bytes / ticks) 559 560 print 'user stats' 561 bytes.bins = 'user' 562 printdata(runs, bytes / ticks) 563 564 return 565 566 if command == 'bytes': 567 stat = system.tsunami.etherdev0.rxBytes + system.tsunami.etherdev0.txBytes 568 569 if options.binned: 570 print '%s kernel stats' % stat.name 571 stat.bins = 'kernel' 572 printdata(runs, stat) 573 574 print '%s idle stats' % stat.name 575 stat.bins = 'idle' 576 printdata(runs, stat) 577 578 print '%s user stats' % stat.name 579 stat.bins = 'user' 580 printdata(runs, stat) 581 582 print '%s total stats' % stat.name 583 stat.bins = None 584 585 printdata(runs, stat) 586 return 587 588 if command == 'rxbps': 589 gbps = system.tsunami.etherdev0.rxBandwidth / 1e9 590 if options.graph: 591 graphdata(runs, options, 'rxbps', 'Bandwidth (Gbps)', gbps) 592 else: 593 printdata(runs, gbps) 594 return 595 596 if command == 'txbps': 597 gbps = system.tsunami.etherdev0.txBandwidth / 1e9 598 if options.graph: 599 graphdata(runs, options, 'txbps', 'Bandwidth (Gbps)', gbps) 600 else: 601 printdata(runs, gbps) 602 return 603 604 if command == 'bps': 605 rxbps = system.tsunami.etherdev0.rxBandwidth 606 txbps = system.tsunami.etherdev0.txBandwidth 607 gbps = (rxbps + txbps) / 1e9 608 if options.graph: 609 graphdata(runs, options, 'bps', 'Bandwidth (Gbps)', gbps) 610 else: 611 printdata(runs, gbps) 612 return 613 614 if command == 'misses': 615 stat = system.l2.overall_mshr_misses 616 if options.binned: 617 print '%s kernel stats' % stat.name 618 stat.bins = 'kernel' 619 printdata(runs, stat) 620 621 print '%s idle stats' % stat.name 622 stat.bins = 'idle' 623 printdata(runs, stat) 624 625 print '%s user stats' % stat.name 626 stat.bins = 'user' 627 printdata(runs, stat) 628 629 print '%s total stats' % stat.name 630 631 stat.bins = None 632 if options.graph: 633 graphdata(runs, options, 'misses', 'Overall MSHR Misses', stat) 634 else: 635 printdata(runs, stat) 636 return 637 638 if command == 'mpkb': 639 misses = system.l2.overall_mshr_misses 640 rxbytes = system.tsunami.etherdev0.rxBytes 641 txbytes = system.tsunami.etherdev0.txBytes 642 643 if options.binned: 644 print 'mpkb kernel stats' 645 misses.bins = 'kernel' 646 mpkb = misses / ((rxbytes + txbytes) / 1024) 647 printdata(runs, mpkb) 648 649 print 'mpkb idle stats' 650 misses.bins = 'idle' 651 mpkb = misses / ((rxbytes + txbytes) / 1024) 652 printdata(runs, mpkb) 653 654 print 'mpkb user stats' 655 misses.bins = 'user' 656 mpkb = misses / ((rxbytes + txbytes) / 1024) 657 printdata(runs, mpkb) 658 659 print 'mpkb total stats' 660 661 mpkb = misses / ((rxbytes + txbytes) / 1024) 662 misses.bins = None 663 if options.graph: 664 graphdata(runs, options, 'mpkb', 'Misses / KB', mpkb) 665 else: 666 printdata(runs, mpkb) 667 return 668 669 if command == 'ipkb': 670 interrupts = system.full0.kern.faults[4] 671 rxbytes = system.tsunami.etherdev0.rxBytes 672 txbytes = system.tsunami.etherdev0.txBytes 673 674 if options.binned: 675 print 'ipkb kernel stats' 676 interrupts.bins = 'kernel' 677 ipkb = interrupts / ((rxbytes + txbytes) / 1024) 678 printdata(runs, ipkb) 679 680 print 'ipkb idle stats' 681 interrupts.bins = 'idle' 682 ipkb = interrupts / ((rxbytes + txbytes) / 1024) 683 printdata(runs, ipkb) 684 685 print 'ipkb user stats' 686 interrupts.bins = 'user' 687 ipkb = interrupts / ((rxbytes + txbytes) / 1024) 688 printdata(runs, ipkb) 689 690 print 'ipkb total stats' 691 692 ipkb = interrupts / ((rxbytes + txbytes) / 1024) 693 interrupts.bins = None 694 if options.graph: 695 graphdata(runs, options, 'ipkb', 'Interrupts / KB', ipkb) 696 else: 697 printdata(runs, ipkb) 698 return 699 700 if command == 'execute': 701 printdata(runs, system.full0.ISSUE__count) 702 return 703 704 if command == 'commit': 705 printdata(runs, system.full0.COM__count) 706 return 707 708 if command == 'fetch': 709 printdata(runs, system.full0.FETCH__count) 710 return 711 712 if command == 'bpp': 713 ed = system.tsunami.etherdev0 714 bpp = (ed.rxBytes + ed.txBytes) / (ed.rxPackets + ed.txPackets) 715 if options.graph: 716 graphdata(runs, options, 'bpp', 'Bytes / Packet', bpp) 717 else: 718 printdata(runs, bpp) 719 return 720 721 if command == 'rxbpp': 722 bpp = system.tsunami.etherdev0.rxBytes / system.tsunami.etherdev0.rxPackets 723 if options.graph: 724 graphdata(runs, options, 'rxbpp', 'Receive Bytes / Packet', bpp) 725 else: 726 printdata(runs, bpp) 727 return 728 729 if command == 'txbpp': 730 bpp = system.tsunami.etherdev0.txBytes / system.tsunami.etherdev0.txPackets 731 if options.graph: 732 graphdata(runs, options, 'txbpp', 'Transmit Bytes / Packet', bpp) 733 else: 734 printdata(runs, bpp) 735 return 736 737 if command == 'rtp': 738 rtp = system.tsunami.etherdev0.rxPackets / system.tsunami.etherdev0.txPackets 739 if options.graph: 740 graphdata(runs, options, 'rtp', 'rxPackets / txPackets', rtp) 741 else: 742 printdata(runs, rtp) 743 return 744 745 if command == 'rtb': 746 rtb = system.tsunami.etherdev0.rxBytes / system.tsunami.etherdev0.txBytes 747 if options.graph: 748 graphdata(runs, options, 'rtb', 'rxBytes / txBytes', rtb) 749 else: 750 printdata(runs, rtb) 751 return 752 753 raise CommandException 754 755 756class Options: pass 757 758if __name__ == '__main__': 759 import getpass 760 761 options = Options() 762 options.host = 'zizzer.pool' 763 options.db = None 764 options.passwd = '' 765 options.user = getpass.getuser() 766 options.runs = None 767 options.system = 'client' 768 options.get = None 769 options.binned = False 770 options.graph = False 771 options.ticks = False 772 773 opts, args = getopts(sys.argv[1:], '-6BEFGd:g:h:pr:s:u:T:') 774 for o,a in opts: 775 if o == '-B': 776 options.binned = True 777 if o == '-E': 778 printval.mode = 'E' 779 if o == '-F': 780 printval.mode = 'F' 781 if o == '-G': 782 options.graph = True; 783 if o == '-d': 784 options.db = a 785 if o == '-g': 786 options.get = a 787 if o == '-h': 788 options.host = a 789 if o == '-p': 790 options.passwd = getpass.getpass() 791 if o == '-r': 792 options.runs = a 793 if o == '-u': 794 options.user = a 795 if o == '-s': 796 options.system = a 797 if o == '-T': 798 options.ticks = a 799 800 if len(args) == 0: 801 usage() 802 803 command = args[0] 804 args = args[1:] 805 806 try: 807 commands(options, command, args) 808 except CommandException: 809 usage() 810