| #!/usr/bin/python |
| # |
| # vfsreadlat.py VFS read latency distribution. |
| # For Linux, uses BCC, eBPF. See .c file. |
| # |
| # Written as a basic example of a function latency distribution histogram. |
| # |
| # USAGE: vfsreadlat.py [interval [count]] |
| # |
| # The default interval is 5 seconds. A Ctrl-C will print the partially |
| # gathered histogram then exit. |
| # |
| # Copyright (c) 2015 Brendan Gregg. |
| # Licensed under the Apache License, Version 2.0 (the "License") |
| # |
| # 15-Aug-2015 Brendan Gregg Created this. |
| |
| from bcc import BPF |
| from ctypes import c_ushort, c_int, c_ulonglong |
| from time import sleep |
| from sys import argv |
| |
| def usage(): |
| print("USAGE: %s [interval [count]]" % argv[0]) |
| exit() |
| |
| # arguments |
| interval = 5 |
| count = -1 |
| if len(argv) > 1: |
| try: |
| interval = int(argv[1]) |
| if interval == 0: |
| raise |
| if len(argv) > 2: |
| count = int(argv[2]) |
| except: # also catches -h, --help |
| usage() |
| |
| # load BPF program |
| b = BPF(src_file = "vfsreadlat.c") |
| b.attach_kprobe(event="vfs_read", fn_name="do_entry") |
| b.attach_kretprobe(event="vfs_read", fn_name="do_return") |
| |
| # header |
| print("Tracing... Hit Ctrl-C to end.") |
| |
| # output |
| loop = 0 |
| do_exit = 0 |
| while (1): |
| if count > 0: |
| loop += 1 |
| if loop > count: |
| exit() |
| try: |
| sleep(interval) |
| except KeyboardInterrupt: |
| pass; do_exit = 1 |
| |
| print |
| b["dist"].print_log2_hist("usecs") |
| b["dist"].clear() |
| if do_exit: |
| exit() |