You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.6 KiB
166 lines
5.6 KiB
#!/usr/bin/python2
|
|
|
|
# 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 four sets of
|
|
performance statistics:
|
|
1. boot time statistics (selected by --keyset boot) measure time
|
|
spent since kernel startup;
|
|
2. disk statistics (selected by --keyset disk) measure total bytes
|
|
read from the boot device since kernel startup;
|
|
3. firmware time statistics (selected by --keyset firmware) measure
|
|
time spent since CPU power on.
|
|
4. reboot time statistics (selected by --keyset reboot) measure
|
|
time spent since the shutdown request immediately preceding
|
|
the request.
|
|
|
|
The various statistics are recorded as cumulative time (or disk read)
|
|
since kernel startup (or CPU power on), sampled 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 difference (in time or bytes) between adjacent
|
|
events, and shows the average 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 iteration.
|
|
|
|
"""
|
|
|
|
import sys
|
|
import optparse
|
|
|
|
import perfprinter
|
|
import resultsdir
|
|
import resultset
|
|
|
|
|
|
_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():
|
|
"""Create an OptionParser for the command line."""
|
|
optparser = optparse.OptionParser(usage=_USAGE, description=_DESCRIPTION)
|
|
|
|
optgroup = optparse.OptionGroup(
|
|
optparser, "Statistics selection")
|
|
|
|
keyset_help = ("Selects the set of statistics to display; "
|
|
"choose one of ")
|
|
keyset_help += "'" + resultset.TestResultSet.AVAILABLE_KEYSETS[0] + "'"
|
|
for keyset in resultset.TestResultSet.AVAILABLE_KEYSETS[1:-1]:
|
|
keyset_help += ", '" + keyset + "'"
|
|
keyset_help += (", or '" +
|
|
resultset.TestResultSet.AVAILABLE_KEYSETS[-1] + "'.")
|
|
keyset_default = resultset.TestResultSet.BOOTTIME_KEYSET
|
|
keyset_help += " (Default is '" + keyset_default + "'.)"
|
|
optgroup.add_option(
|
|
"-k", "--keyset", action="store", dest="keyset", type="choice",
|
|
choices=resultset.TestResultSet.AVAILABLE_KEYSETS,
|
|
help=keyset_help)
|
|
optparser.add_option_group(optgroup)
|
|
optparser.set_defaults(keyset=keyset_default)
|
|
|
|
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):
|
|
"""Determine options controlling the display format.
|
|
|
|
Command options allow choosing either raw data format, or summary
|
|
statistics format. The default option is the summary format.
|
|
It's not allowed to select both formats.
|
|
|
|
@param options Parsed command line options data.
|
|
|
|
"""
|
|
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 _ProcessEventlistOptions(options):
|
|
"""Determine whether we'll display all events, or a subset.
|
|
|
|
Command options allow restricting a chosen key set to a
|
|
list of specific events. If the option is present, return
|
|
the list of events. Otherwise, return `None`.
|
|
|
|
@param options Parsed command line options data.
|
|
|
|
"""
|
|
if not options.eventnames:
|
|
return None
|
|
eventlist = []
|
|
for kl in options.eventnames:
|
|
eventlist.extend(kl.split(','))
|
|
return eventlist
|
|
|
|
|
|
def main(argv):
|
|
"""Canonical main routine."""
|
|
optparser = _SetupOptions()
|
|
(options, args) = optparser.parse_args(argv)
|
|
printfunc = _ProcessDisplayOptions(options)
|
|
keyset_type = options.keyset
|
|
eventlist = _ProcessEventlistOptions(options)
|
|
if printfunc is None or keyset_type is None:
|
|
optparser.print_help()
|
|
sys.exit(1)
|
|
if not args:
|
|
args = ["."]
|
|
printfunc(resultsdir.ReadResultsDirectory,
|
|
args, keyset_type, eventlist)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main(sys.argv[1:])
|