Browse code
initial, not complete
fiddlerwoaroof authored on 19/10/2014 01:13:59
Showing 1 changed files
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) |