git.fiddlerwoaroof.com
Raw Blame History
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)