bcc是一套用于基于BPF的Linux IO分析、网络、监控等的工具,本目录将介绍其中常用的几种工具
编译安装的bcc-tools一般目录在/usr/share/bcc/tools
如果遇到目录下有该命令却无法执行,检查自己是否是root用户或者sudo
缓存分析/内存
cachestat
追踪页缓存命中率/失误率
语法:./cachestat 间隔秒数 输出组数
示例
./cachestat 1 3
HITS MISSES DIRTIES HITRATIO BUFFERS_MB CACHED_MB
0 0 0 0.00% 2 835
1 0 0 100.00% 2 835
0 0 0 0.00% 2 835
MISSES ,表示缓存未命中的次数;
HITS ,表示缓存命中的次数;
DIRTIES, 表示新增到缓存中的脏页数;
HITRATIO,命中率
BUFFERS_MB 表示 Buffers 的大小,以 MB 为单位;
CACHED_MB 表示 Cache 的大小,以 MB 为单位。
cachetop
追踪各进程的页缓存命中率/失误率
./cachetop
输出类似top,默认5s一刷新,字段含义与cachestat相同,READ_HIT% WRITE_HIT%表示读写缓存命中率
示例
05:40:04 Buffers MB: 2 / Cached MB: 835 / Sort: HITS / Order: descending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
15086 root crond 1050 0 0 100.0% 0.0%
15088 root sa1 719 0 0 100.0% 0.0%
15088 root sh 709 0 0 100.0% 0.0%
15088 root sadc 616 1 0 99.8% 0.0%
15087 root unix_chkpwd 498 0 0 100.0% 0.0%
15089 root sa1 483 0 0 100.0% 0.0%
15090 root sa1 483 0 0 100.0% 0.0%
15090 root date 465 0 0 100.0% 0.0%
15089 root date 462 0 0 100.0% 0.0%
15092 root systemd-cgroups 433 0 0 100.0% 0.0%
15091 root systemd-cgroups 427 0 0 100.0% 0.0%
15088 root crond 310 0 0 100.0% 0.0%
15087 root crond 130 0 0 100.0% 0.0%
1 root systemd 44 0 0 100.0% 0.0%
556 root systemd-journal 9 0 0 100.0% 0.0%
15091 root kworker/u8:2 6 0 0 100.0% 0.0%
15092 root kworker/u8:2 6 0 0 100.0% 0.0%
791 dbus dbus-daemon 5 0 0 100.0% 0.0%
15070 root cachetop 2 0 0 100.0% 0.0%
1505 root crond 1 0 0 100.0% 0.0%
781 root systemd-logind 1 0 0 100.0% 0.0%
1069 root rs:main Q:Reg 0 2 0 0.0% 0.0%
757 root auditd 0 1 0 0.0% 0.0%
05:41:24 Buffers MB: 2 / Cached MB: 835 / Sort: HITS / Order: descending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
15070 root cachetop 1 0 0 100.0% 0.0%
memleak
memleak用于追踪和查找内存分配和释放配对,需要Linux Kernel 4.7以上版本支持
参数
usage: memleak [-h] [-p PID] [-t] [-a] [-o OLDER] [-c COMMAND]
[--combined-only] [--wa-missing-free] [-s SAMPLE_RATE] [-T TOP]
[-z MIN_SIZE] [-Z MAX_SIZE] [-O OBJ] [--percpu]
[interval] [count]
-h:查看帮助信息
-p PID:指定进程PID
-t:追踪所有内存分配和释放请求和结果
-a:输出未释放内存的列表
-z MIN_SIZE:捕获分配内存的最小值
-Z MAX_SIZE:捕获分配内存的最大值
示例
./memleak -z 16 -Z 32 #只捕获分析分配大小未16字节至32字节间的内存分配
Attaching to kernel allocators, Ctrl+C to quit.
[22:22:22] Top 10 stacks with outstanding allocations:
64 bytes in 4 allocations from stack
kmem_cache_alloc+0x14c [kernel]
selinux_file_alloc_security+0x37 [kernel]
security_file_alloc+0x27 [kernel]
__alloc_file+0x5b [kernel]
alloc_empty_file+0x4a [kernel]
alloc_file+0x2d [kernel]
alloc_file_pseudo+0xa8 [kernel]
anon_inode_getfile+0x84 [kernel]
__do_sys_perf_event_open+0x642 [kernel]
__x64_sys_perf_event_open+0x20 [kernel]
do_syscall_64+0x60 [kernel]
entry_SYSCALL_64_after_hwframe+0x44 [kernel]
内核
funccount
计算内核函数调用
参数
usage: funccount [-h] [-p PID] [-i INTERVAL] [-d DURATION] [-T] [-r] [-D]
[-c CPU]
pattern
-h, --help 显示此帮助信息并退出
-p PID, --pid PID 只跟踪这个PID
-i INTERVAL, --interval INTERVAL
摘要时间间隔,秒
-d DURATION, --duration DURATION
追踪的总时间,秒
-T, --timestamp 在输出中包含时间戳
-r, --regexp 使用正则表达式。默认为 "*"通配符
仅供参考。
-D, --debug 在启动前打印BPF程序(用于调试
目的)。
-c CPU, --cpu CPU只跟踪这个CPU
示例
./funccount -d 10 'vfs_*'
Tracing 56 functions for "b'vfs_*'"... Hit Ctrl-C to end.
FUNC COUNT
b'vfs_statx' 2
b'vfs_write' 7
b'vfs_statx_fd' 12
b'vfs_getattr' 13
b'vfs_getattr_nosec' 16
b'vfs_open' 54
b'vfs_read' 87
trace
追踪某个函数调用并打印函数参数或返回值
语法
usage: trace [-h] [-b BUFFER_PAGES] [-p PID] [-L TID] [--uid UID] [-v]
[-Z STRING_SIZE] [-S] [-M MAX_EVENTS] [-t] [-u] [-T] [-C]
[-c CGROUP_PATH] [-n NAME] [-f MSG_FILTER] [-B]
[-s SYM_FILE_LIST] [-K] [-U] [-a] [-I header] [-A]
probe [probe ...]
-h:查看帮助信息
-p PID:只追踪PID进程
-L TID:只追踪TID线程
-v:显示生成的BPF程序,调试使用
-z STRING_SIZE:收集字符串参数的长度
-s SYM_FILE_LIST:收集栈大小
-M MAX_EVENTS:打印追踪消息的最大数量
-t:打印时间,单位为秒。
-u:打印时间戳
-T:打印时间列
-C:打印CPU ID
-K:打印每个事件的内核栈
-U:打印每个事件的用户栈
-a:打印序内核栈和用户栈的虚拟地址
-I header:增加header文件到BPF程序
probe [probe ...]:附加到函数的探针
示例
./trace 'do_sys_open "%s", arg2'
PID TID COMM FUNC -
782 782 irqbalance do_sys_open b'/proc/interrupts'
782 782 irqbalance do_sys_open b'/proc/stat'
782 782 irqbalance do_sys_open b'/proc/irq/36/smp_affinity'
782 782 irqbalance do_sys_open b'/proc/irq/37/smp_affinity'
782 782 irqbalance do_sys_open b'/proc/irq/0/smp_affinity'
782 782 irqbalance do_sys_open b'/proc/irq/1/smp_affinity'
782 782 irqbalance do_sys_open b'/proc/irq/6/smp_affinity'
782 782 irqbalance do_sys_open b'/proc/irq/8/smp_affinity'
782 782 irqbalance do_sys_open b'/proc/irq/12/smp_affinity'
782 782 irqbalance do_sys_open b'/proc/irq/14/smp_affinity'
782 782 irqbalance do_sys_open b'/proc/irq/15/smp_affinity'
追踪open syscall的所有调用方式
系统
execsnoop
追踪exec系统调用追踪新进程,对于使用fork而不是exec产生的进程不会包括在显示结果中
语法
usage: execsnoop [-h] [-T] [-t] [-x] [--cgroupmap CGROUPMAP]
[--mntnsmap MNTNSMAP] [-u USER] [-q] [-n NAME] [-l LINE] [-U]
[--max-args MAX_ARGS]
-h, --help 显示帮助信息并退出
-T, --time 在输出中包括时间栏(HH:MM:SS)
-t, --timestamp 在输出中包括时间戳
-x, --fails 包括失败的exec()
--cgroupmap CGROUPMAP
只跟踪该BPF map中的cgroup
--mntnsmap MNTNSMAP 只跟踪该BPF map中的挂载命名空间
-u USER, --uid USER 只跟踪这个UID
-q, --quote 在参数周围添加引号(")
-n NAME, --name NAME 只打印与此名称(regex)匹配的命令
-l LINE, --line LINE 只打印参数包含此行的命令
-U, --print-uid 打印UID列
--max-args MAX_ARGS 被解析和显示的参数的最大数量。默认为20
ext4slower
ext4slower通过跟踪ext4文件系统的read、write、open、sync操作,并测量相应操作所耗时间,打印超过阈值的详细信息。默认阈值最小值是10ms,如果阈值为0,则打印所有事件
参数
ext4slower [-h] [-j] [-p PID] [min_ms]
-h, --help:查看帮助信息
-j, --csv:使用csv格式打印字段
-p PID, --pid PID:只追踪PID进程
min_ms:追踪IO的阈值,默认为10
deadlock
查找正在运行进程潜在的死锁
参数
usage: deadlock [-h] [--binary BINARY] [--dump-graph DUMP_GRAPH] [--verbose]
[--lock-symbols LOCK_SYMBOLS]
[--unlock-symbols UNLOCK_SYMBOLS] [-t THREADS] [-e EDGES]
pid
-h, --help:查看帮助信息
--binary BINARY:指定线程库,对于动态链接程序必须指定。
--dump-graph DUMP_GRAPH:导出mutex图到指定文件
--verbose:打印mutex统计信息
--lock-symbols LOCK_SYMBOLS:要追踪的锁的列表,使用逗号分隔,默认为pthread_mutex_lock。
--unlock-symbols UNLOCK_SYMBOLS:要追踪的解锁的列表,使用逗号分隔,默认为pthread_mutex_unlock。
示例
deadlock 181 --binary /lib/x86_64-linux-gnu/libpthread.so.0
查找进程181中的潜在死锁,并指定线程库/lib/x86_64-linux-gnu/libpthread.so.0
磁盘
biolatency
追踪块设备IO,记录IO延迟分布,并以直方图显示。
参数
./biolatency -h
usage: biolatency [-h] [-T] [-Q] [-m] [-D] [-F] [-e] [-j] [输出间隔] [输出次数]
-h:帮助手册
-T:输出包含时间戳
-m:输出ms级直方图
-D:打印每个磁盘设备的直方图
-F:打印每个IO集的直方图
示例
./biolatency 1 3
Tracing block device I/O... Hit Ctrl-C to end.
usecs : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 0 | |
16 -> 31 : 0 | |
32 -> 63 : 0 | |
64 -> 127 : 0 | |
128 -> 255 : 2 |****************************************|
256 -> 511 : 1 |******************** |
usecs : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 0 | |
16 -> 31 : 0 | |
32 -> 63 : 0 | |
64 -> 127 : 0 | |
128 -> 255 : 3 |****************************************|
biosnoop
追踪磁盘IO
语法
biosnoop [-h] [-Q]
-h: 帮助手册
-Q:包括操作系统的排队时间
示例
./biosnoop -Q
TIME(s) COMM PID DISK T SECTOR BYTES QUE(ms) LAT(ms)
0.000000 ? 0 R 0 8 0.00 0.36
0.063768 ? 0 R 0 8 0.00 0.18
0.063932 ? 0 R 0 8 0.00 0.16
2.047809 ? 0 R 0 8 0.00 0.19
网络
tcpconnect
tcpconnect用于追踪TCP活跃连接数量,通过动态追踪内核tcp_v4_connect和tcp_v6_connect函数,并记录函数内的任何变化。
语法
tcpconnect [-h] [-c] [-t] [-x] [-p PID] [-P PORT]
-h:查看帮助信息
-t:打印时间戳
-c:统计每个源IP和目的IP/端口的连接数
-p PID:只追踪PID进程
-P PORT:要追踪的目的端口列表,使用逗号分隔
## 数据库
dbstat
将 MySQL/PostgreSQL 的查询延迟汇总为直方图
语法
usage: dbstat [-h] [-v] [-p [PID [PID ...]]] [-m THRESHOLD] [-u] [-i INTERVAL]
{mysql,postgres}
positional arguments:
{mysql,postgres} the database engine to use
-h, --help 显示此帮助信息并退出
-v, --verbose 打印BPF程序
-p [PID [PID ...]], --pid [PID [PID ...]]
追踪的PID(s)。
-m THRESHOLD, --threshold THRESHOLD
追踪比该阈值慢的查询(ms)
-u, --microseconds 显示以微秒为单位的查询延迟(默认。
毫秒)。
-i INTERVAL, --interval INTERVAL
打印这个时间间隔的摘要(秒)。
示例
dbstat postgres # display a histogram of PostgreSQL query latencies
dbstat mysql -v # display MySQL latencies and print the BPF program
dbstat mysql -u # display query latencies in microseconds (default: ms)
dbstat mysql -m 5 # trace only queries slower than 5ms
dbstat mysql -p 408 # trace queries in a specific process
dbslower
跟踪 MySQL/PostgreSQL 的查询时间高于阈值
语法
usage: dbslower [-h] [-v] [-p [PID [PID ...]]] [-x PATH] [-m THRESHOLD]
{mysql,postgres}
positional arguments:
{mysql,postgres} the database engine to use
-h, --help 显示此帮助信息并退出
-v, --verbose 打印BPF程序
-p [PID [PID ...]], --pid [PID [PID ...]]
追踪的PID(s)。
-x PATH, --exe 二进制文件的PATH路径
-m THRESHOLD, --threshold THRESHOLD
追踪比该阈值慢的查询(ms)
示例
dbslower postgres # trace PostgreSQL queries slower than 1ms
dbslower postgres -p 188 322 # trace specific PostgreSQL processes
dbslower mysql -p 480 -m 30 # trace MySQL queries slower than 30ms
dbslower mysql -p 480 -v # trace MySQL queries & print the BPF program
dbslower mysql -x $(which mysqld) # trace MySQL queries with uprobes