96 lines
3.4 KiB
Python
96 lines
3.4 KiB
Python
# Lint as: python2, python3
|
|
#
|
|
# Copyright 2007 Google Inc. All Rights Reserved.
|
|
|
|
"""Runs profilers on a machine when no autotest job is running.
|
|
|
|
This is used to profile a task when the task is running on a machine that is not
|
|
running through autotest.
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
|
|
__author__ = 'cranger@google.com (Colby Ranger)'
|
|
|
|
import platform
|
|
import common
|
|
from autotest_lib.client.common_lib import barrier
|
|
import six
|
|
|
|
# Client control file snippet used to synchronize profiler start & stop.
|
|
_RUNTEST_PATTERN = ("job.run_test('profiler_sync', timeout_sync=%r,\n"
|
|
" timeout_start=%r, timeout_stop=%r,\n"
|
|
" hostid='%s', masterid='%s', all_ids=%r)")
|
|
_PROF_MASTER = platform.node()
|
|
_PORT = 11920
|
|
|
|
|
|
def _encode_args(profiler, args, dargs):
|
|
parts = [repr(profiler)]
|
|
parts += [repr(arg) for arg in args]
|
|
parts += ["%s=%r" % darg for darg in six.iteritems(dargs)]
|
|
return ", ".join(parts)
|
|
|
|
|
|
def generate_test(machines, hostname, profilers, timeout_start, timeout_stop,
|
|
timeout_sync=180):
|
|
"""
|
|
Generate a control file that enables profilers and starts profiler_sync.
|
|
|
|
@param machines: sequence of all the hostnames involved in the barrier
|
|
synchronization
|
|
@param hostname: hostname of the machine running the generated control file
|
|
@param profilers: a sequence of 3 items tuples where the first item is a
|
|
string (the profiler name), second argument is a tuple with the
|
|
non keyword arguments to give to the profiler when being added
|
|
with "job.profilers.add()" in the control file, third item is
|
|
a dictionary of the keyword arguments to give it
|
|
@param timeout_start: how many seconds to wait in profiler_sync for the
|
|
profilers to start (None means no timeout)
|
|
@param timeout_stop: how many seconds to wait in profiler_sync for the
|
|
profilers to stop (None means no timeout)
|
|
@param timeout_sync: how many seconds to wait in profiler_sync for other
|
|
machines to reach the start of the profiler_sync (None means no
|
|
timeout)
|
|
"""
|
|
control_file = []
|
|
for profiler in profilers:
|
|
control_file.append("job.profilers.add(%s)"
|
|
% _encode_args(*profiler))
|
|
|
|
profiler_sync_call = (_RUNTEST_PATTERN %
|
|
(timeout_sync, timeout_start, timeout_stop,
|
|
hostname, _PROF_MASTER, machines))
|
|
control_file.append(profiler_sync_call)
|
|
|
|
for profiler in reversed(profilers):
|
|
control_file.append("job.profilers.delete('%s')" % profiler[0])
|
|
|
|
return "\n".join(control_file)
|
|
|
|
|
|
def wait_for_profilers(machines, timeout=300):
|
|
sb = barrier.barrier(_PROF_MASTER, "sync_profilers",
|
|
timeout, port=_PORT)
|
|
sb.rendezvous_servers(_PROF_MASTER, *machines)
|
|
|
|
|
|
def start_profilers(machines, timeout=120):
|
|
sb = barrier.barrier(_PROF_MASTER, "start_profilers",
|
|
timeout, port=_PORT)
|
|
sb.rendezvous_servers(_PROF_MASTER, *machines)
|
|
|
|
|
|
def stop_profilers(machines, timeout=120):
|
|
sb = barrier.barrier(_PROF_MASTER, "stop_profilers",
|
|
timeout, port=_PORT)
|
|
sb.rendezvous_servers(_PROF_MASTER, *machines)
|
|
|
|
|
|
def finish_profilers(machines, timeout=120):
|
|
sb = barrier.barrier(_PROF_MASTER, "finish_profilers",
|
|
timeout, port=_PORT)
|
|
sb.rendezvous_servers(_PROF_MASTER, *machines)
|