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