J. Richard Barnette b4c138244f Refactor the results directory reading into a separate module.
This change is made in anticipation of needing more than one kind
of reader in future. Most notably, a reader to extract data from
the MySQL results database would be a nice addition.

BUG=None
TEST=run showbootdata on any pre-existing data set

Change-Id: I5811aa1427a2714ce6ba392cdec584b4236162fd
Reviewed-on: http://gerrit.chromium.org/gerrit/2644
Reviewed-by: Mike Truty <truty@chromium.org>
Tested-by: Richard Barnette <jrbarnette@chromium.org>
2011-06-17 09:08:48 -07:00

140 lines
4.6 KiB
Python
Executable File

#!/usr/bin/python
# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A command to display summary statistics from runs of 'bootperf'.
Command line options allow selecting from one of two sets of
performance statistics: The boot time statistics (selected by
--timestats) measure time spent from kernel startup in milliseconds.
The disk statistics (selected by --diskstats) measure total bytes
read from the boot device since kernel startup.
Boot time statistics are recorded as cumulative time (or disk read)
since kernel startup, measured when specific events occur during
boot. Events include such things as 'startup', the moment when the
upstart 'startup' job begins running, and 'login', when the
Chrome OS login screen is displayed. By default, all recorded events
are included in the output; command line options allow restricting
the view to a selected subset of events.
Separate command line options allow selecting from one of two
different display modes. When --averages is selected, the display
shows the average value and sample standard deviation (as a percent
of the average) for all selected events. The --averages display also
calculates the time (or bytes) between adjacent events, and shows
the avearage and sample standard deviation of the differences.
The --rawdata display shows the raw data value associated with each
event for each boot: Each line of output represents the event values
for one boot cycle.
"""
import sys
import optparse
import resultsdir
import perfprinter
_USAGE = "%prog [options] [results-directory ...]"
_DESCRIPTION = """\
Summarize boot time performance results. The result directory
arguments are directories previously specified as output for the
'bootperf' script.
"""
def _SetupOptions():
optparser = optparse.OptionParser(usage=_USAGE, description=_DESCRIPTION)
optgroup = optparse.OptionGroup(
optparser, "Selecting boot time or disk statistics (choose one)")
optgroup.add_option(
"-t", "--timestats", action="store_true",
dest="use_timestats",
help="use statistics for time since kernel startup (default)")
optgroup.add_option(
"-d", "--diskstats", action="store_true",
dest="use_diskstats",
help="use statistics for bytes read since kernel startup")
optparser.add_option_group(optgroup)
optparser.set_defaults(use_diskstats=False)
optparser.set_defaults(use_timestats=False)
optgroup = optparse.OptionGroup(optparser, "Event selection")
optgroup.add_option(
"-e", "--event", action="append",
dest="eventnames",
help="restrict statistics to the comma-separated list of events")
optparser.add_option_group(optgroup)
optgroup = optparse.OptionGroup(
optparser, "Display mode selection (choose one)")
optgroup.add_option(
"-a", "--averages", action="store_true",
dest="print_averages",
help="display a summary of the averages of chosen statistics (default)")
optgroup.add_option(
"-r", "--rawdata", action="store_true",
dest="print_raw",
help="display raw data from all boot iterations")
optparser.add_option_group(optgroup)
optparser.set_defaults(print_averages=False)
optparser.set_defaults(print_raw=False)
return optparser
def _ProcessDisplayOptions(options):
display_count = 0
if options.print_averages:
display_count += 1
printfunc = perfprinter.PrintStatisticsSummary
if options.print_raw:
display_count += 1
printfunc = perfprinter.PrintRawData
if display_count == 0:
printfunc = perfprinter.PrintStatisticsSummary
elif display_count > 1:
print >>sys.stderr, "Can't use -a and -r together.\n"
return None
return printfunc
def _ProcessStatsOptions(options):
if options.use_timestats and options.use_diskstats:
print >>sys.stderr, "Can't use -t and -d together.\n"
return None
return not options.use_diskstats
def _ProcessKeylistOptions(options):
if not options.eventnames:
return None
keylist = []
for kl in options.eventnames:
keylist.extend(kl.split(','))
return keylist
def main(argv):
optparser = _SetupOptions()
(options, args) = optparser.parse_args(argv)
printfunc = _ProcessDisplayOptions(options)
use_timestats = _ProcessStatsOptions(options)
keylist = _ProcessKeylistOptions(options)
if printfunc is None or use_timestats is None:
optparser.print_help()
sys.exit(1)
if not args:
args = ["."]
printfunc(resultsdir.ReadResultsDirectory,
args, use_timestats, keylist)
if __name__ == "__main__":
main(sys.argv[1:])