4617adb3 |
from __future__ import division,print_function
import subprocess
import time
def start_iostat():
command = subprocess.Popen(['/usr/bin/iostat', '-dmx', '1'], bufsize=1, stdout=subprocess.PIPE)
return command
class Averager(object):
def __init__(self):
self.values = []
self.average = 0
self.len = 0
def update(self, value):
self.values.append(value)
self.len += 1
value /= self.len
self.average = (self.average / self.len) * (self.len-1) + value
return self
@property
def value(self):
return self.values[-1]
def get_data(command):
command.stdout.readline() # skip header
command.stdout.readline() # skip blank line
table_headers = tuple(command.stdout.readline().split())
yield table_headers
averages = [Averager() for __ in range(len(table_headers)-1)]
while True:
line = command.stdout.readline().strip()
if line == '':
time.sleep(1)
line = command.stdout.readline().strip()
continue
line = line.split()
device,nums = line[0], tuple(float(x) for x in line[1:])
for n,an in zip(nums, averages):
an.update(n)
yield zip((device,)+nums, (device,) + tuple(x.value for x in averages))
def print_data(command):
dat = get_data(command)
table_headers = ('',)+dat.next()
fmt_str = '\t'.join(['%8s', '%8s'] + ['% 7.2f'] * (len(table_headers)-2))
print(('% 9s' * (len(table_headers))) % tuple(table_headers), sep='')
for line in dat:
nums, avg = zip(*line)
print(fmt_str % (('real:',) + nums), sep='')
print(fmt_str % (('avg:',) + nums), sep='')
if __name__ == '__main__':
dat = start_iostat()
print_data(dat)
|