38 lines
6.5 KiB
Markdown
38 lines
6.5 KiB
Markdown
|
# 用户故事|eBPF从入门到放弃?在实践中找到突破口
|
|||
|
|
|||
|
你好,我是小李同学,坐标深圳,是一名嵌入式开发工程师,已经工作 4 年了,目前主要从事维护系统稳定性的相关工作。今天我主要想跟你分享下我学习 eBPF 的“心路历程”,以及在这门课中的一些收获。
|
|||
|
|
|||
|
## 多次试图“入门”,始终不得其法
|
|||
|
|
|||
|
我最早接触到 eBPF 是在一篇公众号文章上,上面介绍说它是内核调试的一把利器。当时我就想了:这不是跟我平时的工作联系很密切吗?在调试死机、分析代码路径的时候应该都能用到!eBPF 的强大功能让我很激动,当时就想上手试试,看看能不能把这门技术用起来。
|
|||
|
|
|||
|
想象很美好,但是真正开始学习的时候却发现有些棘手。我先是找了一堆资料。关于eBPF 的资料网上倒是有很多,但是不够系统,很多资料讲解也不够细致深入,总觉着看起来不太明白。特别是有一些文章,上来直接把整个 ebpf 的原理图一贴,然后就直接懵了。
|
|||
|
|
|||
|
我当时想,既然看原理看不懂,那就先跑起来看看吧!我尝试了下大家说的一些适合入门的 eBPF 工具集,结果发现它们都是基于服务器使用的。而我的工作环境基本都是嵌入式平台,像 BCC 这样的工具集没法直接使用。自己折腾了下,环境没有搭建起来,第一次的尝试“入门”就这么宣告失败了。
|
|||
|
|
|||
|
再次看到 eBPF,是见有人推荐《BPF 之巅》和《Linux 内核观测技术 BPF》这两本书。推荐的同学说自己收获很大,我就第一时间下单了,希望能从书中找到进入 eBPF 世界的法门。
|
|||
|
|
|||
|
这次呢,不自己折腾开发环境了,直接照着书上说的,依葫芦画瓢地在 Ubuntu 虚拟机上运行 BPF 工具。简单执行一些命令就可以得到一些内核参数,刚开始还觉得挺有趣,跟了几个章节之后就觉得索然无味。因为在正常系统上无非是看一看参数,没有深入的理解,再加上我平时的工作中没有使用 eBPF 的场景,也就没有什么正反馈和长期坚持的动力。就这样,想起来了才玩玩看,想不起来或者比较忙的时候就搁置,过了一段时间,这次的尝试也就不了了之了。
|
|||
|
|
|||
|
虽然前两次的尝试入门都失败了,但我还是觉得不甘心:既然是一门技术,怎么能搞不会呢?相信自己应该是可以掌握它的,只是还没有找到合适的学习方法和关键的突破口。
|
|||
|
|
|||
|
这时,我刚好发现极客时间出了 eBPF 的课程,而且还是倪朋飞老师讲的。我是倪老师第一季专栏[《Linux性能优化实战》](https://time.geekbang.org/column/intro/100020901)的老用户,在那门课里收获很大。于是我瞬间来了兴趣,第一时间订阅了这个专栏,希望这次能跟着倪老师走进 eBPF 的世界。
|
|||
|
|
|||
|
## 反复折腾,找到一个突破口
|
|||
|
|
|||
|
就这样,我开始了第三次“eBPF入门”尝试。跟着倪老师的课程,一步步地从搭建环境到原理剖析,再到实战应用,这比自己折腾要系统得多。因为有了大佬的指导,这次我也少走了很多弯路。
|
|||
|
|
|||
|
比如,之前我自己折腾的时候踩过一个坑:一看到不懂的就去网上查,有时候一查就发现了更多不理解的地方,往往越查越乱,最后陷入一个“泥塘”中。而在这门课里,倪老师为我们指出了哪些是可以暂时不用深究的,这就让我得以快速掌握最重要的核心原理,而避免陷入一些细节中。
|
|||
|
|
|||
|
再说说我最近的学习体会吧。在反复“折腾”的过程中,有时看上去是失败了,但实际上是自己实实在在地踩过了一次坑,为以后的实践积累了经验。至少呢,也能说明“此路不通”。我在运行 eBPF 程序的时候,有时遇到编译问题,有时又遇到跑不起来的问题。但正是在这个不断踩坑又不断地去修复、实践的尝试过程中,往往在某个点上就找到突破口了。总之,学 eBPF 这种实践性很强的技术,就得“折腾”,要多实践、多思考。
|
|||
|
|
|||
|
比如,我第一次看到 BCC、bpftrace、libbpf 等概念的时候,根本搞不清楚它们都是啥东东。经历过之前的自行研究后,我准备先跟着课程把它们用起来。基于 bpftrace、BCC 进行编程,简单地把它们当作一套工具链,将代码转换成对应的格式,然后交给内核处理,我们就可以获取到想要的信息。而对于代码格式和里面的函数,刚开始可以先记下来,先不管是什么原理,记住是怎么用的就行。实际上,在专栏的 [07](https://time.geekbang.org/column/article/484207)、[08](https://time.geekbang.org/column/article/484372) 两讲中,倪老师已经详细介绍了如何使用 BCC、bpftrace、libbpf 三种方式开发跟踪函数,掌握了这些实践应用,我们也就搞清楚了它们之间的关系。我想,这就是倪老师在这门课里一直强调,要在实践中加深对 eBPF 原理理解的原因吧!
|
|||
|
|
|||
|
从开始学这门课的时候,我就希望能够把 eBPF 用在实际工作中。遗憾的是,我平时的工作环境都是在嵌入式系统中,没有 LLVM、Python 等环境,所以 BCC 和 bpftrace 是没法玩了。只能是使用 libbpf 编程方式,但课程中的 libbpf 例子是跑在宿主机上的,似乎也不能用。
|
|||
|
|
|||
|
我找了一堆资料后发现,要想在嵌入式系统中跑起来,需要交叉编译生成 libbpf.a,而 libbpf.a 又依赖于 zlib 和 elfutils 两个库。一通折腾之后,我终于生成了 libbpf.a,最后在嵌入式系统中把 “hello world” eBPF 程序跑起来了。基于 libbpf.a,我们又可以对 Linux 内核 tools/bpf/bpftool 进行编译,生成 bpftool,这样在嵌入式系统中也可以使用。
|
|||
|
|
|||
|
总之,在学习 eBPF 的道路上,只要找对方向,并且踏出了第一步,就可以慢慢地走下去。这个过程需要自己不断地去折腾、实践。对于课程中讲到的知识点,最好是要能用起来,所以我之前是用 ftrace 的,现在试着改成使用 eBPF 来获取一些内核信息等等。只要从一个小的突破点开始,不断地获取正反馈,就有更大的动力和兴趣走下去了。
|
|||
|
|
|||
|
最后要说的是:感谢倪老师,这次总算是入门了。现在我已经能自己进行一些简单的开发,后面需要的就是不断进行实践了。期待倪老师在动态更新阶段的精彩内容,也感谢极客时间,提供一个良好的学习平台。
|
|||
|
|