| #!/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 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:]) |