On Mon, Sep 3, 2012 at 3:21 AM,  <[email protected]> wrote:
> From: Yunping Zheng <[email protected]>
>
> This patch add systemtap profilers in autotest. systemstap will run
> ships with your test.using systemtap can provide more useful debugging
> date.
> When you use this profoler,you should add 'profilers = systemtap' and
> 'stap_script_file = file_path_systemtap_script' under you test.if the
> 'file_path_systemtap_script' you assigned is a relative path,the
> script will find the file under 'test.virtdir'.

Thanks for the profiler. There are some things that need to be fixed,
I'm working on them, see below:

> Signed-off-by: yunping zheng <[email protected]>
> Signed-off-by: Yunping Zheng <[email protected]>
> ---
>  client/profilers/systemtap/control      |  3 ++
>  client/profilers/systemtap/systemtap.py | 52 
> +++++++++++++++++++++++++++++++++
>  client/virt/utils_misc.py               |  2 +-
>  3 files changed, 56 insertions(+), 1 deletion(-)
>  create mode 100644 client/profilers/systemtap/__init__.py
>  create mode 100644 client/profilers/systemtap/control
>  create mode 100644 client/profilers/systemtap/systemtap.py
>
> diff --git a/client/profilers/systemtap/__init__.py 
> b/client/profilers/systemtap/__init__.py
> new file mode 100644
> index 0000000..e69de29
> diff --git a/client/profilers/systemtap/control 
> b/client/profilers/systemtap/control
> new file mode 100644
> index 0000000..fca7fea
> --- /dev/null
> +++ b/client/profilers/systemtap/control
> @@ -0,0 +1,3 @@
> +job.profilers.add('systemtap', 2)
> +job.run_test('sleeptest', seconds=5)
> +job.profilers.delete('systemtap')
> diff --git a/client/profilers/systemtap/systemtap.py 
> b/client/profilers/systemtap/systemtap.py
> new file mode 100644
> index 0000000..4ad513e
> --- /dev/null
> +++ b/client/profilers/systemtap/systemtap.py
> @@ -0,0 +1,52 @@
> +"""
> +Run systemstap.
> +"""
> +import logging, os, re, subprocess
> +from autotest.client import profiler
> +from autotest.client.shared import utils, error
> +from autotest.client.virt import utils_misc
> +
> +class systemtap(profiler.profiler):
> +    version = 1
> +
> +    def initialize(self, **dargs):
> +        """
> +            Tracing the qemu process using systemtap tools.
> +        """
> +        self.script_name = dargs.get('stap_script_file')
> +        stap_support_cmd = "stap -e 'probe begin { log(\"Support\") exit() 
> }'"
> +        if not  re.findall("Support", utils.system_output(stap_support_cmd)):
> +            raise error.TestWarn("Seems your host not support 'stap'")
> +        if not self.script_name:
> +            raise error.TestWarn("You should assign a script file")
> +
> +    def start(self, test):
> +        stap_script = utils_misc.get_path(test.virtdir, self.script_name)

Profilers are not virt test specific, they can be used by any autotest
client module. Such modules don't have a virtdir attribute, so this
will throw an AttributeError, that must be properly handled.

> +        if os.path.isfile(stap_script):
> +            cmd = "sudo stap %s"  % (stap_script)
> +            filename = "systemtap.log"
> +            logfile = open(utils_misc.get_path(test.profdir, filename), 'w')
> +            logging.debug("Start systemtap profiling, using:'%s'" % cmd)
> +            p = subprocess.Popen(cmd, shell=True, stdout=logfile,
> +                                             stderr=subprocess.STDOUT)
> +            self.pid = p.pid
> +        else:
> +            raise error.TestWarn("The stap script '%s' not exist" % 
> stap_script)

At least on KVM stat, gracefully degrading seems to be the best
option, rather than stopping a test. A warning message "hey, you asked
for this stap probe to be used, but we can't find it" is better.

> +    def stop(self, test):
> +        try:
> +            term_profiler = "kill -15 %d" % self.pid
> +            # send SIGTERM to iostat and give it a 5-sec timeout
> +            utils.system(term_profiler, timeout=5)
> +        except error.CmdError: # probably times out
> +            pass
> +        # do a ps again to see if iostat is still there
> +        ps_cmd = "ps -p %d | grep stap" % self.pid
> +        out = utils.system_output(ps_cmd, ignore_status=True)
> +        if out != '':
> +            kill_profiler = 'kill -9 %d' % self.pid
> +            utils.system(kill_profiler, ignore_status=True)
> +
> +
> +    def report(self, test):
> +        return None
> diff --git a/client/virt/utils_misc.py b/client/virt/utils_misc.py
> index 50fd47a..1fb3faa 100644
> --- a/client/virt/utils_misc.py
> +++ b/client/virt/utils_misc.py
> @@ -1623,7 +1623,7 @@ def run_tests(parser, job):
>              # Setting up profilers during test execution.
>              profilers = param_dict.get("profilers", "").split()
>              for profiler in profilers:
> -                job.profilers.add(profiler)
> +                job.profilers.add(profiler, **param_dict)
>              # We need only one execution, profiled, hence we're passing
>              # the profile_only parameter to job.run_test().
>              profile_only = bool(profilers) or None
> --
> 1.7.11.4
>
> _______________________________________________
> Autotest-kernel mailing list
> [email protected]
> https://www.redhat.com/mailman/listinfo/autotest-kernel



-- 
Lucas

_______________________________________________
Autotest-kernel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/autotest-kernel

Reply via email to