blob: 6da269bb69cc3542dec10ff8e15ff7970cc8a54e [file] [log] [blame]
Brendan Greggebdb2422015-08-18 16:53:41 -07001#!/usr/bin/python
Brendan Gregg48fbc3e2015-08-18 14:56:14 -07002#
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 Gregg762b1b42015-08-18 16:49:48 -070013from __future__ import print_function
Brenden Blancoc35989d2015-09-02 18:04:07 -070014from bcc import BPF
Brendan Gregg48fbc3e2015-08-18 14:56:14 -070015
16REQ_WRITE = 1 # from include/linux/blk_types.h
17
18# load BPF program
19b = BPF(src_file="disksnoop.c")
Brenden Blanco5eef65e2015-08-19 15:39:19 -070020b.attach_kprobe(event="blk_start_request", fn_name="do_request")
21b.attach_kprobe(event="blk_update_request", fn_name="do_completion")
Brendan Gregg48fbc3e2015-08-18 14:56:14 -070022
23# header
Brendan Gregg762b1b42015-08-18 16:49:48 -070024print("%-18s %-2s %-7s %8s" % ("TIME(s)", "T", "BYTES", "LAT(ms)"))
Brendan Gregg48fbc3e2015-08-18 14:56:14 -070025
Brendan Gregg48fbc3e2015-08-18 14:56:14 -070026# format output
27while 1:
Brendan Gregg39e13732015-08-26 20:16:29 +100028 (task, pid, cpu, flags, ts, msg) = b.trace_readline_fields()
29 (bytes_s, bflags_s, us_s) = msg.split()
Brendan Gregg48fbc3e2015-08-18 14:56:14 -070030
Brendan Gregg39e13732015-08-26 20:16:29 +100031 if int(bflags_s, 16) & REQ_WRITE:
Brendan Gregg48fbc3e2015-08-18 14:56:14 -070032 type_s = "W"
33 elif bytes_s == "0": # see blk_fill_rwbs() for logic
34 type_s = "M"
35 else:
36 type_s = "R"
37 ms = float(int(us_s, 10)) / 1000
38
Brendan Gregg39e13732015-08-26 20:16:29 +100039 print("%-18.9f %-2s %-7s %8.2f" % (ts, type_s, bytes_s, ms))