1 Star 1 Fork 0

RobotCT/bcc

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
.github
SPECS
cmake
debian
docker
docs
examples
images
introspection
libbpf-tools
man
scripts
snap
src
tests
tools
lib
old
CMakeLists.txt
argdist.py
argdist_example.txt
bashreadline.py
bashreadline_example.txt
bindsnoop.py
bindsnoop_example.txt
biolatency.py
biolatency_example.txt
biolatpcts.py
biolatpcts_example.txt
biopattern.py
biopattern_example.txt
biosnoop.lua
biosnoop.py
biosnoop_example.txt
biotop.py
biotop_example.txt
bitesize.py
bitesize_example.txt
bpflist.py
bpflist_example.txt
btrfsdist.py
btrfsdist_example.txt
btrfsslower.py
btrfsslower_example.txt
cachestat.py
cachestat_example.txt
cachetop.py
cachetop_example.txt
capable.py
capable_example.txt
cobjnew.sh
cobjnew_example.txt
compactsnoop.py
compactsnoop_example.txt
cpudist.py
cpudist_example.txt
cpuunclaimed.py
cpuunclaimed_example.txt
criticalstat.py
criticalstat_example.txt
cthreads_example.txt
dbslower.py
dbslower_example.txt
dbstat.py
dbstat_example.txt
dcsnoop.py
dcsnoop_example.txt
dcstat.py
dcstat_example.txt
deadlock.c
deadlock.py
deadlock_example.txt
dirtop.py
dirtop_example.txt
drsnoop.py
drsnoop_example.txt
execsnoop.py
execsnoop_example.txt
exitsnoop.py
exitsnoop_example.txt
ext4dist.py
ext4dist_example.txt
ext4slower.py
ext4slower_example.txt
filegone.py
filegone_example.txt
filelife.py
filelife_example.txt
fileslower.py
fileslower_example.txt
filetop.py
filetop_example.txt
funccount.py
funccount_example.txt
funcinterval.py
funcinterval_example.txt
funclatency.py
funclatency_example.txt
funcslower.py
funcslower_example.txt
gethostlatency.py
gethostlatency_example.txt
hardirqs.py
hardirqs_example.txt
inject.py
inject_example.txt
javacalls.sh
javacalls_example.txt
javaflow.sh
javaflow_example.txt
javagc.sh
javagc_example.txt
javaobjnew.sh
javaobjnew_example.txt
javastat.sh
javastat_example.txt
javathreads.sh
javathreads_example.txt
killsnoop.py
killsnoop_example.txt
klockstat.py
klockstat_example.txt
kvmexit.py
kvmexit_example.txt
llcstat.py
llcstat_example.txt
mdflush.py
mdflush_example.txt
memleak.py
memleak_example.txt
mountsnoop.py
mountsnoop_example.txt
mysqld_qslower.py
mysqld_qslower_example.txt
netqtop.c
netqtop.py
netqtop_example.txt
nfsdist.py
nfsdist_example.txt
nfsslower.py
nfsslower_example.txt
nodegc.sh
nodegc_example.txt
nodestat.sh
nodestat_example.txt
offcputime.py
offcputime_example.txt
offwaketime.py
offwaketime_example.txt
oomkill.py
oomkill_example.txt
opensnoop.py
opensnoop_example.txt
perlcalls.sh
perlcalls_example.txt
perlflow.sh
perlflow_example.txt
perlstat.sh
perlstat_example.txt
phpcalls.sh
phpcalls_example.txt
phpflow.sh
phpflow_example.txt
phpstat.sh
phpstat_example.txt
pidpersec.py
pidpersec_example.txt
ppchcalls.py
ppchcalls_example.txt
profile.py
profile_example.txt
pythoncalls.sh
pythoncalls_example.txt
pythonflow.sh
pythonflow_example.txt
pythongc.sh
pythongc_example.txt
pythonstat.sh
pythonstat_example.txt
rdmaucma.py
rdmaucma_example.txt
readahead.py
readahead_example.txt
reset-trace.sh
reset-trace_example.txt
rubycalls.sh
rubycalls_example.txt
rubyflow.sh
rubyflow_example.txt
rubygc.sh
rubygc_example.txt
rubyobjnew.sh
rubyobjnew_example.txt
rubystat.sh
rubystat_example.txt
runqlat.py
runqlat_example.txt
runqlen.py
runqlen_example.txt
runqslower.py
runqslower_example.txt
shmsnoop.py
shmsnoop_example.txt
slabratetop.py
slabratetop_example.txt
sofdsnoop.py
sofdsnoop_example.txt
softirqs.py
softirqs_example.txt
solisten.py
solisten_example.txt
sslsniff.py
sslsniff_example.txt
stackcount.py
stackcount_example.txt
stacksnoop.lua
statsnoop.py
statsnoop_example.txt
swapin.py
swapin_example.txt
syncsnoop.py
syncsnoop_example.txt
syscount.py
syscount_example.txt
tclcalls.sh
tclcalls_example.txt
tclflow.sh
tclflow_example.txt
tclobjnew.sh
tclobjnew_example.txt
tclstat.sh
tclstat_example.txt
tcpaccept.py
tcpaccept_example.txt
tcpcong.py
tcpcong_example.txt
tcpconnect.py
tcpconnect_example.txt
tcpconnlat.py
tcpconnlat_example.txt
tcpdrop.py
tcpdrop_example.txt
tcplife.lua
tcplife.py
tcplife_example.txt
tcpretrans.py
tcpretrans_example.txt
tcprtt.py
tcprtt_example.txt
tcpstates.py
tcpstates_example.txt
tcpsubnet.py
tcpsubnet_example.txt
tcpsynbl.py
tcpsynbl_example.txt
tcptop.py
tcptop_example.txt
tcptracer.py
tcptracer_example.txt
threadsnoop.py
threadsnoop_example.txt
tplist.py
tplist_example.txt
trace.py
trace_example.txt
ttysnoop.py
ttysnoop_example.txt
vfscount.py
vfscount_example.txt
vfsstat.py
vfsstat_example.txt
virtiostat.py
virtiostat_example.txt
wakeuptime.py
wakeuptime_example.txt
xfsdist.py
xfsdist_example.txt
xfsslower.py
xfsslower_example.txt
zfsdist.py
zfsdist_example.txt
zfsslower.py
zfsslower_example.txt
.clang-format
.dockerignore
.gitignore
.gitmodules
.travis.yml
CMakeLists.txt
CODEOWNERS
CONTRIBUTING-SCRIPTS.md
FAQ.txt
INSTALL.md
LICENSE.txt
LINKS.md
QUICKSTART.md
README.md
克隆/下载
xfsslower.py 7.78 KB
一键复制 编辑 原始数据 按行查看 历史
#!/usr/bin/env python
# @lint-avoid-python-3-compatibility-imports
#
# xfsslower Trace slow XFS operations.
# For Linux, uses BCC, eBPF.
#
# USAGE: xfsslower [-h] [-j] [-p PID] [min_ms]
#
# This script traces common XFS file operations: reads, writes, opens, and
# syncs. It measures the time spent in these operations, and prints details
# for each that exceeded a threshold.
#
# WARNING: This adds low-overhead instrumentation to these XFS operations,
# including reads and writes from the file system cache. Such reads and writes
# can be very frequent (depending on the workload; eg, 1M/sec), at which
# point the overhead of this tool (even if it prints no "slower" events) can
# begin to become significant.
#
# By default, a minimum millisecond threshold of 10 is used.
#
# Copyright 2016 Netflix, Inc.
# Licensed under the Apache License, Version 2.0 (the "License")
#
# 11-Feb-2016 Brendan Gregg Created this.
# 16-Oct-2016 Dina Goldshtein -p to filter by process ID.
from __future__ import print_function
from bcc import BPF
import argparse
from time import strftime
# arguments
examples = """examples:
./xfsslower # trace operations slower than 10 ms (default)
./xfsslower 1 # trace operations slower than 1 ms
./xfsslower -j 1 # ... 1 ms, parsable output (csv)
./xfsslower 0 # trace all operations (warning: verbose)
./xfsslower -p 185 # trace PID 185 only
"""
parser = argparse.ArgumentParser(
description="Trace common XFS file operations slower than a threshold",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=examples)
parser.add_argument("-j", "--csv", action="store_true",
help="just print fields: comma-separated values")
parser.add_argument("-p", "--pid",
help="trace this PID only")
parser.add_argument("min_ms", nargs="?", default='10',
help="minimum I/O duration to trace, in ms (default 10)")
parser.add_argument("--ebpf", action="store_true",
help=argparse.SUPPRESS)
args = parser.parse_args()
min_ms = int(args.min_ms)
pid = args.pid
csv = args.csv
debug = 0
# define BPF program
bpf_text = """
#include <uapi/linux/ptrace.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/dcache.h>
// XXX: switch these to char's when supported
#define TRACE_READ 0
#define TRACE_WRITE 1
#define TRACE_OPEN 2
#define TRACE_FSYNC 3
struct val_t {
u64 ts;
u64 offset;
struct file *fp;
};
struct data_t {
// XXX: switch some to u32's when supported
u64 ts_us;
u64 type;
u64 size;
u64 offset;
u64 delta_us;
u32 pid;
char task[TASK_COMM_LEN];
char file[DNAME_INLINE_LEN];
};
BPF_HASH(entryinfo, u64, struct val_t);
BPF_PERF_OUTPUT(events);
//
// Store timestamp and size on entry
//
// xfs_file_read_iter(), xfs_file_write_iter():
int trace_rw_entry(struct pt_regs *ctx, struct kiocb *iocb)
{
u64 id = bpf_get_current_pid_tgid();
u32 pid = id >> 32; // PID is higher part
if (FILTER_PID)
return 0;
// store filep and timestamp by id
struct val_t val = {};
val.ts = bpf_ktime_get_ns();
val.fp = iocb->ki_filp;
val.offset = iocb->ki_pos;
if (val.fp)
entryinfo.update(&id, &val);
return 0;
}
// xfs_file_open():
int trace_open_entry(struct pt_regs *ctx, struct inode *inode,
struct file *file)
{
u64 id = bpf_get_current_pid_tgid();
u32 pid = id >> 32; // PID is higher part
if (FILTER_PID)
return 0;
// store filep and timestamp by id
struct val_t val = {};
val.ts = bpf_ktime_get_ns();
val.fp = file;
val.offset = 0;
if (val.fp)
entryinfo.update(&id, &val);
return 0;
}
// xfs_file_fsync():
int trace_fsync_entry(struct pt_regs *ctx, struct file *file)
{
u64 id = bpf_get_current_pid_tgid();
u32 pid = id >> 32; // PID is higher part
if (FILTER_PID)
return 0;
// store filep and timestamp by id
struct val_t val = {};
val.ts = bpf_ktime_get_ns();
val.fp = file;
val.offset = 0;
if (val.fp)
entryinfo.update(&id, &val);
return 0;
}
//
// Output
//
static int trace_return(struct pt_regs *ctx, int type)
{
struct val_t *valp;
u64 id = bpf_get_current_pid_tgid();
u32 pid = id >> 32; // PID is higher part
valp = entryinfo.lookup(&id);
if (valp == 0) {
// missed tracing issue or filtered
return 0;
}
// calculate delta
u64 ts = bpf_ktime_get_ns();
u64 delta_us = ts - valp->ts;
entryinfo.delete(&id);
// Skip entries with backwards time: temp workaround for #728
if ((s64) delta_us < 0)
return 0;
delta_us /= 1000;
if (FILTER_US)
return 0;
// populate output struct
u32 size = PT_REGS_RC(ctx);
struct data_t data = {};
data.type = type;
data.size = size;
data.delta_us = delta_us;
data.pid = pid;
data.ts_us = ts / 1000;
data.offset = valp->offset;
bpf_get_current_comm(&data.task, sizeof(data.task));
// workaround (rewriter should handle file to d_name in one step):
struct qstr qs = valp->fp->f_path.dentry->d_name;
if (qs.len == 0)
return 0;
bpf_probe_read_kernel(&data.file, sizeof(data.file), (void *)qs.name);
// output
events.perf_submit(ctx, &data, sizeof(data));
return 0;
}
int trace_read_return(struct pt_regs *ctx)
{
return trace_return(ctx, TRACE_READ);
}
int trace_write_return(struct pt_regs *ctx)
{
return trace_return(ctx, TRACE_WRITE);
}
int trace_open_return(struct pt_regs *ctx)
{
return trace_return(ctx, TRACE_OPEN);
}
int trace_fsync_return(struct pt_regs *ctx)
{
return trace_return(ctx, TRACE_FSYNC);
}
"""
if min_ms == 0:
bpf_text = bpf_text.replace('FILTER_US', '0')
else:
bpf_text = bpf_text.replace('FILTER_US',
'delta_us <= %s' % str(min_ms * 1000))
if args.pid:
bpf_text = bpf_text.replace('FILTER_PID', 'pid != %s' % pid)
else:
bpf_text = bpf_text.replace('FILTER_PID', '0')
if debug or args.ebpf:
print(bpf_text)
if args.ebpf:
exit()
# process event
def print_event(cpu, data, size):
event = b["events"].event(data)
type = 'R'
if event.type == 1:
type = 'W'
elif event.type == 2:
type = 'O'
elif event.type == 3:
type = 'S'
if (csv):
print("%d,%s,%d,%s,%d,%d,%d,%s" % (
event.ts_us, event.task.decode('utf-8'), event.pid, type, event.size,
event.offset, event.delta_us, event.file.decode('utf-8')))
return
print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % (strftime("%H:%M:%S"),
event.task.decode('utf-8'), event.pid, type, event.size, event.offset / 1024,
float(event.delta_us) / 1000, event.file.decode('utf-8')))
# initialize BPF
b = BPF(text=bpf_text)
# common file functions
b.attach_kprobe(event="xfs_file_read_iter", fn_name="trace_rw_entry")
b.attach_kprobe(event="xfs_file_write_iter", fn_name="trace_rw_entry")
b.attach_kprobe(event="xfs_file_open", fn_name="trace_open_entry")
b.attach_kprobe(event="xfs_file_fsync", fn_name="trace_fsync_entry")
b.attach_kretprobe(event="xfs_file_read_iter", fn_name="trace_read_return")
b.attach_kretprobe(event="xfs_file_write_iter", fn_name="trace_write_return")
b.attach_kretprobe(event="xfs_file_open", fn_name="trace_open_return")
b.attach_kretprobe(event="xfs_file_fsync", fn_name="trace_fsync_return")
# header
if (csv):
print("ENDTIME_us,TASK,PID,TYPE,BYTES,OFFSET_b,LATENCY_us,FILE")
else:
if min_ms == 0:
print("Tracing XFS operations")
else:
print("Tracing XFS operations slower than %d ms" % min_ms)
print("%-8s %-14s %-6s %1s %-7s %-8s %7s %s" % ("TIME", "COMM", "PID", "T",
"BYTES", "OFF_KB", "LAT(ms)", "FILENAME"))
# read events
b["events"].open_perf_buffer(print_event, page_cnt=64)
while 1:
try:
b.perf_buffer_poll()
except KeyboardInterrupt:
exit()
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/Dmi-compute/bcc.git
git@gitee.com:Dmi-compute/bcc.git
Dmi-compute
bcc
bcc
master

搜索帮助