vfsstat 1.79 KB
Newer Older
Brendan Gregg's avatar
Brendan Gregg committed
1
#!/usr/bin/python
Brendan Gregg's avatar
Brendan Gregg committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#
# vfsstat	Count some VFS calls.
#		For Linux, uses BCC, eBPF. See .c file.
#
# Written as a basic example of counting multiple events as a stat tool.
#
# USAGE: vfsstat [interval [count]]
#
# Copyright (c) 2015 Brendan Gregg.
# Licensed under the Apache License, Version 2.0 (the "License")
#
# 14-Aug-2015	Brendan Gregg	Created this.

from __future__ import print_function
from bpf import BPF
from ctypes import c_ushort, c_int, c_ulonglong
from time import sleep, strftime
from sys import argv

def usage():
	print("USAGE: %s [interval [count]]" % argv[0])
	exit()

# arguments
interval = 1
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 = "vfsstat.c")
40 41 42 43 44
b.attach_kprobe(event="vfs_read", fn_name="do_read")
b.attach_kprobe(event="vfs_write", fn_name="do_write")
b.attach_kprobe(event="vfs_fsync", fn_name="do_fsync")
b.attach_kprobe(event="vfs_open", fn_name="do_open")
b.attach_kprobe(event="vfs_create", fn_name="do_create")
Brendan Gregg's avatar
Brendan Gregg committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

# stat column labels and indexes
stat_types = {
	"READ" : 1,
	"WRITE" : 2,
	"FSYNC" : 3,
	"OPEN" : 4,
	"CREATE" : 5
}

# header
print("%-8s  " % "TIME", end="")
for stype in stat_types.keys():
	print(" %8s" % (stype + "/s"), end="")
	idx = stat_types[stype]
print("")

# output
i = 0
while (1):
	if count > 0:
		i += 1
		if i > count:
			exit()
	try:
		sleep(interval)
	except KeyboardInterrupt:
		pass; exit()

	print("%-8s: " % strftime("%H:%M:%S"), end="")
	# print each statistic as a column
	for stype in stat_types.keys():
		idx = stat_types[stype]
		try:
79 80
			val = b["stats"][c_int(idx)].value / interval
			print(" %8d" % val, end="")
Brendan Gregg's avatar
Brendan Gregg committed
81 82
		except:
			print(" %8d" % 0, end="")
83
	b["stats"].clear()
Brendan Gregg's avatar
Brendan Gregg committed
84
	print("")