Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 1 | #!/usr/bin/python |
Ahmad Sharif | fd356fb | 2012-05-07 12:02:16 -0700 | [diff] [blame^] | 2 | # |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 3 | # Copyright 2011 Google Inc. All Rights Reserved. |
| 4 | |
| 5 | import os |
| 6 | import re |
Ahmad Sharif | fd356fb | 2012-05-07 12:02:16 -0700 | [diff] [blame^] | 7 | |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 8 | from utils import command_executer |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 9 | |
| 10 | |
| 11 | class PerfProcessor(object): |
| 12 | class PerfResults(object): |
| 13 | def __init__(self, report, output): |
| 14 | self.report = report |
| 15 | self.output = output |
| 16 | |
Ahmad Sharif | fd356fb | 2012-05-07 12:02:16 -0700 | [diff] [blame^] | 17 | def __init__(self, results_dir, chromeos_root, board, logger_to_use=None): |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 18 | self._logger = logger_to_use |
| 19 | self._ce = command_executer.GetCommandExecuter(self._logger) |
Ahmad Sharif | fd356fb | 2012-05-07 12:02:16 -0700 | [diff] [blame^] | 20 | self._results_dir = results_dir |
| 21 | self._chromeos_root = chromeos_root |
| 22 | self._board = board |
| 23 | self._perf_relative_dir = os.path.basename(self._results_dir) |
| 24 | self.host_data_file = self.FindSingleFile( |
| 25 | "perf.data", os.path.join( |
| 26 | chromeos_root, |
| 27 | "chroot", |
| 28 | self._results_dir.lstrip("/"))) |
| 29 | self.perf_out = self.FindSingleFile( |
| 30 | "perf.out", os.path.join( |
| 31 | chromeos_root, |
| 32 | "chroot", |
| 33 | self._results_dir.lstrip("/"))) |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 34 | |
Ahmad Sharif | fd356fb | 2012-05-07 12:02:16 -0700 | [diff] [blame^] | 35 | def FindSingleFile(self, name, path): |
| 36 | find_command = ("find %s -name %s" % (path, name)) |
| 37 | ret, out, err = self._ce.RunCommand(find_command, return_output=True) |
| 38 | if ret == 0: |
| 39 | data_files = out.splitlines() |
| 40 | if len(data_files) == 0: |
| 41 | # No data file, no report to generate. |
| 42 | data_file = None |
| 43 | else: |
| 44 | assert len(data_files) == 1, "More than 1 perf.out file found" |
| 45 | data_file = data_files[0] |
| 46 | return data_file |
| 47 | |
| 48 | |
| 49 | def GeneratePerfResults(self): |
| 50 | perf_location = os.path.join(self._results_dir, |
| 51 | self._perf_relative_dir) |
| 52 | if self.perf_out != None: |
| 53 | output = self._ReadPerfOutput() |
| 54 | |
| 55 | if self.host_data_file != None: |
| 56 | perf_location = os.path.join(self._results_dir, |
| 57 | self._perf_relative_dir) |
| 58 | host_perf_location = os.path.dirname(self.host_data_file) |
| 59 | report = self._GeneratePerfReport(perf_location, |
| 60 | self._chromeos_root, |
| 61 | self._board) |
| 62 | else: |
| 63 | # lets make perf.report have output of stat... |
| 64 | report = output |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 65 | return PerfProcessor.PerfResults(report, output) |
| 66 | |
| 67 | def ParseStatResults(self, results): |
| 68 | output = results.output |
| 69 | result = {} |
| 70 | p = re.compile("\s*([0-9.]+) +(\S+)") |
| 71 | for line in output.split("\n"): |
| 72 | match = p.match(line) |
| 73 | if match: |
| 74 | result[match.group(2)] = match.group(1) |
| 75 | return result |
| 76 | |
Ahmad Sharif | fd356fb | 2012-05-07 12:02:16 -0700 | [diff] [blame^] | 77 | def _ReadPerfOutput(self): |
| 78 | with open(self.perf_out, "rb") as f: |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 79 | return f.read() |
| 80 | |
| 81 | def _GeneratePerfReport(self, perf_location, chromeos_root, board): |
| 82 | perf_data_file = os.path.join(perf_location, "perf.data") |
| 83 | # Attempt to build a perf report and keep it with the results. |
| 84 | command = ("/usr/sbin/perf report --symfs=/build/%s" |
Ahmad Sharif | fd356fb | 2012-05-07 12:02:16 -0700 | [diff] [blame^] | 85 | " --vmlinux /build/%s/usr/lib/debug/boot/vmlinux" |
| 86 | " --kallsyms /build/%s/boot/System.map-*" |
| 87 | " -i %s --stdio | head -n1000" % (board, board, board, |
| 88 | perf_data_file)) |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 89 | _, out, _ = self._ce.ChrootRunCommand(chromeos_root, |
| 90 | command, return_output=True) |
| 91 | return out |
| 92 | |
| 93 | |
| 94 | class MockPerfProcessor(object): |
| 95 | def __init__(self): |
| 96 | pass |
| 97 | |
| 98 | def GeneratePerfReport(self, *args): |
| 99 | pass |
| 100 | |
| 101 | def ParseStatResults(self, *args): |
| 102 | return {} |