4 # Parse the sfsres log file generated by SPECsfs to generate more detailed
5 # latency statistics than in the sfssum summary file.
7 import re, subprocess, sys
9 def extract_re(lines, regexp):
10 if isinstance(regexp, str):
11 regexp = re.compile(regexp)
16 OPERATIONS = ('read', 'write', 'create', 'setattr', 'lookup', 'getattr')
18 def parse_date(datestr):
19 p = subprocess.Popen(['/bin/date', '-d', datestr, '+%s'],
20 stdout=subprocess.PIPE)
25 def parse_run(lines, timestamp, outfp=sys.stdout):
27 requested_load = extract_re(lines, r"\s*Requested Load.*= (\d+)")
28 load = int(requested_load.group(1))
29 results = extract_re(lines, r"SFS NFS THROUGHPUT:\s*([\d.]+).*RESPONSE TIME:\s*([\d.]+) Msec/Op")
30 timestamp = extract_re(lines, r"SFS Aggregate Results.*, (.*)")
31 if timestamp is not None:
33 timestamp = parse_date(timestamp.group(1))
37 # Extract the stable of per-operation counts, response times, etc.
38 regexp = re.compile(r"^(\w+)" + r"\s*([\d.]+)%?" * 9)
44 table[m.group(1)] = [float(m.group(i)) for i in range(2, 11)]
46 #sys.stderr.write("Error parsing line: " + l.strip() + "\n")
49 outfp.write("# finish_timestamp: " + str(timestamp) + "\n")
50 outfp.write("%d\t%s\t%s" % (load, results.group(1), results.group(2)))
53 try: val = table[o][5]
55 outfp.write("\t%s" % (val,))
59 sys.stdout.write("# target_ops actual_ops latency_avg")
61 sys.stdout.write(" " + o)
62 sys.stdout.write("\n")
66 m = re.match(r"^([^*]+) \*{32,}$", line)
69 parse_run(run_data, timestamp)
71 timestamp = m.group(1)
75 parse_run(run_data, timestamp)
77 if __name__ == '__main__':
78 parse_sfsres(sys.stdin)