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

标签: none

评论已关闭