biopython教程与⼿册_eBPFTracing⼊门教程与实例
在LPC'18(LinuxPlumber'sconference)会议上,⾄少有24个关于eBPF的演讲。eBPF这⼀实⽤技术,将是每个开发者需要掌握的
技巧。也许你的新年⽬标得再多⼀个了:学习eBPF!
eBPF的名称源于extendedBerkeleyPacketFilter,如果从eBPF的功能来说,类似VirtualKernelInstructionSet(VKIS)这样的名
字似乎跟贴切。eBPF可以⽤来做很多事情,⽐如⽹络性能(networkperformance),防⽕墙(firewalls),安全(curity),程序分析追踪
(tracing)和设备驱动(devicedrivers)等。其中,诸如tracing等功能在⽹络上已经有很多资料。这⾥的术语tracing特指可以⽣成per-
event信息的性能分析和观察⼯具,例如tcpdump和strace就是两个常⽤的tracer。
这篇⽂章将着重于eBPFtracing的学习,并分为beginner,intermediate,advanced三个阶段,⼤纲如下:Beginner:运⾏bcc⼯具
Intermediate:开发bpftrace⼯具
Advanced:开发bcc⼯具,并贡献社区
Beginner
,bcc,bpftrace,iovisor是什么
eBPF之于Linux⼀定程度上如同JavaScript之于HTML。JavaScript使得⽹页不再是静态的,它可以让你编写程序来监听⿏标点击等
事件,⽽且程序运⾏在浏览器的安全虚拟环境中;类似的,有了eBPF,内核也可以不是固定的(fixed),你可以编写程序来监听diskI/O
事件并执⾏相关动作,⽽且程序运⾏在内核的安全虚拟环境中。实际上,eBPF更像是运⾏JavaScript的V8引擎,⽽不是像JavaScript
本⾝。eBPF是LinuxKernel的⼀部分。
直接eBPF编码难于上青天,就好⽐直接编写V8字节码。但是没有⼈直接写V8字节码,他们⽤JavaScript,或者基于JavaScript的
框架(jQuery,Angular,React等)。eBPF也是⼀样,⼈们通过框架来使⽤eBPF。对于tracing来说,主要的框架就是bcc和
bpftrace,这两个框架并不在内核代码中,他们在名为iovisor的LinuxFoundationproject中维护。
acing⽰例
tcplife是⼀个基于eBPF的⼯具,可以显⽰完整的TCPssion,以及对应的进程号(PID),命令(COMM),收发字节数(TX_KB,
RX_KB),以及时长(MS):
#tcplife
PIDCOMMLADDRLPORTRADDRRPORTTX_KBRX_KBMS
22597recordProg127.0.0.146644127.0.0.128527000.23
3277redis-rv127.0.0.128527127.0.0.146644000.28
22598curl100.66.3.1726162052.205.89.26800191.79
22604curl100.66.3.1724440052.204.43.1218001121.38
22624recordProg127.0.0.146648127.0.0.128527000.22
3277redis-rv127.0.0.128527127.0.0.146648000.27
22647recordProg127.0.0.146650127.0.0.128527000.21
3277redis-rv127.0.0.128527127.0.0.146650000.26
[...]
并不是eBPF才使得这样的⼯具成为可能,完全可以利⽤其他内核技术特性重写tcplife。但是如果这么做了,我们将因为性能开销、安全等
因素⽽⽆法在⽣产环境中运⾏这个⼯具。eBPF做的恰恰是让这个⼯具变得实⽤,tcplife是⾼效并且安全的。举例来说,tcplife并不会像
其他内核技术特性⼀样去追踪每个⽹络包(packet),那样会带来太多的性能开销。相反地,tcplife只追踪TCPssion事件,这类事件相
对来说频率较低。这使得tcplife的负载极低,以⾄于我们可以在⽣产环境中24⼩时持续运⾏这个⼯具。
3.如何使⽤eBPF
对于初学者,尝试⼀下bcctools。bcc的安装很简单,并有详细的说明⽂档,例如在Ubuntu上,效果如下
#sudoapt-getupdate
#sudoapt-getinstallbpfcc-tools
#sudo/usr/share/bcc/tools/opensnoop
PIDCOMMFDERRPATH
25548gnome-shell330/proc/lf/stat
10190opensnoop-12/usr/lib/python2.7/encodings/ascii.x86_
10190opensnoop-12/usr/lib/python2.7/encodings/
10190opensnoop-12/usr/lib/python2.7/encodings/
10190opensnoop180/usr/lib/python2.7/encodings/
10190opensnoop190/usr/lib/python2.7/encodings/
25548gnome-shell330/proc/lf/stat
29588devicepoll40/dev/bus/usb
^C
这⾥我通过运⾏opensnoop来验证bcctools是否⼯作,如果你顺利到这⼀步,说明你已经在使⽤eBPF了!
Netflix和Facebook等公司已经在服务器上默认安装bcc,或许你也想这么做。
4.初学者⼊门教程
BrendanGregg提供了⼀个bcc⼊门教程,⽅便初学者很好地开始eBPFtracing.
作为初学者,你不必开发eBPF代码。bcc⾃带超过70多个⼯具可以直接使⽤。bcc⼊门教程⾥你将接触其中11个⼯具:execsnoop,
opensnoop,ext4slower(orbtrfs,xfs,zfs),biolatency,biosnoop,cachestat,tcpconnect,tcpaccept,tcpretrans,runqlat,and
profile.
⼀旦你开始⼊门,你需要清楚bcctracing⼯具还有很多:
这些⼯具都有很详细的⽂档,包括使⽤⼿册和⽰例。⽰例⽂件(xxx_)展⽰了屏幕截图和对应的解释:⽐如
biolatency_nGregg撰写了许多类似的⽰例⽂档、使⽤⼿册、⼯具,都在bccrepo中。
⽣产环境中的bcctracing⽰例没有提供,BrendanGregg在撰写这篇⽂档时,eBPF刚发展起来并只在测试机器上可⽤,因此⼤多数使
⽤⽰例都是构造的测试⽤例。之后这个教程⾥会提供真实世界的⽤例,这是初学者可以贡献的⽅向:如果你通过bcc⼯具解决了⼀个实际
问题,考虑发布⼀个博客⽂章来共享屏幕截图,或者添加到bccrepo的examples⽂件中。
Intermediate
到这⾥,你应该已经可以运⾏bcc并尝试了上述⼯具,然后你肯定会想定制开发⾃⼰的bcc⼯具。最佳实践是切换到
bpftrace,bpftrace提供⾼级语⾔可以使得⼊门开发更简单。坏处就是bpftrace不如bcc那么拓展友好。因此,你最终还是会遇到瓶
颈,继⽽切换回bcc。
参考bpftrace安装说明,bpftrace是不同于bcc的另⼀个项⽬。此时bpftrace还没有在各个平台打包发布。在不久的将来,可以很⽅
便地通过类似apt-getinstallbpftrace的⽅式来安装。
ce教程
BrendanGregg开发⼀个了bpftrace教程,通过⼀系列命令来学习bpftrace,⼀共有12个⽰例循序渐进。
其中⼀个⽰例的截图如下,这⾥使⽤opensyscalltracepoint来跟踪PID和对应的打开⽂件路径。
#bpftrace-e'tracepoint:syscalls:sys_enter_open{printf("%d%sn",pid,str(args->filename));}'
Attaching1probe...
181/proc/cpuinfo
181/proc/stat
1461/proc/net/dev
1461/proc/net/if_inet6
^C
ce参考指南
关于bpftrace的更多参考信息,BrendanGregg整理了⼀个参考指南,提供了关于bpftrace的语法、探针、内建等的⽰例。
这个参考指南的⽬的很简单:BrendanGregg尽可能地把主题、摘要、截图都放在⼀个屏幕上。如果你查找⼀些东西,需要滚动浏览多
页,那就太长了。
ce⽰例
bpftracerepo中有20多个⼯具,可以通过这些⼯具来学习开发。例如:
#cattools/
[...]
BEGIN
{
printf("TracingblockdeviceI/O...HitCtrl-Ctoend.n");
}
kprobe:blk_account_io_start
{
@start[arg0]=ncs;
}
kprobe:blk_account_io_completion
/@start[arg0]/
{
@ucs=hist((ncs-@start[arg0])/1000);
delete(@start[arg0]);
}
和bcc⼯具⼀样,bpftrace⼯具也有完整的使⽤⼿册和⽰例⽂档,例如biolatency_。
Advanced
1.学习bcc开发
BrendanGregg提供了两个帮助⽂档:
在bcc/tools/*.py中有很多⽰例。bcctools分为两⼤部分:1)⾯向内核的BPF代码,⽤C语⾔开发;2)⽤户态⼯具,⽤Python(lua,
C++)等语⾔开发。开发bcctools⼀定程度来说是⾼阶的,可能会深⼊复杂的内核或应⽤程序的内部。
2.贡献开源
bcc/bpftraceissues欢迎⼤家讨论解决:
对于bpftrace,BrendanGregg给了bpftraceinternalsdevelopmentguide.这⾥的开发很有挑战,因为涉及到LLVMIR的知识。
可以贡献代码的还有kerneleBPF(akaBPF)引擎。如果你浏览bcc/bpftraceissues,你会看到⼀些相关的优化需求,例如bpftrace
kerneltag标记的issues。同时,你还可以关注订阅netdev邮件列表,从⽽获得最新的kernelBPF开发进展。这些新开发的代码会进
⼊net-next分⽀,然后合并⼊Linux主分⽀。
除了开发代码,你还可以通过测试、打包、博客、演讲等⽅式来贡献。
Summary
eBPF可以胜任很多事情。这篇⽂章介绍如何利⽤eBPF来跟踪问题和性能分析。总的来说:Beginner:运⾏bcctools
Intermediate:开发bpftracetools
Advanced:开发bcctools,给bcc/bpftrace社区贡献代码。
BrendanGregg将上述内容整合到⼀个页⾯中,eBPFTracingTools,加油!
本⽂为云栖社区原创内容,未经允许不得转载。
本文发布于:2022-11-24 15:05:44,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/12556.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |