iperf.py 1.62 KB
Newer Older
Hejing Li's avatar
Hejing Li committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import glob
import json
import os
import fnmatch
import re
import itertools
import sys

def parse_iperf_run(data, skip=1, use=8):
    tp_pat = re.compile(r'\[ *\d*\] *([0-9\.]*)- *([0-9\.]*) sec.*Bytes *([0-9\.]*) ([GM])bits.*')
    tps_time = {}
    for hn in fnmatch.filter(data['sims'].keys(), 'host.client.*'):
        sim = data['sims'][hn]
        for l in sim['stdout']:
            m = tp_pat.match(l)
            if not m:
                continue

            time = int(float(m.group(1)))
            if time < skip:
                continue
            if time >= skip + use:
                continue

            if not time in tps_time:
                tps_time[time] = []

            if m.group(4) == 'G':
                tps_time[time].append(float(m.group(3)))
            elif m.group(4) == 'M':
                m_tps = float(m.group(3))/1000
                tps_time[time].append(m_tps)

    tps = []
    for t in sorted(tps_time.keys()):
        x = sum(tps_time[t])
        tps.append(x)


    if len(tps) == 0:
        return None
    return sum(tps) / len(tps)

def parse_iperf(basename, skip=1, use=8):
    runs = []
    for path in glob.glob(basename + '-*.json'):
        if path == basename + '-0.json':
            # skip checkpoints
            continue

        with open(path, 'r') as f:
            data = json.load(f)
        result = parse_iperf_run(data, skip, use)
        if result is not None:
            runs.append(result)

    if not runs:
        return {'avg': None, 'min': None, 'max': None}
    else:
        return {'avg': sum(runs) / len(runs), 'min': min(runs),
                'max': max(runs)}
    result = {}