1#!/usr/bin/python 2# 3# bitehist.py Block I/O size histogram. 4# For Linux, uses BCC, eBPF. Embedded C. 5# 6# Written as a basic example of using histograms to show a distribution. 7# 8# A Ctrl-C will print the gathered histogram then exit. 9# 10# Copyright (c) 2015 Brendan Gregg. 11# Licensed under the Apache License, Version 2.0 (the "License") 12# 13# 15-Aug-2015 Brendan Gregg Created this. 14# 03-Feb-2019 Xiaozhou Liu added linear histogram. 15 16from __future__ import print_function 17from bcc import BPF 18from time import sleep 19 20# load BPF program 21b = BPF(text=""" 22#include <uapi/linux/ptrace.h> 23#include <linux/blk-mq.h> 24 25BPF_HISTOGRAM(dist); 26BPF_HISTOGRAM(dist_linear); 27 28int trace_req_done(struct pt_regs *ctx, struct request *req) 29{ 30 dist.increment(bpf_log2l(req->__data_len / 1024)); 31 dist_linear.increment(req->__data_len / 1024); 32 return 0; 33} 34""") 35 36if BPF.get_kprobe_functions(b'__blk_account_io_done'): 37 b.attach_kprobe(event="__blk_account_io_done", fn_name="trace_req_done") 38else: 39 b.attach_kprobe(event="blk_account_io_done", fn_name="trace_req_done") 40 41# header 42print("Tracing... Hit Ctrl-C to end.") 43 44# trace until Ctrl-C 45try: 46 sleep(99999999) 47except KeyboardInterrupt: 48 print() 49 50# output 51print("log2 histogram") 52print("~~~~~~~~~~~~~~") 53b["dist"].print_log2_hist("kbytes") 54 55print("\nlinear histogram") 56print("~~~~~~~~~~~~~~~~") 57b["dist_linear"].print_linear_hist("kbytes") 58