本项目提供了一个具有高效率过滤机制的提供内核存储 IO 涉及的 fs、block、driver 层的挂载点,可以高效追踪 bio,request,page等数据结构的 tracing 框架,并且基于该框架开发了 zero-tracer。
zero-tracer 能够追踪 read/write 等 IO 系统调用在内核中各个子模块中的处理流程,并且在 12k read iops 和 250 write iops 环境下能保持小于 5% 的系统 CPU 开销。并且可以用于常态化部署,辅助运维人员定位业务时延抖动,还可以用于分析性能瓶颈以及优化数据通路。
并且,我们把 zero-tracer 拓展到了 qemu/kvm 场景下的 virtio 从 guest 到 qemu 再到 host 的全链路追踪。这加强了 zero-tracer 在虚拟化场景下的实用性。
本项目来自于oscomp-proj133.
文档列表:
可以查看我们的复赛开发文档来了解我们的工作 也可以访问我们的Github页面
本项目基于eBPF 和 Libbpf+CO-RE.如果要编译这个项目,需要
- 支持Libbpf+CO-RE
- 确保你的内核支持BTF
请参考环境配置文档
本项目依赖于 qemu 的头文件,编译脚本默认从本项目根目录下的 qemu 目录下找
如果你需要进行 qemu/kvm 下 virtio 追踪的验证,需要把 src/qemu_uprobe.bpf.c
下的 QEMU_EXE 改成你编译出来的带符号表的 qemu 二进制文件。
$ cd qemu
$ git checkout v6.0.0
$ mkdir build && cd build
$ ../configure
$ make
$ cmake -S . -B build -DWITH_GRAFANA=OFF
$ cd build
$ make
$ sudo ./iotracer -h
如果你要启动grafana,请将下面这个宏添加到src/include/basic_types.h
#define GRAFANA
并在编译时采用如下命令
cmake -S . -B build -DWITH_GRAFANA=ON