Ojan Vafai 61d78bd869 Convert sky_server over to a go-based http server.
We keep seeing timeouts on the bots that seem to be due
to cherrypy dropping requests on the floor, which in turn
causes imports to stall, which causes the test to time out.
In local testing, I was able to reproduce the timeouts
and wasn't able to do so with the go-based server.

R=abarth@chromium.org, eseidel@chromium.org

Review URL: https://codereview.chromium.org/746373002
2014-12-04 16:10:09 -08:00

132 lines
3.9 KiB
Python
Executable File

#!/usr/bin/env python
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from skypy.find_tests import find_tests
from skypy.paths import Paths
import argparse
import os
import re
import requests
import skypy.configuration as configuration
import subprocess
SUPPORTED_MIME_TYPES = [
'text/html',
'text/sky',
'text/plain',
]
HTTP_PORT = 9999
URL_ROOT = 'http://localhost:%s/' % HTTP_PORT
DASHBOARD_URL = 'https://chromeperf.appspot.com/add_point'
BENCHMARKS_DIR = 'benchmarks'
def values_from_output(output):
# Parse out the raw values from the PerfRunner output:
# values 90, 89, 93 ms
# We'll probably need a fancier parser at some point.
match = re.search(r'values (.+) ms', output, flags=re.MULTILINE)
return map(float, match.group(1).split(', '))
def create_json_blob(values):
revision = subprocess.check_output(["git", "show-ref", "HEAD", "-s"]).strip()
return {
"master": "master.mojo.perf",
"bot": "sky-release",
"point_id": 123456, # FIXME: We need to generate a monotonicly increasing number somehow.
"versions": {
"mojo": revision
},
"chart_data": {
"format_version": "1.0",
"benchmark_name": "layout.simple-blocks",
"charts": {
"warm_times": {
"traces": {
"layout.simple-blocks": {
"type": "list_of_scalar_values",
"values": values,
},
}
}
}
}
}
def send_json_to_dashboard(json):
requests.post(DASHBOARD_URL, params={ 'data': json })
class PerfHarness(object):
def __init__(self, args):
self._sky_server = None
self.paths = Paths(os.path.join('out', 'Debug'))
self.args = args
def _start_server(self):
subprocess.call(os.path.join(self.paths.sky_tools_directory,
'download_sky_server'))
return subprocess.Popen([
os.path.join(self.paths.src_root, 'out', 'downloads', 'sky_server'),
self.paths.src_root,
str(HTTP_PORT),
'-t', self.args.configuration
])
def _sky_tester_command(self, url):
content_handlers = ['%s,%s' % (mime_type, 'mojo:sky_viewer')
for mime_type in SUPPORTED_MIME_TYPES]
return [
self.paths.mojo_shell_path,
'--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa',
'--args-for=mojo:window_manager %s' % url,
'--content-handlers=%s' % ','.join(content_handlers),
'--url-mappings=mojo:window_manager=mojo:sky_tester',
'mojo:window_manager',
]
def _url_for_path(self, path):
return URL_ROOT + os.path.relpath(path, self.paths.src_root)
def _run_tests(self, path):
url = self._url_for_path(path)
output = subprocess.check_output(
self._sky_tester_command(url),
stderr=subprocess.STDOUT)
values = values_from_output(output)
print os.path.basename(path), "=>", values
# FIXME: Upload JSON blob to results server:
# json = create_json_blob(values)
# send_json_to_dashboard(json)
def main(self):
self._start_server()
map(self._run_tests, find_tests(os.path.join(self.paths.sky_root, BENCHMARKS_DIR)))
def shutdown(self):
if self._sky_server:
self._sky_server.terminate()
def main():
parser = argparse.ArgumentParser(description='Sky performance tester')
configuration.add_arguments(parser)
args = parser.parse_args()
harness = PerfHarness(args)
try:
harness.main()
except (KeyboardInterrupt, SystemExit):
pass
finally:
harness.shutdown()
if __name__ == '__main__':
main()