Brendan Gregg | ebdb242 | 2015-08-18 16:53:41 -0700 | [diff] [blame] | 1 | #!/usr/bin/python |
Brendan Gregg | 48fbc3e | 2015-08-18 14:56:14 -0700 | [diff] [blame] | 2 | # |
| 3 | # disksnoop.py Trace block device I/O: basic version of iosnoop. |
| 4 | # For Linux, uses BCC, eBPF. See .c file. |
| 5 | # |
| 6 | # Written as a basic example of tracing latency. |
| 7 | # |
| 8 | # Copyright (c) 2015 Brendan Gregg. |
| 9 | # Licensed under the Apache License, Version 2.0 (the "License") |
| 10 | # |
| 11 | # 11-Aug-2015 Brendan Gregg Created this. |
| 12 | |
Brendan Gregg | 762b1b4 | 2015-08-18 16:49:48 -0700 | [diff] [blame] | 13 | from __future__ import print_function |
Brenden Blanco | c35989d | 2015-09-02 18:04:07 -0700 | [diff] [blame] | 14 | from bcc import BPF |
Brendan Gregg | 48fbc3e | 2015-08-18 14:56:14 -0700 | [diff] [blame] | 15 | |
| 16 | REQ_WRITE = 1 # from include/linux/blk_types.h |
| 17 | |
| 18 | # load BPF program |
| 19 | b = BPF(src_file="disksnoop.c") |
Brendan Gregg | 6ed4a49 | 2015-09-16 15:12:55 -0700 | [diff] [blame] | 20 | b.attach_kprobe(event="blk_start_request", fn_name="trace_start") |
| 21 | b.attach_kprobe(event="blk_mq_start_request", fn_name="trace_start") |
| 22 | b.attach_kprobe(event="blk_account_io_completion", fn_name="trace_completion") |
Brendan Gregg | 48fbc3e | 2015-08-18 14:56:14 -0700 | [diff] [blame] | 23 | |
| 24 | # header |
Brendan Gregg | 762b1b4 | 2015-08-18 16:49:48 -0700 | [diff] [blame] | 25 | print("%-18s %-2s %-7s %8s" % ("TIME(s)", "T", "BYTES", "LAT(ms)")) |
Brendan Gregg | 48fbc3e | 2015-08-18 14:56:14 -0700 | [diff] [blame] | 26 | |
Brendan Gregg | 48fbc3e | 2015-08-18 14:56:14 -0700 | [diff] [blame] | 27 | # format output |
| 28 | while 1: |
Brenden Blanco | 819334e | 2015-09-04 21:20:59 -0700 | [diff] [blame] | 29 | (task, pid, cpu, flags, ts, msg) = b.trace_fields() |
Brendan Gregg | 39e1373 | 2015-08-26 20:16:29 +1000 | [diff] [blame] | 30 | (bytes_s, bflags_s, us_s) = msg.split() |
Brendan Gregg | 48fbc3e | 2015-08-18 14:56:14 -0700 | [diff] [blame] | 31 | |
Brendan Gregg | 39e1373 | 2015-08-26 20:16:29 +1000 | [diff] [blame] | 32 | if int(bflags_s, 16) & REQ_WRITE: |
Brendan Gregg | 48fbc3e | 2015-08-18 14:56:14 -0700 | [diff] [blame] | 33 | type_s = "W" |
| 34 | elif bytes_s == "0": # see blk_fill_rwbs() for logic |
| 35 | type_s = "M" |
| 36 | else: |
| 37 | type_s = "R" |
| 38 | ms = float(int(us_s, 10)) / 1000 |
| 39 | |
Brendan Gregg | 39e1373 | 2015-08-26 20:16:29 +1000 | [diff] [blame] | 40 | print("%-18.9f %-2s %-7s %8.2f" % (ts, type_s, bytes_s, ms)) |