1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/python 2*387f9dfdSAndroid Build Coastguard Worker# 3*387f9dfdSAndroid Build Coastguard Worker# vfsreadlat.py VFS read latency distribution. 4*387f9dfdSAndroid Build Coastguard Worker# For Linux, uses BCC, eBPF. See .c file. 5*387f9dfdSAndroid Build Coastguard Worker# 6*387f9dfdSAndroid Build Coastguard Worker# Written as a basic example of a function latency distribution histogram. 7*387f9dfdSAndroid Build Coastguard Worker# 8*387f9dfdSAndroid Build Coastguard Worker# USAGE: vfsreadlat.py [interval [count]] 9*387f9dfdSAndroid Build Coastguard Worker# 10*387f9dfdSAndroid Build Coastguard Worker# The default interval is 5 seconds. A Ctrl-C will print the partially 11*387f9dfdSAndroid Build Coastguard Worker# gathered histogram then exit. 12*387f9dfdSAndroid Build Coastguard Worker# 13*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) 2015 Brendan Gregg. 14*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License") 15*387f9dfdSAndroid Build Coastguard Worker# 16*387f9dfdSAndroid Build Coastguard Worker# 15-Aug-2015 Brendan Gregg Created this. 17*387f9dfdSAndroid Build Coastguard Worker 18*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function 19*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF 20*387f9dfdSAndroid Build Coastguard Workerfrom time import sleep 21*387f9dfdSAndroid Build Coastguard Workerfrom sys import argv 22*387f9dfdSAndroid Build Coastguard Worker 23*387f9dfdSAndroid Build Coastguard Workerdef usage(): 24*387f9dfdSAndroid Build Coastguard Worker print("USAGE: %s [interval [count]]" % argv[0]) 25*387f9dfdSAndroid Build Coastguard Worker exit() 26*387f9dfdSAndroid Build Coastguard Worker 27*387f9dfdSAndroid Build Coastguard Worker# arguments 28*387f9dfdSAndroid Build Coastguard Workerinterval = 5 29*387f9dfdSAndroid Build Coastguard Workercount = -1 30*387f9dfdSAndroid Build Coastguard Workerif len(argv) > 1: 31*387f9dfdSAndroid Build Coastguard Worker try: 32*387f9dfdSAndroid Build Coastguard Worker interval = int(argv[1]) 33*387f9dfdSAndroid Build Coastguard Worker if interval == 0: 34*387f9dfdSAndroid Build Coastguard Worker raise 35*387f9dfdSAndroid Build Coastguard Worker if len(argv) > 2: 36*387f9dfdSAndroid Build Coastguard Worker count = int(argv[2]) 37*387f9dfdSAndroid Build Coastguard Worker except: # also catches -h, --help 38*387f9dfdSAndroid Build Coastguard Worker usage() 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard Worker# load BPF program 41*387f9dfdSAndroid Build Coastguard Workerb = BPF(src_file = "vfsreadlat.c") 42*387f9dfdSAndroid Build Coastguard Workerb.attach_kprobe(event="vfs_read", fn_name="do_entry") 43*387f9dfdSAndroid Build Coastguard Workerb.attach_kretprobe(event="vfs_read", fn_name="do_return") 44*387f9dfdSAndroid Build Coastguard Worker 45*387f9dfdSAndroid Build Coastguard Worker# header 46*387f9dfdSAndroid Build Coastguard Workerprint("Tracing... Hit Ctrl-C to end.") 47*387f9dfdSAndroid Build Coastguard Worker 48*387f9dfdSAndroid Build Coastguard Worker# output 49*387f9dfdSAndroid Build Coastguard Workerloop = 0 50*387f9dfdSAndroid Build Coastguard Workerdo_exit = 0 51*387f9dfdSAndroid Build Coastguard Workerwhile (1): 52*387f9dfdSAndroid Build Coastguard Worker if count > 0: 53*387f9dfdSAndroid Build Coastguard Worker loop += 1 54*387f9dfdSAndroid Build Coastguard Worker if loop > count: 55*387f9dfdSAndroid Build Coastguard Worker exit() 56*387f9dfdSAndroid Build Coastguard Worker try: 57*387f9dfdSAndroid Build Coastguard Worker sleep(interval) 58*387f9dfdSAndroid Build Coastguard Worker except KeyboardInterrupt: 59*387f9dfdSAndroid Build Coastguard Worker pass; do_exit = 1 60*387f9dfdSAndroid Build Coastguard Worker 61*387f9dfdSAndroid Build Coastguard Worker print() 62*387f9dfdSAndroid Build Coastguard Worker b["dist"].print_log2_hist("usecs") 63*387f9dfdSAndroid Build Coastguard Worker b["dist"].clear() 64*387f9dfdSAndroid Build Coastguard Worker if do_exit: 65*387f9dfdSAndroid Build Coastguard Worker exit() 66