xref: /spdk/scripts/histogram.py (revision 17538bdc67021ec097536c683124234db1aac374)
16aa358fbSPiotr Pelplinski#!/usr/bin/env python3
2*17538bdcSpaul luse#  SPDX-License-Identifier: BSD-3-Clause
3*17538bdcSpaul luse#  Copyright (C) 2019 Intel Corporation
4*17538bdcSpaul luse#  All rights reserved.
5*17538bdcSpaul luse#
66aa358fbSPiotr Pelplinski
76aa358fbSPiotr Pelplinskiimport sys
86aa358fbSPiotr Pelplinskiimport json
96aa358fbSPiotr Pelplinskiimport base64
106aa358fbSPiotr Pelplinskiimport struct
116aa358fbSPiotr Pelplinski
126aa358fbSPiotr Pelplinskibuf = sys.stdin.readlines()
136aa358fbSPiotr Pelplinskijson = json.loads(" ".join(buf))
146aa358fbSPiotr Pelplinskihistogram = base64.b64decode(json["histogram"])
156aa358fbSPiotr Pelplinskibucket_shift = json["bucket_shift"]
166aa358fbSPiotr Pelplinskitsc_rate = json["tsc_rate"]
176aa358fbSPiotr Pelplinski
186aa358fbSPiotr Pelplinskiprint("Latency histogram")
196aa358fbSPiotr Pelplinskiprint("==============================================================================")
206aa358fbSPiotr Pelplinskiprint("       Range in us     Cumulative    IO count")
216aa358fbSPiotr Pelplinski
226aa358fbSPiotr Pelplinskiso_far = 0
236aa358fbSPiotr Pelplinskibucket = 0
246aa358fbSPiotr Pelplinskitotal = 1
256aa358fbSPiotr Pelplinski
266aa358fbSPiotr Pelplinskifor i in range(0, 64 - bucket_shift):
276aa358fbSPiotr Pelplinski    for j in range(0, (1 << bucket_shift)):
286aa358fbSPiotr Pelplinski        index = (((i << bucket_shift) + j) * 8)
296aa358fbSPiotr Pelplinski        total += int.from_bytes(histogram[index:index + 8], 'little')
306aa358fbSPiotr Pelplinski
316aa358fbSPiotr Pelplinskifor i in range(0, 64 - bucket_shift):
326aa358fbSPiotr Pelplinski    for j in range(0, (1 << bucket_shift)):
336aa358fbSPiotr Pelplinski        index = (((i << bucket_shift) + j)*8)
346aa358fbSPiotr Pelplinski        count = int.from_bytes(histogram[index:index + 8], 'little')
356aa358fbSPiotr Pelplinski        so_far += count
366aa358fbSPiotr Pelplinski        last_bucket = bucket
376aa358fbSPiotr Pelplinski
386aa358fbSPiotr Pelplinski        if i > 0:
396aa358fbSPiotr Pelplinski            bucket = (1 << (i + bucket_shift - 1))
406aa358fbSPiotr Pelplinski            bucket += ((j+1) << (i - 1))
416aa358fbSPiotr Pelplinski        else:
426aa358fbSPiotr Pelplinski            bucket = j+1
436aa358fbSPiotr Pelplinski
446aa358fbSPiotr Pelplinski        start = last_bucket * 1000 * 1000 / tsc_rate
456aa358fbSPiotr Pelplinski        end = bucket * 1000 * 1000 / tsc_rate
466aa358fbSPiotr Pelplinski        so_far_pct = so_far * 100.0 / total
476aa358fbSPiotr Pelplinski        if count > 0:
486aa358fbSPiotr Pelplinski            print("%9.3f - %9.3f: %9.4f%%  (%9u)" % (start, end, so_far_pct, count))
49