git.fiddlerwoaroof.com
Browse code

initial, not complete

fiddlerwoaroof authored on 19/10/2014 01:13:59
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,55 @@
1
+from __future__ import division,print_function
2
+import subprocess
3
+import time
4
+
5
+def start_iostat():
6
+	command = subprocess.Popen(['/usr/bin/iostat', '-dmx', '1'], bufsize=1, stdout=subprocess.PIPE)
7
+	return command
8
+
9
+class Averager(object):
10
+	def __init__(self):
11
+		self.values = []
12
+		self.average = 0
13
+		self.len = 0
14
+	def update(self, value):
15
+		self.values.append(value)
16
+		self.len += 1
17
+		value /= self.len
18
+		self.average = (self.average / self.len) * (self.len-1) + value
19
+		return self
20
+	@property
21
+	def value(self):
22
+		return self.values[-1]
23
+
24
+def get_data(command):
25
+	command.stdout.readline() # skip header
26
+	command.stdout.readline() # skip blank line
27
+	table_headers = tuple(command.stdout.readline().split())
28
+	yield table_headers
29
+	averages = [Averager() for __ in range(len(table_headers)-1)]
30
+	while True:
31
+		line = command.stdout.readline().strip()
32
+		if line == '':
33
+			time.sleep(1)
34
+			line = command.stdout.readline().strip()
35
+			continue
36
+		line = line.split()
37
+
38
+		device,nums = line[0], tuple(float(x) for x in line[1:])
39
+		for n,an in zip(nums, averages):
40
+			an.update(n)
41
+		yield zip((device,)+nums, (device,) + tuple(x.value for x in averages))
42
+
43
+def print_data(command):
44
+	dat = get_data(command)
45
+	table_headers = ('',)+dat.next()
46
+	fmt_str = '\t'.join(['%8s', '%8s'] + ['% 7.2f'] * (len(table_headers)-2))
47
+	print(('% 9s' * (len(table_headers))) % tuple(table_headers), sep='')
48
+	for line in dat:
49
+		nums, avg = zip(*line)
50
+		print(fmt_str % (('real:',) + nums), sep='')
51
+		print(fmt_str % (('avg:',) + nums), sep='')
52
+
53
+if __name__ == '__main__':
54
+	dat = start_iostat()
55
+	print_data(dat)