在bcc中如何在hello world在线上实现sys_sync功能

在本系列的前一篇文章中我讨論了。然而对于新手来说,eBPF最大的挑战之一是编写程序需要编译并从内核源代码链接到eBPF库内核开发人员可能总是可以获得内核源代码嘚副本,但是对于在生产环境机器或客户机器上工作的工程师来说情况就不一样了。解决这个限制是创建的原因之一该项目包括用于編写、编译和加载eBPF程序的工具链,以及用于调试和诊断性能问题的示例程序和久经考验的工具

自2015年4月发布以来,许多开发人员都研究过BCC項目其中已经一起创建并提供了令人印象深刻的工具集,包括100多个和随时可用的例如,使用的脚本(一种来自DTrace的在用户空间代码中放置哏踪点的机制)用于跟踪、,以及高级语言中的许多流行的应用程序,特别是数据库也有USDT探测,可以通过配置开关(—-enable-dtrace)启用它这些探測,顾名思义会在编译时,被静态地插入到用户应用程序中在不久的将来,我将专门写一篇关于USDT探测的LWN文章

项目文档展示了如何使鼡现有的脚本和工具进行全面的性能调查,而不需要编写一行代码BCC项目库中提供了一个。是由Brendan Gregg撰写的他对BCC和工具补丁的贡献数量排名苐二(在撰写本文时,的贡献数量排名第一)

在BCC中可以使用Python和Lua语言的作为入口进行编程。使用这些高级语言可以编写短小但富有表现力的程序,同时具备C语言所缺少的全部数据操控的优势例如,开发人员可以将eBPF map类比为Python字典并可以直接访问映射内容,这是通过使用BPF帮助函數它在内部实现这个功能。这有助于降低使用eBPF的潜在开发人员的门槛因为他们可以使用处理数据惯用的标准模式。

BCC调用LLVM Clang编译器这个編译器具有BPF后端,可以将C代码转换成eBPF字节码然后,BCC负责使用bpf()系统调用函数将eBPF字节码加载到内核中。如果加载失败例如内核验证器检查失败,则BCC提供有关加载失败原因的提示如,“提示:如果在没有首先检查指针是否为空的情况下从map查找中取消引用指针值,可能就會出现The 'map_value_or_null'”这是创建BCC的另一个动机——因为很难写出明显正确的BPF程序;当你犯了错误时,BCC会通知你

为了演示如何快速地开始使用BCC,下面是來自BCC项目的(译者注:必须使用root权限执行)每次运行系统函数clone()时,它都会打印到跟踪缓冲区中我稍微修改了一下格式,以便于阅读

World!”到內核的跟踪缓冲区中。

以前比较繁琐的任务是将程序编译为eBPF字节码,并将其加载到内核现在完全只需通过实例化一个新的BPF对象就可以處理。所有低层次的工作都是在幕后完成的就Python bindings和BCC的libbpf库中。

函数BPF.trace_print()对内核的跟踪缓冲区文件执行阻塞读取并将内容打印到标准输出中。这昰输出内容:

输出内容格式说明如下:

  • kprobe触发时正在运行的应用程序名称
  • 运行在哪个CPU核心上(在[]里面)

World!”字符串倒数第二个字段包含0x这个哋址。通常情况下当内核代码写入跟踪缓冲区时,系统指令trace_printk()被调用后这个指令的指针地址将打印在该字段中。不幸的是并没有为bpf_trace_printk()这個系统函数实现这个情况,所以总是使用硬编码的地址0x

译者注: 为了更方便大家动手操作,提供了vagrant虚拟机环境已安装bcc工具集合。 下载方式如下所示:链接: 提取码: qvhc 使用方式如下所示:

这个文件将探针(uprobe、kprobe、tracepoint或USDT)插入到给定的函数中,该函数可以位于内核中也可以位于用户空間代码中。当探针被触发时argdist.py会打印函数的参数值,以计数器或直方图的形式显示它会一直运行,直到被用户中断例如,下面的命令輸出调用irq_handler_entry()的次数以及引发中断的次数。

由于histogram选项(-H)使用桶将多个中断分组在一起所以在这种情况下,它不如count选项(-C)有用但是,直方图输絀很有帮助的一个场景是使用工具,该工具将Btrfs的读、写、打开和fsync操作的延迟汇总到power-of-two桶中。

这是对bbc的简短介绍在下一篇文章中,我们將探索一些更复杂的主题比如如何访问eBPF数据结构,如何配置eBPF程序的编译方式以及如何调试程序,所有这些都使用Python语言作为入口

我要回帖

更多关于 hello world在线 的文章

 

随机推荐