From f31e8841fb563d20a848b23e684f726b3d07b61d Mon Sep 17 00:00:00 2001 From: Connor Imes Date: Tue, 8 Mar 2016 13:48:30 -0600 Subject: [PATCH] Heartbeats now on crates.io. Updates to energymon interface for energy profiling. Profiling script for Android. --- components/profile/Cargo.toml | 4 +- components/profile_traits/Cargo.toml | 2 +- components/servo/Cargo.lock | 67 +++++++++---- ports/cef/Cargo.lock | 31 ++++-- ports/gonk/Cargo.lock | 31 ++++-- tests/heartbeats/characterize.py | 14 +-- tests/heartbeats/characterize_android.py | 119 +++++++++++++++++++++++ tests/heartbeats/process_logs.py | 18 +++- 8 files changed, 236 insertions(+), 50 deletions(-) create mode 100644 tests/heartbeats/characterize_android.py diff --git a/components/profile/Cargo.toml b/components/profile/Cargo.toml index 9df1e76c56e..fcca1ce2b58 100644 --- a/components/profile/Cargo.toml +++ b/components/profile/Cargo.toml @@ -17,13 +17,11 @@ path = "../plugins" [dependencies.util] path = "../util" -[dependencies.hbs-pow] -git = "https://github.com/libheartbeats/heartbeats-simple-rust.git" - [dependencies.ipc-channel] git = "https://github.com/servo/ipc-channel" [dependencies] +hbs-pow = "0.2" log = "0.3" libc = "0.2" regex = "0.1.55" diff --git a/components/profile_traits/Cargo.toml b/components/profile_traits/Cargo.toml index b783c76d799..09475887f58 100644 --- a/components/profile_traits/Cargo.toml +++ b/components/profile_traits/Cargo.toml @@ -19,7 +19,7 @@ git = "https://github.com/energymon/energymon-rust.git" optional = true [dependencies.energy-monitor] -version = "0.1.0" +version = "0.2.0" optional = true [dependencies.plugins] diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 4b3053f9a8a..dd6709886e3 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -236,6 +236,14 @@ dependencies = [ "winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cmake" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cocoa" version = "0.2.5" @@ -509,33 +517,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "energy-monitor" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "energymon" -version = "0.1.0" -source = "git+https://github.com/energymon/energymon-rust.git#637e537934cdfc2142011a910490a408ea135af2" +version = "0.2.0" +source = "git+https://github.com/energymon/energymon-rust.git#7b30c4d88ac1fcfaf7755081ebdd810c5dcf4fea" dependencies = [ - "energy-monitor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "energymon-default-sys 0.1.0 (git+https://github.com/energymon/energymon-sys.git)", + "energy-monitor 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "energymon-default-sys 0.2.0 (git+https://github.com/energymon/energymon-sys.git)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "energymon-default-sys" -version = "0.1.0" -source = "git+https://github.com/energymon/energymon-sys.git#199cd11b36f14768a6a379843400c6a6671ffe5e" +name = "energymon-builder" +version = "0.2.0" +source = "git+https://github.com/energymon/energymon-sys.git#a0fb99b0312372958b110ae6378b5c89c2287172" dependencies = [ - "energymon-sys 0.1.0 (git+https://github.com/energymon/energymon-sys.git)", - "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "energymon-default-sys" +version = "0.2.0" +source = "git+https://github.com/energymon/energymon-sys.git#a0fb99b0312372958b110ae6378b5c89c2287172" +dependencies = [ + "energymon-builder 0.2.0 (git+https://github.com/energymon/energymon-sys.git)", + "energymon-sys 0.2.0 (git+https://github.com/energymon/energymon-sys.git)", + "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "energymon-sys" -version = "0.1.0" -source = "git+https://github.com/energymon/energymon-sys.git#199cd11b36f14768a6a379843400c6a6671ffe5e" +version = "0.2.0" +source = "git+https://github.com/energymon/energymon-sys.git#a0fb99b0312372958b110ae6378b5c89c2287172" dependencies = [ "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -798,10 +814,19 @@ dependencies = [ "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hbs-builder" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cmake 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hbs-common-sys" version = "0.2.0" -source = "git+https://github.com/libheartbeats/heartbeats-simple-sys.git#9ae3875aa26610d6155b5191f832e74410558a73" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -809,20 +834,20 @@ dependencies = [ [[package]] name = "hbs-pow" version = "0.2.0" -source = "git+https://github.com/libheartbeats/heartbeats-simple-rust.git#0f46659b465927a88b23b69b66602ded43dd37b7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hbs-pow-sys 0.2.0 (git+https://github.com/libheartbeats/heartbeats-simple-sys.git)", + "hbs-pow-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hbs-pow-sys" version = "0.2.0" -source = "git+https://github.com/libheartbeats/heartbeats-simple-sys.git#9ae3875aa26610d6155b5191f832e74410558a73" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hbs-common-sys 0.2.0 (git+https://github.com/libheartbeats/heartbeats-simple-sys.git)", + "hbs-builder 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hbs-common-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1514,7 +1539,7 @@ dependencies = [ name = "profile" version = "0.0.1" dependencies = [ - "hbs-pow 0.2.0 (git+https://github.com/libheartbeats/heartbeats-simple-rust.git)", + "hbs-pow 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.2.1 (git+https://github.com/servo/ipc-channel)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1530,8 +1555,8 @@ dependencies = [ name = "profile_traits" version = "0.0.1" dependencies = [ - "energy-monitor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "energymon 0.1.0 (git+https://github.com/energymon/energymon-rust.git)", + "energy-monitor 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "energymon 0.2.0 (git+https://github.com/energymon/energymon-rust.git)", "ipc-channel 0.2.1 (git+https://github.com/servo/ipc-channel)", "plugins 0.0.1", "serde 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index eed1743770c..36195c1b5e6 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -221,6 +221,14 @@ dependencies = [ "winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cmake" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cocoa" version = "0.2.5" @@ -726,10 +734,19 @@ dependencies = [ "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hbs-builder" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cmake 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hbs-common-sys" version = "0.2.0" -source = "git+https://github.com/libheartbeats/heartbeats-simple-sys.git#9ae3875aa26610d6155b5191f832e74410558a73" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -737,20 +754,20 @@ dependencies = [ [[package]] name = "hbs-pow" version = "0.2.0" -source = "git+https://github.com/libheartbeats/heartbeats-simple-rust.git#0f46659b465927a88b23b69b66602ded43dd37b7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hbs-pow-sys 0.2.0 (git+https://github.com/libheartbeats/heartbeats-simple-sys.git)", + "hbs-pow-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hbs-pow-sys" version = "0.2.0" -source = "git+https://github.com/libheartbeats/heartbeats-simple-sys.git#9ae3875aa26610d6155b5191f832e74410558a73" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hbs-common-sys 0.2.0 (git+https://github.com/libheartbeats/heartbeats-simple-sys.git)", + "hbs-builder 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hbs-common-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1400,7 +1417,7 @@ dependencies = [ name = "profile" version = "0.0.1" dependencies = [ - "hbs-pow 0.2.0 (git+https://github.com/libheartbeats/heartbeats-simple-rust.git)", + "hbs-pow 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.2.1 (git+https://github.com/servo/ipc-channel)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock index 8f43878a726..45d74481a47 100644 --- a/ports/gonk/Cargo.lock +++ b/ports/gonk/Cargo.lock @@ -214,6 +214,14 @@ dependencies = [ "winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cmake" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cocoa" version = "0.2.5" @@ -708,10 +716,19 @@ dependencies = [ "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hbs-builder" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cmake 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hbs-common-sys" version = "0.2.0" -source = "git+https://github.com/libheartbeats/heartbeats-simple-sys.git#9ae3875aa26610d6155b5191f832e74410558a73" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -719,20 +736,20 @@ dependencies = [ [[package]] name = "hbs-pow" version = "0.2.0" -source = "git+https://github.com/libheartbeats/heartbeats-simple-rust.git#0f46659b465927a88b23b69b66602ded43dd37b7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hbs-pow-sys 0.2.0 (git+https://github.com/libheartbeats/heartbeats-simple-sys.git)", + "hbs-pow-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hbs-pow-sys" version = "0.2.0" -source = "git+https://github.com/libheartbeats/heartbeats-simple-sys.git#9ae3875aa26610d6155b5191f832e74410558a73" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hbs-common-sys 0.2.0 (git+https://github.com/libheartbeats/heartbeats-simple-sys.git)", + "hbs-builder 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hbs-common-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1382,7 +1399,7 @@ dependencies = [ name = "profile" version = "0.0.1" dependencies = [ - "hbs-pow 0.2.0 (git+https://github.com/libheartbeats/heartbeats-simple-rust.git)", + "hbs-pow 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.2.1 (git+https://github.com/servo/ipc-channel)", "libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/tests/heartbeats/characterize.py b/tests/heartbeats/characterize.py index abb7f1ba65b..5a4e9fef5be 100644 --- a/tests/heartbeats/characterize.py +++ b/tests/heartbeats/characterize.py @@ -23,7 +23,7 @@ HEARTBEAT_PROFILER_CATEGORIES = [ ("Compositing", HEARTBEAT_DEFAULT_WINDOW_SIZE), ("LayoutPerform", HEARTBEAT_DEFAULT_WINDOW_SIZE), ("LayoutStyleRecalc", HEARTBEAT_DEFAULT_WINDOW_SIZE), - ("LayoutTextShaping", HEARTBEAT_DEFAULT_WINDOW_SIZE), + # ("LayoutTextShaping", HEARTBEAT_DEFAULT_WINDOW_SIZE), ("LayoutRestyleDamagePropagation", HEARTBEAT_DEFAULT_WINDOW_SIZE), ("LayoutNonIncrementalReset", HEARTBEAT_DEFAULT_WINDOW_SIZE), ("LayoutSelectorMatch", HEARTBEAT_DEFAULT_WINDOW_SIZE), @@ -56,7 +56,7 @@ HEARTBEAT_PROFILER_CATEGORIES = [ ("ScriptWorkerEvent", HEARTBEAT_DEFAULT_WINDOW_SIZE), ("ApplicationHeartbeat", 100), ] -ENERGY_READER_BIN = "energymon" +ENERGY_READER_BIN = "energymon-file-provider" ENERGY_READER_TEMP_OUTPUT = "energymon.txt" SUMMARY_OUTPUT = "summary.txt" @@ -179,7 +179,7 @@ def main(): # Default benchmark benchmark = path.join(TOP_DIR, "tests", "html", "perf-rainbow.html") # Default renderer - renderer = "-c" + renderer = "" # Default output directory output_dir = "heartbeat_logs" # Default build target @@ -199,9 +199,9 @@ def main(): parser.add_argument("-d", "--debug", action='store_true', help="Use debug build instead of release build") - parser.add_argument("-g", "--gpu", + parser.add_argument("-w", "--webrender", action='store_true', - help="Rendering with GPU instead of CPU") + help="Use webrender backend") parser.add_argument("-l", "--max_layout_threads", help="Specify the maximum number of threads for layout, for example \"-l 5\"") parser.add_argument("-o", "--output", @@ -222,8 +222,8 @@ def main(): benchmark = args.benchmark if args.debug: build_target = "debug" - if args.gpu: - renderer = "-g" + if args.webrender: + renderer = "-w" if args.max_layout_threads: max_layout_threads = int(args.max_layout_threads) if args.output: diff --git a/tests/heartbeats/characterize_android.py b/tests/heartbeats/characterize_android.py new file mode 100644 index 00000000000..aae26ac2cbb --- /dev/null +++ b/tests/heartbeats/characterize_android.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import sys +import os +from os import path +import time +import datetime +import argparse +import subprocess + +TOP_DIR = path.join("..", "..") +GUARD_TIME = 20 +SUMMARY_OUTPUT = "summary.txt" + + +def get_command(layout_thread_count, renderer, page, profile): + """Get the command to execute. + """ + return path.join(TOP_DIR, "mach") + " run --android" + \ + " -p %d -o /sdcard/servo/output.png -y %d %s -Z profile-script-events,profile-heartbeats '%s'" % \ + (profile, layout_thread_count, renderer, page) + + +def git_rev_hash(): + """Get the git revision hash. + """ + return subprocess.check_output(['git', 'rev-parse', 'HEAD']).rstrip() + + +def git_rev_hash_short(): + """Get the git revision short hash. + """ + return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).rstrip() + + +def execute(base_dir, renderer, page, profile, trial, layout_thread_count): + """Run a single execution. + """ + log_dir = path.join(base_dir, "logs_l" + str(layout_thread_count), + "trial_" + str(trial)) + if os.path.exists(log_dir): + print "Log directory already exists: " + log_dir + sys.exit(1) + os.makedirs(log_dir) + + # Execute + cmd = get_command(layout_thread_count, renderer, page, profile) + print cmd + os.system(cmd) + print 'sleep ' + str(GUARD_TIME) + time.sleep(GUARD_TIME) + + # Write a file that describes this execution + with open(path.join(log_dir, SUMMARY_OUTPUT), "w") as f: + f.write("Datetime (UTC): " + datetime.datetime.utcnow().isoformat()) + f.write("\nPlatform: Android") + f.write("\nGit hash: " + git_rev_hash()) + f.write("\nGit short hash: " + git_rev_hash_short()) + f.write("\nLayout threads: " + str(layout_thread_count)) + f.write("\nTrial: " + str(trial)) + f.write("\nCommand: " + cmd) + + +def main(): + """For this script to be useful, the following conditions are needed: + - Build servo for Android in release mode with the "energy-profiling" feature enabled. + """ + # Default number of layout threads + layout_threads = 1 + # Default benchmark + benchmark = "https://www.mozilla.org/" + # Default renderer + renderer = "" + # Default output directory + output_dir = "heartbeat_logs" + # Default profile interval + profile = 60 + + # Parsing the input of the script + parser = argparse.ArgumentParser(description="Characterize Servo timing and energy behavior on Android") + parser.add_argument("-b", "--benchmark", + default=benchmark, + help="Gets the benchmark, for example \"-b http://www.example.com\"") + parser.add_argument("-w", "--webrender", + action='store_true', + help="Use webrender backend") + parser.add_argument("-l", "--layout_threads", + help="Specify the number of threads for layout, for example \"-l 5\"") + parser.add_argument("-o", "--output", + help="Specify the log output directory, for example \"-o heartbeat_logs\"") + parser.add_argument("-p", "--profile", + default=60, + help="Profiler output interval, for example \"-p 60\"") + + args = parser.parse_args() + if args.benchmark: + benchmark = args.benchmark + if args.webrender: + renderer = "-w" + if args.layout_threads: + layout_threads = int(args.layout_threads) + if args.output: + output_dir = args.output + if args.profile: + profile = args.profile + + if os.path.exists(output_dir): + print "Output directory already exists: " + output_dir + sys.exit(1) + os.makedirs(output_dir) + + execute(output_dir, renderer, benchmark, profile, 1, layout_threads) + +if __name__ == "__main__": + main() diff --git a/tests/heartbeats/process_logs.py b/tests/heartbeats/process_logs.py index b6f0f2a49d4..30b5875daf0 100644 --- a/tests/heartbeats/process_logs.py +++ b/tests/heartbeats/process_logs.py @@ -359,6 +359,8 @@ def main(): directory = 'heartbeat_logs' # Default output directory output_dir = 'plots' + # Default android + android = False # Parsing the input of the script parser = argparse.ArgumentParser(description="Process Heartbeat log files from characterization") @@ -368,12 +370,19 @@ def main(): parser.add_argument("-o", "--output", default=output_dir, help="Specify the log output directory, for example \"-o plots\"") + parser.add_argument("--android", + action="store_true", + dest="android", + default=False, + help="Specify if processing results from Android") args = parser.parse_args() if args.directory: directory = args.directory if args.output: output_dir = args.output + if args.android: + android = args.android if not os.path.exists(directory): print "Input directory does not exist: " + directory @@ -385,10 +394,11 @@ def main(): res = process_logs(directory) - best = find_best_executions(directory) - print 'Best time:', best[0] - print 'Best energy:', best[1] - print 'Best power:', best[2] + if not android: + best = find_best_executions(directory) + print 'Best time:', best[0] + print 'Best energy:', best[1] + print 'Best power:', best[2] os.makedirs(output_dir) plot_all_raw_totals(res, output_dir)