stats.py (1957:895f4795130f) stats.py (1958:144ef1d5315f)
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
29from __future__ import division
30import re, sys, math
31
32def usage():
33 print '''\
34Usage: %s [-E] [-F] [ -G <get> ] [-d <db> ] [-g <graphdir> ] [-h <host>] [-p]
35 [-s <system>] [-r <runs> ] [-T <samples>] [-u <username>]
36 <command> [command args]
37
38 commands extra parameters description
39 ----------- ------------------ ---------------------------------------
40 bins [regex] List bins (only matching regex)
41 formula <formula> Evaluated formula specified
42 formulas [regex] List formulas (only matching regex)
43 runs none List all runs in database
44 samples none List samples present in database
45 stability <pairnum> <stats> Calculated statistical info about stats
46 stat <regex> Show stat data (only matching regex)
47 stats [regex] List all stats (only matching regex)
48
49 database <command> Where command is drop, init, or clean
50
51''' % sys.argv[0]
52 sys.exit(1)
53
54def getopts(list, flags):
55 import getopt
56 try:
57 opts, args = getopt.getopt(list, flags)
58 except getopt.GetoptError:
59 usage()
60
61 return opts, args
62
63class CommandException(Exception):
64 pass
65
66def commands(options, command, args):
67 if command == 'database':
68 if len(args) == 0: raise CommandException
69
70 import dbinit
71 mydb = dbinit.MyDB(options)
72
73 if args[0] == 'drop':
74 if len(args) > 2: raise CommandException
75 mydb.admin()
76 mydb.drop()
77 if len(args) == 2 and args[1] == 'init':
78 mydb.create()
79 mydb.connect()
80 mydb.populate()
81 mydb.close()
82 return
83
84 if args[0] == 'init':
85 if len(args) > 1: raise CommandException
86 mydb.admin()
87 mydb.create()
88 mydb.connect()
89 mydb.populate()
90 mydb.close()
91 return
92
93 if args[0] == 'clean':
94 if len(args) > 1: raise CommandException
95 mydb.connect()
96 mydb.clean()
97 return
98
99 raise CommandException
100
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
29from __future__ import division
30import re, sys, math
31
32def usage():
33 print '''\
34Usage: %s [-E] [-F] [ -G <get> ] [-d <db> ] [-g <graphdir> ] [-h <host>] [-p]
35 [-s <system>] [-r <runs> ] [-T <samples>] [-u <username>]
36 <command> [command args]
37
38 commands extra parameters description
39 ----------- ------------------ ---------------------------------------
40 bins [regex] List bins (only matching regex)
41 formula <formula> Evaluated formula specified
42 formulas [regex] List formulas (only matching regex)
43 runs none List all runs in database
44 samples none List samples present in database
45 stability <pairnum> <stats> Calculated statistical info about stats
46 stat <regex> Show stat data (only matching regex)
47 stats [regex] List all stats (only matching regex)
48
49 database <command> Where command is drop, init, or clean
50
51''' % sys.argv[0]
52 sys.exit(1)
53
54def getopts(list, flags):
55 import getopt
56 try:
57 opts, args = getopt.getopt(list, flags)
58 except getopt.GetoptError:
59 usage()
60
61 return opts, args
62
63class CommandException(Exception):
64 pass
65
66def commands(options, command, args):
67 if command == 'database':
68 if len(args) == 0: raise CommandException
69
70 import dbinit
71 mydb = dbinit.MyDB(options)
72
73 if args[0] == 'drop':
74 if len(args) > 2: raise CommandException
75 mydb.admin()
76 mydb.drop()
77 if len(args) == 2 and args[1] == 'init':
78 mydb.create()
79 mydb.connect()
80 mydb.populate()
81 mydb.close()
82 return
83
84 if args[0] == 'init':
85 if len(args) > 1: raise CommandException
86 mydb.admin()
87 mydb.create()
88 mydb.connect()
89 mydb.populate()
90 mydb.close()
91 return
92
93 if args[0] == 'clean':
94 if len(args) > 1: raise CommandException
95 mydb.connect()
96 mydb.clean()
97 return
98
99 raise CommandException
100
101 import db, info
102 info.source = db.Database()
103 info.source.host = options.host
104 info.source.db = options.db
105 info.source.passwd = options.passwd
106 info.source.user = options.user
107 info.source.connect()
108 #info.source.update_dict(globals())
101 import db
102 source = db.Database()
103 source.host = options.host
104 source.db = options.db
105 source.passwd = options.passwd
106 source.user = options.user
107 source.connect()
108 #source.update_dict(globals())
109
109
110 if type(options.get) is str:
111 info.source.get = options.get
110 if type(options.method) is str:
111 source.method = options.method
112
113 if options.runs is None:
112
113 if options.runs is None:
114 runs = info.source.allRuns
114 runs = source.allRuns
115 else:
116 rx = re.compile(options.runs)
117 runs = []
115 else:
116 rx = re.compile(options.runs)
117 runs = []
118 for run in info.source.allRuns:
118 for run in source.allRuns:
119 if rx.match(run.name):
120 runs.append(run)
121
119 if rx.match(run.name):
120 runs.append(run)
121
122 info.display_run = runs[0].run
123
124 if command == 'runs':
125 user = None
126 opts, args = getopts(args, '-u')
127 if len(args):
128 raise CommandException
129 for o,a in opts:
130 if o == '-u':
131 user = a
122 if command == 'runs':
123 user = None
124 opts, args = getopts(args, '-u')
125 if len(args):
126 raise CommandException
127 for o,a in opts:
128 if o == '-u':
129 user = a
132 info.source.listRuns(user)
130 source.listRuns(user)
133 return
134
135 if command == 'stats':
136 if len(args) == 0:
131 return
132
133 if command == 'stats':
134 if len(args) == 0:
137 info.source.listStats()
135 source.listStats()
138 elif len(args) == 1:
136 elif len(args) == 1:
139 info.source.listStats(args[0])
137 source.listStats(args[0])
140 else:
141 raise CommandException
142
143 return
144
145 if command == 'bins':
146 if len(args) == 0:
138 else:
139 raise CommandException
140
141 return
142
143 if command == 'bins':
144 if len(args) == 0:
147 info.source.listBins()
145 source.listBins()
148 elif len(args) == 1:
146 elif len(args) == 1:
149 info.source.listBins(args[0])
147 source.listBins(args[0])
150 else:
151 raise CommandException
152
153 return
154
155 if command == 'formulas':
156 if len(args) == 0:
148 else:
149 raise CommandException
150
151 return
152
153 if command == 'formulas':
154 if len(args) == 0:
157 info.source.listFormulas()
155 source.listFormulas()
158 elif len(args) == 1:
156 elif len(args) == 1:
159 info.source.listFormulas(args[0])
157 source.listFormulas(args[0])
160 else:
161 raise CommandException
162
163 return
164
165 if command == 'samples':
166 if len(args):
167 raise CommandException
168
158 else:
159 raise CommandException
160
161 return
162
163 if command == 'samples':
164 if len(args):
165 raise CommandException
166
169 info.source.listTicks(runs)
167 source.listTicks(runs)
170 return
171
172 if command == 'stability':
173 if len(args) < 2:
174 raise CommandException
175
176 try:
177 merge = int(args[0])
178 except ValueError:
179 usage()
168 return
169
170 if command == 'stability':
171 if len(args) < 2:
172 raise CommandException
173
174 try:
175 merge = int(args[0])
176 except ValueError:
177 usage()
180 stats = info.source.getStat(args[1])
181 info.source.get = "sum"
178 stats = source.getStat(args[1])
179 source.method = 'sum'
182
183 def disp(*args):
184 print "%-35s %12s %12s %4s %5s %5s %5s %10s" % args
185
186 # temporary variable containing a bunch of dashes
187 d = '-' * 100
188
189 #loop through all the stats selected
190 for stat in stats:
191 print "%s:" % stat.name
192 disp("run name", "average", "stdev", ">10%", ">1SDV", ">2SDV",
193 "SAMP", "CV")
194 disp(d[:35], d[:12], d[:12], d[:4], d[:5], d[:5], d[:5], d[:10])
195
196 #loop through all the selected runs
197 for run in runs:
180
181 def disp(*args):
182 print "%-35s %12s %12s %4s %5s %5s %5s %10s" % args
183
184 # temporary variable containing a bunch of dashes
185 d = '-' * 100
186
187 #loop through all the stats selected
188 for stat in stats:
189 print "%s:" % stat.name
190 disp("run name", "average", "stdev", ">10%", ">1SDV", ">2SDV",
191 "SAMP", "CV")
192 disp(d[:35], d[:12], d[:12], d[:4], d[:5], d[:5], d[:5], d[:10])
193
194 #loop through all the selected runs
195 for run in runs:
198 info.display_run = run.run;
199 runTicks = info.source.retTicks([ run ])
196 runTicks = source.retTicks([ run ])
200 #throw away the first one, it's 0
201 runTicks.pop(0)
197 #throw away the first one, it's 0
198 runTicks.pop(0)
202 info.globalTicks = runTicks
199 source.ticks = runTicks
203 avg = 0
204 stdev = 0
205 numoutsideavg = 0
206 numoutside1std = 0
207 numoutside2std = 0
208 pairRunTicks = []
200 avg = 0
201 stdev = 0
202 numoutsideavg = 0
203 numoutside1std = 0
204 numoutside2std = 0
205 pairRunTicks = []
209 if float(stat) == 1e300*1e300:
206 if value(stat, run.run) == 1e300*1e300:
210 continue
211 for t in range(0, len(runTicks)-(merge-1), merge):
212 tempPair = []
213 for p in range(0,merge):
214 tempPair.append(runTicks[t+p])
215 pairRunTicks.append(tempPair)
216 #loop through all the various ticks for each run
217 for tick in pairRunTicks:
207 continue
208 for t in range(0, len(runTicks)-(merge-1), merge):
209 tempPair = []
210 for p in range(0,merge):
211 tempPair.append(runTicks[t+p])
212 pairRunTicks.append(tempPair)
213 #loop through all the various ticks for each run
214 for tick in pairRunTicks:
218 info.globalTicks = tick
219 avg += float(stat)
215 source.ticks = tick
216 avg += value(stat, run.run)
220 avg /= len(pairRunTicks)
221 for tick in pairRunTicks:
217 avg /= len(pairRunTicks)
218 for tick in pairRunTicks:
222 info.globalTicks = tick
223 val = float(stat)
219 source.ticks = tick
220 val = value(stat, run.run)
224 stdev += pow((val-avg),2)
225 stdev = math.sqrt(stdev / len(pairRunTicks))
226 for tick in pairRunTicks:
221 stdev += pow((val-avg),2)
222 stdev = math.sqrt(stdev / len(pairRunTicks))
223 for tick in pairRunTicks:
227 info.globalTicks = tick
228 val = float(stat)
224 source.ticks = tick
225 val = value(stat, run.run)
229 if (val < (avg * .9)) or (val > (avg * 1.1)):
230 numoutsideavg += 1
231 if (val < (avg - stdev)) or (val > (avg + stdev)):
232 numoutside1std += 1
233 if (val < (avg - (2*stdev))) or (val > (avg + (2*stdev))):
234 numoutside2std += 1
235 if avg > 1000:
236 disp(run.name, "%.1f" % avg, "%.1f" % stdev,
237 "%d" % numoutsideavg, "%d" % numoutside1std,
238 "%d" % numoutside2std, "%d" % len(pairRunTicks),
239 "%.3f" % (stdev/avg*100))
240 elif avg > 100:
241 disp(run.name, "%.1f" % avg, "%.1f" % stdev,
242 "%d" % numoutsideavg, "%d" % numoutside1std,
243 "%d" % numoutside2std, "%d" % len(pairRunTicks),
244 "%.5f" % (stdev/avg*100))
245 else:
246 disp(run.name, "%.5f" % avg, "%.5f" % stdev,
247 "%d" % numoutsideavg, "%d" % numoutside1std,
248 "%d" % numoutside2std, "%d" % len(pairRunTicks),
249 "%.7f" % (stdev/avg*100))
250 return
251
252 if command == 'all':
253 if len(args):
254 raise CommandException
255
256 all = [ 'bps', 'rxbps', 'txbps', 'bpt',
257 'misses', 'mpkb',
258 'ipkb',
259 'pps', 'bpp', 'txbpp', 'rxbpp',
260 'rtp', 'rtb' ]
261 for command in all:
262 commands(options, command, args)
263
264 if options.ticks:
265 if not options.graph:
266 print 'only displaying sample %s' % options.ticks
226 if (val < (avg * .9)) or (val > (avg * 1.1)):
227 numoutsideavg += 1
228 if (val < (avg - stdev)) or (val > (avg + stdev)):
229 numoutside1std += 1
230 if (val < (avg - (2*stdev))) or (val > (avg + (2*stdev))):
231 numoutside2std += 1
232 if avg > 1000:
233 disp(run.name, "%.1f" % avg, "%.1f" % stdev,
234 "%d" % numoutsideavg, "%d" % numoutside1std,
235 "%d" % numoutside2std, "%d" % len(pairRunTicks),
236 "%.3f" % (stdev/avg*100))
237 elif avg > 100:
238 disp(run.name, "%.1f" % avg, "%.1f" % stdev,
239 "%d" % numoutsideavg, "%d" % numoutside1std,
240 "%d" % numoutside2std, "%d" % len(pairRunTicks),
241 "%.5f" % (stdev/avg*100))
242 else:
243 disp(run.name, "%.5f" % avg, "%.5f" % stdev,
244 "%d" % numoutsideavg, "%d" % numoutside1std,
245 "%d" % numoutside2std, "%d" % len(pairRunTicks),
246 "%.7f" % (stdev/avg*100))
247 return
248
249 if command == 'all':
250 if len(args):
251 raise CommandException
252
253 all = [ 'bps', 'rxbps', 'txbps', 'bpt',
254 'misses', 'mpkb',
255 'ipkb',
256 'pps', 'bpp', 'txbpp', 'rxbpp',
257 'rtp', 'rtb' ]
258 for command in all:
259 commands(options, command, args)
260
261 if options.ticks:
262 if not options.graph:
263 print 'only displaying sample %s' % options.ticks
267 info.globalTicks = [ int(x) for x in options.ticks.split() ]
264 source.ticks = [ int(x) for x in options.ticks.split() ]
268
265
269 from output import StatOutput
266 import output
270
271 def display():
272 if options.graph:
273 output.graph(options.graphdir)
274 else:
275 output.display(options.binned, options.printmode)
276
277
278 if command == 'stat' or command == 'formula':
279 if len(args) != 1:
280 raise CommandException
281
282 if command == 'stat':
267
268 def display():
269 if options.graph:
270 output.graph(options.graphdir)
271 else:
272 output.display(options.binned, options.printmode)
273
274
275 if command == 'stat' or command == 'formula':
276 if len(args) != 1:
277 raise CommandException
278
279 if command == 'stat':
283 stats = info.source.getStat(args[0])
280 stats = source.getStat(args[0])
284 if command == 'formula':
285 stats = eval(args[0])
286
287 for stat in stats:
281 if command == 'formula':
282 stats = eval(args[0])
283
284 for stat in stats:
288 output = StatOutput(stat.name, options.jobfile)
285 output = output.StatOutput(stat.name, options.jobfile, source)
289 output.stat = stat
290 output.label = stat.name
291 display()
292
293 return
294
295 if len(args):
296 raise CommandException
297
286 output.stat = stat
287 output.label = stat.name
288 display()
289
290 return
291
292 if len(args):
293 raise CommandException
294
298 system = info.source.__dict__[options.system]
299
300 from proxy import ProxyGroup
301 sim_ticks = info.source['sim_ticks']
302 sim_seconds = info.source['sim_seconds']
303 proxy = ProxyGroup(system = info.source[options.system])
295 system = source.__dict__[options.system]
296 from info import ProxyGroup
297 sim_ticks = source['sim_ticks']
298 sim_seconds = source['sim_seconds']
299 proxy = ProxyGroup(system = source[options.system])
304 system = proxy.system
305
306 etherdev = system.tsunami.etherdev0
307 bytes = etherdev.rxBytes + etherdev.txBytes
308 kbytes = bytes / 1024
309 packets = etherdev.rxPackets + etherdev.txPackets
310 bps = etherdev.rxBandwidth + etherdev.txBandwidth
311
300 system = proxy.system
301
302 etherdev = system.tsunami.etherdev0
303 bytes = etherdev.rxBytes + etherdev.txBytes
304 kbytes = bytes / 1024
305 packets = etherdev.rxPackets + etherdev.txPackets
306 bps = etherdev.rxBandwidth + etherdev.txBandwidth
307
312 output = StatOutput(command, options.jobfile)
308 output = output.StatOutput(command, options.jobfile, source)
313
314 if command == 'usertime':
315 import copy
316 user = copy.copy(system.full0.numCycles)
317 user.bins = 'user'
318
319 output.stat = user / system.full0.numCycles
320 output.label = 'User Fraction'
321
322 display()
323 return
324
325 if command == 'ticks':
326 output.stat = system.full0.numCycles
327 output.binstats = [ system.full0.numCycles ]
328
329 display()
330 return
331
332 if command == 'bytes':
333 output.stat = bytes
334 display()
335 return
336
337 if command == 'packets':
338 output.stat = packets
339 display()
340 return
341
342 if command == 'ppt' or command == 'tpp':
343 output.stat = packets / sim_ticks
344 output.invert = command == 'tpp'
345 display()
346 return
347
348 if command == 'pps':
349 output.stat = packets / sim_seconds
350 output.label = 'Packets/s'
351 display()
352 return
353
354 if command == 'bpt' or command == 'tpb':
355 output.stat = bytes / sim_ticks * 8
356 output.label = 'bps / Hz'
357 output.invert = command == 'tpb'
358 display()
359 return
360
361 if command == 'rxbps':
362 output.stat = etherdev.rxBandwidth / 1e9
363 output.label = 'Bandwidth (Gbps)'
364 display()
365 return
366
367 if command == 'txbps':
368 output.stat = etherdev.txBandwidth / 1e9
369 output.label = 'Bandwidth (Gbps)'
370 display()
371 return
372
373 if command == 'bps':
374 output.stat = bps / 1e9
375 output.label = 'Bandwidth (Gbps)'
376 display()
377 return
378
379 if command == 'bpp':
380 output.stat = bytes / packets
381 output.label = 'Bytes / Packet'
382 display()
383 return
384
385 if command == 'rxbpp':
386 output.stat = etherdev.rxBytes / etherdev.rxPackets
387 output.label = 'Receive Bytes / Packet'
388 display()
389 return
390
391 if command == 'txbpp':
392 output.stat = etherdev.txBytes / etherdev.txPackets
393 output.label = 'Transmit Bytes / Packet'
394 display()
395 return
396
397 if command == 'rtp':
398 output.stat = etherdev.rxPackets / etherdev.txPackets
399 output.label = 'rxPackets / txPackets'
400 display()
401 return
402
403 if command == 'rtb':
404 output.stat = etherdev.rxBytes / etherdev.txBytes
405 output.label = 'rxBytes / txBytes'
406 display()
407 return
408
409 misses = system.l2.overall_mshr_misses
410
411 if command == 'misses':
412 output.stat = misses
413 output.label = 'Overall MSHR Misses'
414 display()
415 return
416
417 if command == 'mpkb':
418 output.stat = misses / (bytes / 1024)
419 output.binstats = [ misses ]
420 output.label = 'Misses / KB'
421 display()
422 return
423
424 if command == 'ipkb':
425 interrupts = system.full0.kern.faults[4]
426 output.stat = interrupts / kbytes
427 output.binstats = [ interrupts ]
428 output.label = 'Interrupts / KB'
429 display()
430 return
431
432 if command == 'execute':
433 output.stat = system.full0.ISSUE__count
434 display()
435 return
436
437 if command == 'commit':
438 output.stat = system.full0.COM__count
439 display()
440 return
441
442 if command == 'fetch':
443 output.stat = system.full0.FETCH__count
444 display()
445 return
446
447 raise CommandException
448
449
450class Options: pass
451
452if __name__ == '__main__':
453 import getpass
454 from jobfile import JobFile
455
456 options = Options()
457 options.host = None
458 options.db = None
459 options.passwd = ''
460 options.user = getpass.getuser()
461 options.runs = None
462 options.system = 'client'
309
310 if command == 'usertime':
311 import copy
312 user = copy.copy(system.full0.numCycles)
313 user.bins = 'user'
314
315 output.stat = user / system.full0.numCycles
316 output.label = 'User Fraction'
317
318 display()
319 return
320
321 if command == 'ticks':
322 output.stat = system.full0.numCycles
323 output.binstats = [ system.full0.numCycles ]
324
325 display()
326 return
327
328 if command == 'bytes':
329 output.stat = bytes
330 display()
331 return
332
333 if command == 'packets':
334 output.stat = packets
335 display()
336 return
337
338 if command == 'ppt' or command == 'tpp':
339 output.stat = packets / sim_ticks
340 output.invert = command == 'tpp'
341 display()
342 return
343
344 if command == 'pps':
345 output.stat = packets / sim_seconds
346 output.label = 'Packets/s'
347 display()
348 return
349
350 if command == 'bpt' or command == 'tpb':
351 output.stat = bytes / sim_ticks * 8
352 output.label = 'bps / Hz'
353 output.invert = command == 'tpb'
354 display()
355 return
356
357 if command == 'rxbps':
358 output.stat = etherdev.rxBandwidth / 1e9
359 output.label = 'Bandwidth (Gbps)'
360 display()
361 return
362
363 if command == 'txbps':
364 output.stat = etherdev.txBandwidth / 1e9
365 output.label = 'Bandwidth (Gbps)'
366 display()
367 return
368
369 if command == 'bps':
370 output.stat = bps / 1e9
371 output.label = 'Bandwidth (Gbps)'
372 display()
373 return
374
375 if command == 'bpp':
376 output.stat = bytes / packets
377 output.label = 'Bytes / Packet'
378 display()
379 return
380
381 if command == 'rxbpp':
382 output.stat = etherdev.rxBytes / etherdev.rxPackets
383 output.label = 'Receive Bytes / Packet'
384 display()
385 return
386
387 if command == 'txbpp':
388 output.stat = etherdev.txBytes / etherdev.txPackets
389 output.label = 'Transmit Bytes / Packet'
390 display()
391 return
392
393 if command == 'rtp':
394 output.stat = etherdev.rxPackets / etherdev.txPackets
395 output.label = 'rxPackets / txPackets'
396 display()
397 return
398
399 if command == 'rtb':
400 output.stat = etherdev.rxBytes / etherdev.txBytes
401 output.label = 'rxBytes / txBytes'
402 display()
403 return
404
405 misses = system.l2.overall_mshr_misses
406
407 if command == 'misses':
408 output.stat = misses
409 output.label = 'Overall MSHR Misses'
410 display()
411 return
412
413 if command == 'mpkb':
414 output.stat = misses / (bytes / 1024)
415 output.binstats = [ misses ]
416 output.label = 'Misses / KB'
417 display()
418 return
419
420 if command == 'ipkb':
421 interrupts = system.full0.kern.faults[4]
422 output.stat = interrupts / kbytes
423 output.binstats = [ interrupts ]
424 output.label = 'Interrupts / KB'
425 display()
426 return
427
428 if command == 'execute':
429 output.stat = system.full0.ISSUE__count
430 display()
431 return
432
433 if command == 'commit':
434 output.stat = system.full0.COM__count
435 display()
436 return
437
438 if command == 'fetch':
439 output.stat = system.full0.FETCH__count
440 display()
441 return
442
443 raise CommandException
444
445
446class Options: pass
447
448if __name__ == '__main__':
449 import getpass
450 from jobfile import JobFile
451
452 options = Options()
453 options.host = None
454 options.db = None
455 options.passwd = ''
456 options.user = getpass.getuser()
457 options.runs = None
458 options.system = 'client'
463 options.get = None
459 options.method = None
464 options.binned = False
465 options.graph = False
466 options.ticks = False
467 options.printmode = 'G'
468 jobfilename = 'Test.py'
469 options.jobfile = None
470 options.all = False
471
460 options.binned = False
461 options.graph = False
462 options.ticks = False
463 options.printmode = 'G'
464 jobfilename = 'Test.py'
465 options.jobfile = None
466 options.all = False
467
472 opts, args = getopts(sys.argv[1:], '-BEFG:Jad:g:h:j:pr:s:u:T:')
468 opts, args = getopts(sys.argv[1:], '-BEFJad:g:h:j:m:pr:s:u:T:')
473 for o,a in opts:
474 if o == '-B':
475 options.binned = True
476 if o == '-E':
477 options.printmode = 'E'
478 if o == '-F':
479 options.printmode = 'F'
469 for o,a in opts:
470 if o == '-B':
471 options.binned = True
472 if o == '-E':
473 options.printmode = 'E'
474 if o == '-F':
475 options.printmode = 'F'
480 if o == '-G':
481 options.get = a
482 if o == '-a':
483 options.all = True
484 if o == '-d':
485 options.db = a
486 if o == '-g':
487 options.graph = True;
488 options.graphdir = a
489 if o == '-h':
490 options.host = a
491 if o == '-J':
492 jobfilename = None
493 if o == '-j':
494 jobfilename = a
476 if o == '-a':
477 options.all = True
478 if o == '-d':
479 options.db = a
480 if o == '-g':
481 options.graph = True;
482 options.graphdir = a
483 if o == '-h':
484 options.host = a
485 if o == '-J':
486 jobfilename = None
487 if o == '-j':
488 jobfilename = a
489 if o == '-m':
490 options.method = a
495 if o == '-p':
496 options.passwd = getpass.getpass()
497 if o == '-r':
498 options.runs = a
499 if o == '-u':
500 options.user = a
501 if o == '-s':
502 options.system = a
503 if o == '-T':
504 options.ticks = a
505
506 if jobfilename:
507 options.jobfile = JobFile(jobfilename)
508 if not options.host:
509 options.host = options.jobfile.dbhost
510 if not options.db:
511 options.db = options.jobfile.statdb
512
513 if not options.host:
514 sys.exit('Database server must be provided from a jobfile or -h')
515
516 if not options.db:
517 sys.exit('Database name must be provided from a jobfile or -d')
518
519 if len(args) == 0:
520 usage()
521
522 command = args[0]
523 args = args[1:]
524
525 try:
526 commands(options, command, args)
527 except CommandException:
528 usage()
491 if o == '-p':
492 options.passwd = getpass.getpass()
493 if o == '-r':
494 options.runs = a
495 if o == '-u':
496 options.user = a
497 if o == '-s':
498 options.system = a
499 if o == '-T':
500 options.ticks = a
501
502 if jobfilename:
503 options.jobfile = JobFile(jobfilename)
504 if not options.host:
505 options.host = options.jobfile.dbhost
506 if not options.db:
507 options.db = options.jobfile.statdb
508
509 if not options.host:
510 sys.exit('Database server must be provided from a jobfile or -h')
511
512 if not options.db:
513 sys.exit('Database name must be provided from a jobfile or -d')
514
515 if len(args) == 0:
516 usage()
517
518 command = args[0]
519 args = args[1:]
520
521 try:
522 commands(options, command, args)
523 except CommandException:
524 usage()