Add proper per-file copyright notices/licenses and top-level license.
[bluesky.git] / nfs3 / parse-synread.py
1 #!/usr/bin/python
2 #
3 # Copyright (C) 2011  The Regents of the University of California
4 # Written by Michael Vrable <mvrable@cs.ucsd.edu>
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 #    notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 #    notice, this list of conditions and the following disclaimer in the
13 #    documentation and/or other materials provided with the distribution.
14 # 3. Neither the name of the University nor the names of its contributors
15 #    may be used to endorse or promote products derived from this software
16 #    without specific prior written permission.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 # SUCH DAMAGE.
29
30 import struct, sys
31
32 DATAPOINT = '<II'
33
34 def load_log(f):
35     data = []
36     size = struct.calcsize(DATAPOINT)
37     d = f.read(size)
38     while len(d) == size:
39         i = struct.unpack(DATAPOINT, d)
40         data.append(i)
41         d = f.read(size)
42     return data
43
44 if __name__ == '__main__':
45     blocksize = int(sys.argv[1])
46     data = []
47     for f in sys.argv[2:]:
48         data += load_log(open(f))
49     data.sort()
50
51     duration = data[-1][0] - data[0][0]
52     #print "Time span: %d to %d (%d seconds)" % (data[0][0], data[-1][0], duration)
53
54     start = data[0][0] + 5
55     end = data[-1][0] - 5
56     truncated = [d for d in data if start <= d[0] <= end]
57     #print len(data), len(truncated)
58     duration = float(end - start + 1)
59     #print duration
60     #print "# ops/sec\tbandwidth (MB/s)\tLatency(ms)"
61     print "%s\t%s\t%s" % (len(truncated) / duration,
62                           len(truncated) / duration * blocksize / 1024.0**2,
63                           sum(d[1] for d in truncated) / len(truncated) / 1000)