title: 入门教程
date: 2024-06-20T14:31:46Z
lastmod: 2024-06-21T04:12:43Z
入门教程
本教程仅包含怎样快速使用bcc工具解决性能、故障和网络问题。若想要开启开发新的bcc工具,请参考bcc教程。
本教程认为bcc已经安装,可以成功运行execsnoop命令。如果未安装,可以参考安装教程
0. bcc开始之前
使用bcc之前,我们应该从linux基础开始
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top
1. 通用性能工具
这是一个通用的关于bcc 性能研究工具清单,然后详细说明:
execsnoop
opensnoop
ext4slower (or btrfs*, xfs*, zfs*)
biolatency
biosnoop
cachestat
tcpconnect
tcpaccept
tcpretrans
runqlat
profile
1.1 execsnoop
execsnoop逐行打印每一个新的进程的输出,检查短暂的进程。 这些可能会消耗CPU资源,但在大多数监测工具不显示,这些工具只是定期采取正在运行程序的快照。
它通过跟踪exec(), 不是 fork(),所以它将会捕捉多种类型的新建进程,但不是所有的(例如,它不会看到一个应用程序的启动工作流程,这并不exec()任何东西).
# ./execsnoop
PCOMM PID RET ARGS
supervise 9660 0 ./run
supervise 9661 0 ./run
mkdir 9662 0 /bin/mkdir -p ./main
run 9663 0 ./run
[...]
更多示例
1.2 opensnoop
opensnoop 用于打印每个open()系统调用,包括详细信息。
打开的文件可以告诉你很多关于应用如何工作:确定其文件的数据,配置文件和日志的文件。 有时应用程序可以胡作非为,并执行不佳,当它们不断试图读的文件不存在时,opensnoop可以快速查找一下。
# ./opensnoop
PID COMM FD ERR PATH
1565 redis-server 5 0 /proc/1565/stat
1565 redis-server 5 0 /proc/1565/stat
1565 redis-server 5 0 /proc/1565/stat
1603 snmpd 9 0 /proc/net/dev
1603 snmpd 11 0 /proc/net/if_inet6
1603 snmpd -1 2 /sys/class/net/eth0/device/vendor
1603 snmpd 11 0 /proc/sys/net/ipv4/neigh/eth0/retrans_time_ms
1603 snmpd 11 0 /proc/sys/net/ipv6/neigh/eth0/retrans_time_ms
1603 snmpd 11 0 /proc/sys/net/ipv6/conf/eth0/forwarding
[...]
1.3. ext4slower (or btrfs*, xfs*, zfs*)
# ./ext4slower
Tracing ext4 operations slower than 10 ms
TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME
06:35:01 cron 16464 R 1249 0 16.05 common-auth
06:35:01 cron 16463 R 1249 0 16.04 common-auth
06:35:01 cron 16465 R 1249 0 16.03 common-auth
06:35:01 cron 16465 R 4096 0 10.62 login.defs
06:35:01 cron 16464 R 4096 0 10.61 login.defs
ext4slower跟踪ext4文件系统和相同行为的时间,然后只打印那些超过某一阈值的进程。这用于识别性能问题是很有用的:显示慢I/O的文件系统。 磁盘处理异步I/O这种场景下就很难将应用延迟和磁盘IO关联起来。 在内核栈跟踪VFS->文件系统接口可以更深入观测到应用程序运行过程。 使用这个工具以识别文件系统中的等待时间是否超过阈值。类似的工具存在bcc其他文件系统:btrfsslower、xfsslower和zfsslower。fileslower工作在VFS层,可以跟踪一切(虽然在一些更高的开销)。
更多示例
1.4 biolatency
biolatency可以跟踪IO延迟(因为设备问题)。当命令执行结束后(Ctrl\-C,或者一段时间后),将会绘制延迟摘要直方图。这对于理解磁盘io延迟比iostat的平均时间更好。I/O延迟值以在结束时打印,也可以以其他形式输出。
# ./biolatency
Tracing block device I/O... Hit Ctrl-C to end.
^Cusecs : count distribution0 -> 1 : 0 | |2 -> 3 : 0 | |4 -> 7 : 0 | |8 -> 15 : 0 | |16 -> 31 : 0 | |32 -> 63 : 0 | |64 -> 127 : 1 | |128 -> 255 : 12 |******** |256 -> 511 : 15 |********** |512 -> 1023 : 43 |******************************* |1024 -> 2047 : 52 |**************************************|2048 -> 4095 : 47 |********************************** |4096 -> 8191 : 52 |**************************************|8192 -> 16383 : 36 |************************** |16384 -> 32767 : 15 |********** |32768 -> 65535 : 2 |* |
更多示例
1.5 biosnoop
biosnoop会逐行打印每个磁盘io,包含延迟等具体信息。这可以让你检查磁盘I/O更详细的细节,并寻找时序的模式(例如,读排队后面写). 输出将可以详细展示你的系统是否在进行高速率的磁盘IO。
# ./biosnoop
TIME(s) COMM PID DISK T SECTOR BYTES LAT(ms)
0.000004001 supervise 1950 xvda1 W 13092560 4096 0.74
0.000178002 supervise 1950 xvda1 W 13092432 4096 0.61
0.001469001 supervise 1956 xvda1 W 13092440 4096 1.24
0.001588002 supervise 1956 xvda1 W 13115128 4096 1.09
1.022346001 supervise 1950 xvda1 W 13115272 4096 0.98
1.022568002 supervise 1950 xvda1 W 13188496 4096 0.93
[...]
更多示例
1.6 cachestat
cachestat每秒(或每隔一定时间间隔)打印统计文件系统的缓存统计。使用工具可以检测缓存命中率,以便进行性能调优。
# ./cachestatHITS MISSES DIRTIES READ_HIT% WRITE_HIT% BUFFERS_MB CACHED_MB1074 44 13 94.9% 2.9% 1 2232195 170 8 92.5% 6.8% 1 143182 53 56 53.6% 1.3% 1 14362480 40960 20480 40.6% 19.8% 1 2237 2 5 22.2% 22.2% 1 223348 0 0 100.0% 0.0% 1 223
[...]
更多示例
1.7. tcpconnect
tcpconnect逐行打印每个活跃连接(connect())的详细信息,包括源目地址。查到不期望的连接可能是应用配置问题或者电脑被入侵。
# ./tcpconnect
PID COMM IP SADDR DADDR DPORT
1479 telnet 4 127.0.0.1 127.0.0.1 23
1469 curl 4 10.201.219.236 54.245.105.25 80
1469 curl 4 10.201.219.236 54.67.101.145 80
1991 telnet 6 ::1 ::1 23
2015 ssh 6 fe80::2000:bff:fe82:3ac fe80::2000:bff:fe82:3ac 22
[...]
更多示例
1.8 tcpaccept
tcpaccept用于打印每一个被动的TCP连接(例如,通过accept())详细信息,包括来源和目的地址。显示不期望的连接可能是应用配置问题或者电脑被入侵。
# ./tcpaccept
PID COMM IP RADDR LADDR LPORT
907 sshd 4 192.168.56.1 192.168.56.102 22
907 sshd 4 127.0.0.1 127.0.0.1 22
5389 perl 6 1234:ab12:2040:5020:2299:0:5:0 1234:ab12:2040:5020:2299:0:5:0 7001
[...]
更多示例
1.9 tcpretrans
tcprerans用于打印每一个TCP重发包详细信息,包括来源和目的地的地址和内核态的TCP连接。TCP重传会引起延迟和吞吐量的问题。 对ESTABLISHED重传,会使用网络进行寻找。 对于SYN_SENT状态,这可能造成目标CPU跑满和内核数据包丢失。
# ./tcpretrans
TIME PID IP LADDR:LPORT T> RADDR:RPORT STATE
01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 ESTABLISHED
01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 ESTABLISHED
01:55:17 0 4 10.153.223.157:22 R> 69.53.245.40:22957 ESTABLISHED
[...]
更多示例
1.10 runqlat
runqlat用于查看线程等待CPU上运行的队列多久,并打印本直方图。这可以帮助量化在CPU饱和期间等待CPU耗费时间。
# ./runqlat
Tracing run queue latency... Hit Ctrl-C to end.
^Cusecs : count distribution0 -> 1 : 233 |*********** |2 -> 3 : 742 |************************************ |4 -> 7 : 203 |********** |8 -> 15 : 173 |******** |16 -> 31 : 24 |* |32 -> 63 : 0 | |64 -> 127 : 30 |* |128 -> 255 : 6 | |256 -> 511 : 3 | |512 -> 1023 : 5 | |1024 -> 2047 : 27 |* |2048 -> 4095 : 30 |* |4096 -> 8191 : 20 | |8192 -> 16383 : 29 |* |16384 -> 32767 : 809 |****************************************|32768 -> 65535 : 64 |*** |
更多示例
1.11 profile
profile是一个CPU分析器,这需要在一定的时间间隔采样跟踪堆栈,并打印摘要堆栈跟踪信息和发生的次数。使用这个工具来了解代码消耗CPU资源的途径。
# ./profile
Sampling at 49 Hertz of all threads by user + kernel stack... Hit Ctrl-C to end.
^C00007f31d76c3251 [unknown]47a2c1e752bf47f7 [unknown]- sign-file (8877)1ffffffff813d0af8 __clear_userffffffff813d5277 iov_iter_zeroffffffff814ec5f2 read_iter_zeroffffffff8120be9d __vfs_readffffffff8120c385 vfs_readffffffff8120d786 sys_readffffffff817cc076 entry_SYSCALL_64_fastpath00007fc5652ad9b0 read- dd (25036)40000000000400542 func_a0000000000400598 main00007f12a133e830 __libc_start_main083e258d4c544155 [unknown]- func_ab (13549)5[...]ffffffff8105eb66 native_safe_haltffffffff8103659e default_idleffffffff81036d1f arch_cpu_idleffffffff810bba5a default_idle_callffffffff810bbd07 cpu_startup_entryffffffff8104df55 start_secondary- swapper/1 (0)75
更多示例
execsnoop -h
is name (regex), anyarg-l LINE, --line LINE only print commands where arg contains this line(regex)-U, --print-uid print UID column--max-args MAX_ARGS maximum number of arguments parsed and displayed,defaults to 20examples:./execsnoop # trace all exec() syscalls./execsnoop -x # include failed exec()s./execsnoop -T # include time (HH:MM:SS)./execsnoop -U # include UID./execsnoop -u 1000 # only trace UID 1000./execsnoop -u user # get user UID and trace only them./execsnoop -t # include timestamps./execsnoop -q # add "quotemarks" around arguments./execsnoop -n main # only print command lines containing "main"./execsnoop -l tpkg # only print command where arguments contains "tpkg"./execsnoop --cgroupmap mappath # only trace cgroups in this BPF map./execsnoop --mntnsmap mappath # only trace mount namespaces in the mapusage: execsnoop [-h] [-T] [-t] [-x] [--cgroupmap CGROUPMAP][--mntnsmap MNTNSMAP] [-u USER] [-q] [-n NAME] [-l LINE] [-U][--max-args MAX_ARGS]Trace exec() syscallsoptional arguments:-h, --help show this help message and exit-T, --time include time column on output (HH:MM:SS)-t, --timestamp include timestamp on output-x, --fails include failed exec()s--cgroupmap CGROUPMAPtrace cgroups in this BPF map only--mntnsmap MNTNSMAP trace mount namespaces in this BPF map only-u USER, --uid USER trace this UID only-q, --quote Add quotemarks (") around arguments.-n NAME, --name NAME only print commands matching this name (regex), anyarg-l LINE, --line LINE only print commands where arg contains this line(regex)-U, --print-uid print UID column--max-args MAX_ARGS maximum number of arguments parsed and displayed,defaults to 20examples:./execsnoop # trace all exec() syscalls./execsnoop -x # include failed exec()s./execsnoop -T # include time (HH:MM:SS)./execsnoop -U # include UID./execsnoop -u 1000 # only trace UID 1000./execsnoop -u user # get user UID and trace only them./execsnoop -t # include timestamps./execsnoop -q # add "quotemarks" around arguments./execsnoop -n main # only print command lines containing "main"./execsnoop -l tpkg # only print command where arguments contains "tpkg"./execsnoop --cgroupmap mappath # only trace cgroups in this BPF map./execsnoop --mntnsmap mappath # only trace mount namespaces in the map