blob: f7b1806c718e6b9b23c70d97a6718d27e54095f4 [file] [log] [blame]
Brendan Gregg177e07e2015-08-18 16:11:35 -07001#!/usr/bin/env 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
Brendan Gregg48fbc3e2015-08-18 14:56:14 -070014from bpf import BPF
15import sys
16
17REQ_WRITE = 1 # from include/linux/blk_types.h
18
19# load BPF program
20b = BPF(src_file="disksnoop.c")
21BPF.attach_kprobe(b.load_func("do_request", BPF.KPROBE), "blk_start_request")
22BPF.attach_kprobe(b.load_func("do_completion", BPF.KPROBE), "blk_update_request")
23
24# header
Brendan Gregg762b1b42015-08-18 16:49:48 -070025print("%-18s %-2s %-7s %8s" % ("TIME(s)", "T", "BYTES", "LAT(ms)"))
Brendan Gregg48fbc3e2015-08-18 14:56:14 -070026
27# open trace pipe
28try:
29 trace = open("/sys/kernel/debug/tracing/trace_pipe", "r")
30except:
Brendan Gregg762b1b42015-08-18 16:49:48 -070031 print("ERROR: opening trace_pipe", file=sys.stderr)
Brendan Gregg48fbc3e2015-08-18 14:56:14 -070032 exit(1)
33
34# format output
35while 1:
36 try:
37 line = trace.readline().rstrip()
38 except KeyboardInterrupt:
39 pass; exit()
40 prolog, time_s, colon, bytes_s, flags_s, us_s = \
41 line.rsplit(" ", 5)
42
43 time_s = time_s[:-1] # strip trailing ":"
44 flags = int(flags_s, 16)
45 if flags & REQ_WRITE:
46 type_s = "W"
47 elif bytes_s == "0": # see blk_fill_rwbs() for logic
48 type_s = "M"
49 else:
50 type_s = "R"
51 ms = float(int(us_s, 10)) / 1000
52
Brendan Gregg762b1b42015-08-18 16:49:48 -070053 print("%-18s %-2s %-7s %8.2f" % (time_s, type_s, bytes_s, ms))