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