]>
git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/scripts/io-trace-parse.py
3 # Script to parse IO trace logs and show some stats
10 # prints average, .99 quantile and maximum value for an array
11 def print_stat_line(what
, st
):
13 return statistics
.quantiles(arr
, n
=100)[-1]
15 print("\t{:18}: avg:{:12.6f} .99:{:12.6f} max:{:12.6f}".format(what
,
16 statistics
.fmean(st
), q99(st
), max(st
)))
19 # Inc/Dec counter that also collects its value history
27 self
._stat
.append(self
._v
)
31 self
._stat
.append(self
._v
)
38 def __init__(self
, rqlen
):
45 # Timings for requests
48 self
.qtimes
= [] # time in queue
49 self
.xtimes
= [] # time in disk
50 self
.latencies
= [] # sum of the above
51 self
.delays
= [] # time between submits
52 self
.prev
= None # helper for the above
53 self
.in_queue
= counter()
54 self
.in_disk
= counter()
61 self
.delays
.append(rq
.submit
- self
.prev
)
63 self
.qtimes
.append(rq
.submit
- rq
.queue
)
67 def complete(self
, rq
):
68 self
.xtimes
.append(rq
.complete
- rq
.submit
)
69 self
.latencies
.append(rq
.complete
- rq
.queue
)
72 def show(self
, rqlen
):
73 print("{}k requests".format(int(rqlen
/1024)))
74 print("\ttotal: {}".format(len(self
.latencies
)))
75 print_stat_line('in queue usec', self
.qtimes
)
76 print_stat_line(' `- num ', self
.in_queue
.stat())
77 print_stat_line('in disk usec', self
.xtimes
)
78 print_stat_line(' `- num ', self
.in_disk
.stat())
79 print_stat_line('latency', self
.latencies
)
80 print_stat_line('period', self
.delays
)
83 # Stats for a device. Umbrella-object for the above stats
86 self
.reqs
= {} # collection of req's
87 self
.req_stats
= {} # statistics by request size
88 self
.in_queue
= counter()
89 self
.in_disk
= counter()
91 def queue(self
, rqid
, ts
, rqlen
):
95 if rq
.len not in self
.req_stats
:
96 self
.req_stats
[rq
.len] = req_stat()
97 st
= self
.req_stats
[rq
.len]
101 def submit(self
, rqid
, ts
):
104 st
= self
.req_stats
[rq
.len]
109 def complete(self
, rqid
, ts
):
112 st
= self
.req_stats
[rq
.len]
117 def _show_req_stats(self
):
118 for rlen
in self
.req_stats
:
119 st
= self
.req_stats
[rlen
]
122 def _show_queue_stats(self
):
124 print_stat_line('in queue num:', self
.in_queue
.stat())
125 print_stat_line('in disk num:', self
.in_disk
.stat())
127 def show(self
, devid
):
128 print("{}".format(devid
).center(80, "-"))
129 self
._show
_req
_stats
()
130 self
._show
_queue
_stats
()
134 def __init__(self
, f
):
138 def _get_dev_stats(self
, devid
):
139 if devid
not in self
._dev
_stats
:
140 self
._dev
_stats
[devid
] = device_stat()
142 return self
._dev
_stats
[devid
]
144 def _parse_req_event(self
, ln
):
147 st
= self
._get
_dev
_stats
(int(ln
[7]))
149 if ln
[11] == 'queue':
150 st
.queue(req_id
, ts
, int(ln
[13]))
151 elif ln
[11] == 'submit':
152 st
.submit(req_id
, ts
)
153 elif ln
[11] == 'complete':
154 st
.complete(req_id
, ts
)
156 def _parse_line(self
, ln
):
159 self
._parse
_req
_event
(ln
)
162 for ln
in self
._file
:
163 if ln
.startswith('TRACE'):
164 self
._parse
_line
(ln
.strip().split())
166 return self
._dev
_stats
169 if __name__
== "__main__":
170 p
= parser(sys
.stdin
)
173 stats
[devid
].show(devid
)