介绍bpftrace是一种用于Linux的高级跟踪工具和语言。该工具基于eBPF和BBC,通过探测机制收集内核和程序运行的信息,然后以图表等方式展示这些信息,帮助开发者发现隐藏的bug、安全问题和性能瓶颈。bpftrace使用LLVM作为后端,将脚本编译为BPF字节码,并利用BCC与LinuxBPF系统进行交互,以及现有的Linux跟踪功能:内核动态跟踪(kprobes)、用户级动态跟踪(uprobes)和跟踪点。bpftrace语言的灵感来自awk和C,以及DTrace和SystemTap等前端探测器。项目地址为:https://github.com/iovisor/bpftrace下载安装官方推荐运行Linux4.9内核或更高版本。某些工具可能适用于较旧的内核,但这些较旧的内核不再经过测试。Ubuntu#对于Ubuntu19.04sudoapt-getinstall-ybpftrace#在Ubuntu16.04及更高版本上,bpftrace也可以作为snap包使用sudosnapinstall--devmodebpftracesudosnapconnectbpftrace:system-traceFedora#对于Fedora28(和稍后),bpftrace包含在官方存储库中。只需使用dnf安装软件包sudodnfinstall-ybpftraceGentoo#在Gentoo上,bpftrace包含在官方存储库中。可以通过emerge安装sudoemerge-avbpftracesudoemerge-avbpftraceothers#Debian、openSUSE、CentOS等其他的可以在以下链接下载安装https://tracker.debian.org/pkg/bpftracehttps://software.opensuse.org/package/bpftracehttps://github.com/fbs/el7-bpf-specs/blob/master/README.md#repositoryDocker$dockerrun-v$(pwd):/outputquay.io/iovisor/bpftrace:master-vanilla_llvm_clang_glibc2.23\/bin/bash-c"cp/usr/bin/bpftrace/output"$./bpftrace-Vv0.9.4工具bpftrace包含各种工具,也可作为bpftrace中的编程示例语言。简单介绍几个工具。bashreadline.bt在系统范围内打印输入的bash命令:#./bashreadline.btAttaching2probes...Tracingbashcommands...HitCtrl-Ctoend.TIMEPIDCOMMAND06:40:065526df-h06:40:095526ls-l06:40:185526echohellobpftrace06:40:425526echooo这是一个失败的命令,但无论如何我们都能看到它^Cbiolatency.btI/O延迟直方图:#./biolatency.btAttaching3probes...跟踪块设备I/O...按Ctrl-C结束。^C@usecs:[256,512)2||[512,1K)10|@|[1K,2K)426|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[2K,4K)230|@@@@@@@@@@@@@@@@@@@@@@@@@@|[4K,8K)9|@|[8K,16K)128|@@@@@@@@@@@@@|[16K,32K)68|@@@@@@@@|[32K,64K)0||[64K,128K)0||[128K,256K)10|@|bitesize.bt将磁盘I/O大小显示为直方图:#./bitesize.btAttaching3probes...TracingblockdeviceI/O...按Ctrl-C结束。^按进程名称划分的CI/O大小(字节)直方图:@[cleanup]:[4K,8K)2|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[postdrop]:[4K,8K)2|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|@[jps]:[4K,8K)1|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[8K,16K)0||[16K,32K)0||[32K,64K)2|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@[kworker/2:1H]:[0]3|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[1]0||[2,4)0||[4,8)0||[8,16)0||[16,32)0||[32,64)0||[64,128)0||[128,256)0||[256,512)0||[512,1K)0||[1K,2K)0||[2K,4K)0||[4K,8K)0||[8K,16K)0||[16K,32K)0||[32K,64K)0||[64K,128K)1|@@@@@@@@@@@@@@@|@[jbd2/nvme0n1-8]:[4K,8K)3|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[8K,16K)0||[16K,32K)0||[32K,64K)2|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[64K,128K)1|@@@@@@@@@@@@@@@@@[dd]:[16K,32K)921|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|cpuwalk.bt检查哪些CPU正在执行进程:#./cpuwalk.btAttaching2个探针...以99hz采样CPU...按Ctrl-C结束。^C@cpu:[0,1)130|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[1,2)137|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[2,3)99|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[3,4)99|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[4,5)82|@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[5,6)34|@@@@@@@@@@@|[6,7)67|@@@@@@@@@@@@@@@@@@@@@@|[7,8)41|@@@@@@@@@@@@@|[8,9)97|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[9,10)140|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[10,11)105|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[11,12)77|@@@@@@@@@@@@@@@@@@@@@@@@@|[12,13)39|@@@@@@@@@@@@|[13,14)58|@@@@@@@@@@@@@@@@@@@@|[14,15)64|@@@@@@@@@@@@@@@@@@@@@@|[15,16)57|@@@@@@@@@@@@@@@@@@@|[16,17)99|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[17,18)56|@@@@@@@@@@@@@@@@@@|[18,19)44|@@@@@@@@@@@@@@@|[19,20)80|@@@@@@@@@@@@@@@@@@@@@@@@@@@|[20,21)64|@@@@@@@@@@@@@@@@@@@@|[21,22)59|@@@@@@@@@@@@@@@@@@@@|[22,23)88|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[23,24)84|@@@@@@@@@@@@@@@@@@@@@@@@@@@|[24,25)29|@@@@@@@@@|[25,26)48|@@@@@@@@@@@@@@@@|[26,27)62|@@@@@@@@@@@@@@@@@@@@|[27,28)66|@@@@@@@@@@@@@@@@@@@@@@|[28,29)57|@@@@@@@@@@@@@@@@@@@|[29,30)59|@@@@@@@@@@@@@@@@@@@@|[30,31)56|@@@@@@@@@@@@@@@@@@|[31,32)23|@@@@@@@@|[32,33)90|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[33,34)62|@@@@@@@@@@@@@@@@@@@@|[34,35)39|@@@@@@@@@@@@@|[35,36)68|@@@@@@@@@@@@@@@@@@@@@@@|tcpconnect.bt跟踪TCP活动连接(connect()):#./tcpconnect.btTIMEPIDCOMMSADDRSPORTDADDRDPORT00:36:451798396agent127.0.0.1500110.229.20.825611400:36:451798176.10.025curl12210.22.20.825660600:36:453949059nginx127.0.0.18000127.0.0.137780▋推荐书籍在乐趣中了解曾经吓跑你的CPU、操作系统、编程语言、数据库、网络协议。这本漫画书分为5章,每一章都有不同的风景。相信看完之后,你能在不经意间发现程序员的简单浪漫。作者非常用心地编写了每一个对话,并精心勾画了每一个模式。
