xref: /aosp_15_r20/external/autotest/client/profilers/iostat/iostat.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li"""
2*9c5db199SXin LiRun iostat with a default interval of 1 second.
3*9c5db199SXin Li"""
4*9c5db199SXin Liimport time, os, subprocess
5*9c5db199SXin Lifrom autotest_lib.client.bin import profiler
6*9c5db199SXin Lifrom autotest_lib.client.common_lib import utils, error
7*9c5db199SXin Li
8*9c5db199SXin Li
9*9c5db199SXin Liclass iostat(profiler.profiler):
10*9c5db199SXin Li    version = 2
11*9c5db199SXin Li
12*9c5db199SXin Li    def initialize(self, interval = 1, options = ''):
13*9c5db199SXin Li        # Usage: iostat [ options... ] [ <interval> [ <count> ] ]
14*9c5db199SXin Li        # e.g, iostat -tmx 2
15*9c5db199SXin Li        self.interval = interval
16*9c5db199SXin Li        self.options = options
17*9c5db199SXin Li
18*9c5db199SXin Li
19*9c5db199SXin Li    def start(self, test):
20*9c5db199SXin Li        cmd = "/usr/bin/iostat %s %d" % (self.options, self.interval)
21*9c5db199SXin Li        filename = "iostat." + time.strftime("%Y-%m-%d-%H-%M-%S")
22*9c5db199SXin Li        logfile = open(os.path.join(test.profdir, filename), 'w')
23*9c5db199SXin Li        p = subprocess.Popen(cmd, shell=True, stdout=logfile,
24*9c5db199SXin Li                             stderr=subprocess.STDOUT)
25*9c5db199SXin Li        self.pid = p.pid
26*9c5db199SXin Li
27*9c5db199SXin Li
28*9c5db199SXin Li    def stop(self, test):
29*9c5db199SXin Li        try:
30*9c5db199SXin Li            term_profiler = "kill -15 %d" % self.pid
31*9c5db199SXin Li            # send SIGTERM to iostat and give it a 5-sec timeout
32*9c5db199SXin Li            utils.system(term_profiler, timeout=5)
33*9c5db199SXin Li        except error.CmdError: # probably times out
34*9c5db199SXin Li            pass
35*9c5db199SXin Li        # do a ps again to see if iostat is still there
36*9c5db199SXin Li        ps_cmd = "ps -p %d | grep iostat" % self.pid
37*9c5db199SXin Li        out = utils.system_output(ps_cmd, ignore_status=True)
38*9c5db199SXin Li        if out != '':
39*9c5db199SXin Li            kill_profiler = 'kill -9 %d' % self.pid
40*9c5db199SXin Li            utils.system(kill_profiler, ignore_status=True)
41*9c5db199SXin Li
42*9c5db199SXin Li
43*9c5db199SXin Li    def report(self, test):
44*9c5db199SXin Li        return None
45