基于 Coolbpf 的应用可观测实践 | 龙蜥技术
文/ eBPF 技术探索 SIG
一、一个请求数据包的组成
应用每一个请求数据的接受与发送都是通过网络相关的系统调用与操作系统交互,如果请求报文没有加密,那么在系统调用处做一个拦截通过函数入参就能轻而易举的拿到应用协议数据。当下热门的应用可观测都是基于此方法对应用网络数据进行trace,包括:时延、流量统计、协议等。
二、基于系统调用的请求追踪
2.1 网络请求模型
通过 socket 去建立套接字,获得一个 fd 作为 socket 的标识。
通过 connect 填写 IP 端口信息发起请求连接。
通过read/write请求/接收具体数据,除了read/write系统调用还有send/recvfrom,readv/writev 等可用。
通过 close 结束本次请求。
通过上面的流程图我们大概了解了一次完整网络请求的系统调用逻辑。有几点需要注意:
对于单个建链完成的请求而言,其发送数据和接收数据往往是串行的,或者说一个 write 必然匹配一个 read,因此我们才能统计到 RT 时间,而 read/write 的返回字节数就可以作为我们的流量统计。
write/read 如何配对,对于客户端而言,是先 write 再 read,常用的做法是通过进程 pid 和 socket fd 作为配对标识,实现 write/read 这一次完整请求数据的配对。
三、应用协议识别
四、部署
五、what's more
除了上文提到的基于系统调用的应用观测,对于应用由于自身原因收包缓慢造成网络“假抖动”的情况,我们基于 Coolbpf 也做了相关观测实践。一个完整的收包流程主要分为两个阶段:
阶段1:OS 通过软中断将数据包上送到应用的收包队列并通知进程后就算完成了协议栈的收包工作。
阶段2:应用得到通知后去收报队列取包。
六、总结
参考链接:
eBPF 介绍链接地址:
https://www.rutron.net/posts/2203/what-is-ebpf/coolbpf gitee 代码仓链接地址:https://gitee.com/anolis/coolbpfebpf内核文档链接地址:https://www.kernel.org/doc/html/latest/bpf/index.html
龙蜥实验室 coolbpf 链接地址:https://lab.openanolis.cn/#/apply/chapters?courseId=94
加入龙蜥社群
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!
关于龙蜥社区
龙蜥社区(OpenAnolis)是由企业单位、事业单位、社会团体、个人等在共建、共治、共享的基础上组成的非营利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开放、平等、协作、创新的 Linux 上游发行版社区及创新平台。
龙蜥社区成立的短期目标是开发龙蜥操作系统(Anolis OS)作为 CentOS 停服后的应对方案,构建一个兼容国际 Linux 主流厂商的社区发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。目前,Anolis OS 8.6 已发布,更多龙蜥自研特性,支持 X86_64 、RISC-V、Arm64、LoongArch 架构,完善适配 Intel、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密和机密计算支持。欢迎下载:https://openanolis.cn/download加入我们,一起打造面向未来的开源操作系统!https://openanolis.cn往期精彩推荐1.技术解读:现代化工具链在大规模 C++ 项目中的运用 | 龙蜥技术
3.开放算力,云启未来!与龙蜥一起开启 2022 云栖大会之旅