作为一名程序员,我喜欢紧跟内核和计算研究方面的各种最新技术。当第一次接触到BPF和XDP(eXpress Data Path)技术时,我就被深深地吸引了。我非常高兴本书聚焦于BPF和XDP技术,让更多的人在项目中使用如此优秀的技术。
首先聊聊我的背景以及我为什么如此喜欢研究内核。我曾与David一起担任Docker核心维护人员,主要负责使用iptables为容器提供过滤和路由逻辑。我提交的第一个PR就是修复CentOS上不同版本iptables命令行参数不兼容而执行失败的问题。如果你和我一样,经常开发和使用命令行工具,那么你也一定会遇到过很多诸如此类的问题。除此之外,在主机上构建成千上万的规则也会让iptables不堪重负,我需要解决由此导致的系统性能问题。
当我接触BPF和XDP工具后,简直如获珍宝。我不再苦恼于使用iptables遇到的类似问题。另外,我非常高兴地获悉内核社区甚至计划使用BPF( https://oreil.ly/cuqTy )替代iptables,同时,容器网络工具Cilium( https://cilium.io )也正在采用BPF和XDP进行构建。
除了可以实现更加优秀的iptables的功能外,BPF还可以实现更多的功能,比如,帮助我们跟踪系统调用、内核函数和用户态的程序。Linux系统上的bpftrace( https://github.com/iovisor/bpftrace )命令行工具实现了类似于DTrace的强大的功能。bpftrace可以跟踪所有正在打开的文件句柄、打开文件的进程,统计程序的系统调用,跟踪OOM killer,等等,一切尽在掌握之中。BPF和XDP也被用在Cloudflare( https://oreil.ly/OZdmj )和Facebook的负载均衡器( https://oreil.ly/wrM5- )上,用于防御DDoS攻击。XDP在网络过滤数据包方面表现得相当出色,在本书的XDP和网络部分可以了解到更多的信息。
我有幸在Kubernetes社区认识了Lorenzo,他开发的kubectl-trace( https://oreil.ly/Ot7kq )工具可以让用户在Kubernetes集群上轻松地运行定制化的跟踪程序。
就个人而言,我也非常喜欢使用BPF编写定制化的跟踪器,向同事证明他们编写的软件需要进行性能优化,或要求他们减少昂贵的系统调用次数以提升程序性能。不要低估通过数据协助别人进行系统调优的威力。不要担心,本书将会指导你编写第一个跟踪程序,并帮助你进行系统性能优化。BPF之前的工具都是通过使用有损队列,将样本集发送到用户空间进行聚合,而BPF则可以在内核空间直接基于事件源构建直方图和过滤,这种机制非常适用于生产环境。
我职业生涯的一半时间都在从事工具开发。最好的工具是提供自治,开发者可以使用工具提供的接口进行自治,工具的使用场景甚至可能超出工具开发者的设计想法。引用Richard Feynman的话:“我很早就意识到知道事情名字和知道事情本身的区别。”到现在为止,我们应该已经知道了BPF的名字,并了解了BPF能给我们带来帮助。
我喜欢这本书是因为它介绍了使用BPF创建新工具所需掌握的知识。阅读本书并完成练习后,你将拥有使用BPF的超级能力。你可以将BPF放置在工具箱中,在最需要时让其发挥作用。通过本书,你不仅能了解到BPF技术,而且也能学习到BPF的工作原理。本书可以帮你打开思路来探索使用BPF进行各种实践的途径。
这个欣欣向荣的生态系统非常令人兴奋!我希望越来越多的人开始使用BPF,并将BPF的力量变得更加强大。我很乐意了解本书的读者最终会采用BPF构建什么,无论是用来跟踪软件错误、自定义防火墙还是编写红外解码( https://lwn.net/Articles/759188 )的脚本。请让我们知道你如何使用BPF进行构建!
——Jessie Frazelle