揭秘基于 eBPF 实现对应用网络数据监控背后的逻辑 | 龙蜥技术

简介: 从系统调用聊聊应用可观测。

vcg_VCG211250077426_RF.jpg

文/龙蜥社区 eBPF 技术探索 SIG


随着 eBPF 技术的广泛应用,在操作系统层面提供了更多的观测能力,站在操作系统层面对应用的行为数据进行 trace 追踪成了一种应用监控的新手段,本文主要介绍基于 eBPF 实现对应用网络数据监控的背后逻辑。


一、一个请求数据包的组成

一个完整的应用请求数据包主要包含请求地址信息及具体的请求数据。其中请求地址信息就是我们常说的五元组信息(IP+端口+协议),这部分都是操作系统协议栈负责去解析;而请求数据则由应用通过各种协议去封装并解析,常见的应用协议有:http、mysql、rediis、dns 等。

640 (3).png

应用每一个请求数据的接受与发送都是通过网络相关的系统调用与操作系统交互,如果请求报文没有加密,那么在系统调用处做一个拦截通过函数入参就能轻而易举的拿到应用协议数据。当下热门的应用可观测都是基于此方法对应用网络数据进行trace,包括:时延、流量统计、协议等。


二、基于系统调用的请求追踪

2.1 网络请求模型

一个应用进程基于系统调用的网络请求模型如下(这里仅介绍客户端):

  • 通过 socket 去建立套接字,获得一个 fd 作为 socket 的标识。
  • 通过 connect 填写 IP 端口信息发起请求连接。
  • 通过read/write请求/接收具体数据,除了read/write系统调用还有
  • send/recvfrom,readv/writev 等可用。
  • 通过 close 结束本次请求。  

640 (4).png

通过上面的流程图我们大概了解了一次完整网络请求的系统调用逻辑。有几点需要注意:


对于单个建链完成的请求而言,其发送数据和接收数据往往是串行的,或者说一个 write 必然匹配一个 read,因此我们才能统计到 RT 时间,而 read/write 的返回字节数就可以作为我们的流量统计。


write/read 如何配对,对于客户端而言,是先 write 再 read,常用的做法是通过进程 pid 和 socket fd 作为配对标识,实现 write/read 这一次完整请求数据的配对。


2.2 系统调用追踪

eBPF 技术可以在不改变内核源码或加载内核模块情况下在内核插入指定 hook 代码,能在内核或应用程序执行到一个特定的 hook 点时执行。预定义的 hooks 包含系统调用、 函数出/入口、内核追踪点、网络事件等等。

640 (5).png

有了 eBPF 做系统调用的 hook 以后,系统调用的事件采集对于我们来说变得格外方便,只不过我们需要注意下哪些事件需要上报及请求数据上报以后的匹配策略。同时对于获取请求数据是有一些讲究,对于 write 发送数据而言在系统调用函数入口直接获取入参就可以获取数据,但是对于 read 读取数据而言我们需要在系统调用函数的出口做 hook 去拿数据。


上文中提到 pid+fd 作为 traceid 作为请求的唯一标志,有如下两种方法可以实现:


方法1:当有 connect 的时候先在 BPF map 中记录下这个 traceid,表示有一个新的请求建立,后续的 read/write 请求数据都是以此为配对。不过在 http 长连接场景下,connect 发起可能在我们 trace 之前,所以只能通过 netlink 等其他方式来获取链接信息。

640 (6).png

方法2:实际上我们关心的只是 read/write 的请求数据及如何配对,是否可以仅根据 fd 获取连接信息?BPF 程序可以拿到当前进程的 task_struct,根据 fd 可以拿到对应的 sock 结构体,sock 结构体中记录了请求地址信息。

640 (7).png

除此之外就是 BPF 框架的技术选型,我们采用了 Coolbpf 开发,通过对 libbpf 的改进,在具备 core 特性的同时提供了更简洁的 API 接口,exporter 程序可以直接以 so 的形式加载代码。以上只是网络请求事件采集的最小单元,借助 exporter 的其他能力,可以获得更丰富的数据指标:错误数、时延、进程级流量统计等。

三、应用协议识别

在系统调用层面只能识别到 4 层网络协议,对于应用的 7 层协议无法识别,实际上是在 hook 系统调用拿到 buf 参数后,对 buf 的头部几个字节做协议头解析,目前支持的协议有:http、mysql、kafak、dns、mongo、pgsql、dubbo。对于 https 等加密报文可以通过 uprobe 的方式对 ssl 加密库做 hook,后续会支持这部分功能。

四、部署

我们在日常值班问题中也有碰到各种网络抖动时延问题,因此我们将此部分功能放在了 SysOM 智能诊断平台的 agent 中,可以通过容器一键部署,并在 grafana 中查看对应的时延分布及具体的时延请求信息。

640 (8).png

同时我们与 sls 合作,也将此部分内核采集的能力输出给了 iLogtail。

五、what's more

除了上文提到的基于系统调用的应用观测,对于应用由于自身原因收包缓慢造成网络“假抖动”的情况,我们基于 Coolbpf 也做了相关观测实践。一个完整的收包流程主要分为两个阶段:

阶段1:OS 通过软中断将数据包上送到应用的收包队列并通知进程后就算完成了协议栈的收包工作。

阶段2:应用得到通知后去收报队列取包。

640 (9).png

这两个阶段可以认为是异步的,我们将数据包到达收包队列到应用完成取包这段时间作为应用的"收包延迟时间"进行观测,基于此方法在网络抖动问题定位中得到了极大帮助。

案例1 某业务应用基于 dubbo 框架容器收到 tcp 包后延迟了将近 1s 业务层才收到

部署 SysOM agent 对“收包延迟时间”进行观测,发现"收包延迟时间"将近 1 秒,右侧红框部分为时间,单位为纳秒,结合左侧红框每次发生延迟时间都在某某时间 42 秒,怀疑跟业务某定时任务相关造成应用自身时延,最终排查到业务有某个任务会定时收集 jvm 的参数,对应用有 stop 动作,停掉该任务后消除了抖动问题。

640 (10).png

案例2 业务高峰期,客户端 rpc 耗时比服务端多 20-30ms

业务监控如下:

640 (11).png

部署 SysOM agent 对“收包延迟时间”进行观测,发现对应时间段存在应用“收包延迟时间”较大,因此首先排除了网络链路问题。红框部分为时间,单位为纳秒,图中时间需要加上 8 小时。

640 (12).png

根据时序对比发现是由于此时间段应用在做 GC 导致,最后通过调整 GC 参数解决。

640 (13).png

六、总结

以上是基于 Coolbpf 在可观测性的相关实践,相关功能都集成在了 SysOM 的 agent 中,后续会引入更多对应用观测的功能。当应用日志无法解决问题或者没有日志的情况下,利用 eBPF 技术在 OS 层面对应用行为逻辑的观测,在定位某些应用的疑难问题时有着极大帮助。


参考链接:

eBPF 介绍链接地址:

https://www.rutron.net/posts/2203/what-is-ebpf/

coolbpf gitee 代码仓链接地址:

https://gitee.com/anolis/coolbpf

ebpf内核文档链接地址:

https://www.kernel.org/doc/html/latest/bpf/index.html

龙蜥实验室 coolbpf 链接地址:

https://lab.openanolis.cn/#/apply/chapters?courseId=94


—— 完 ——

加入龙蜥社群

加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!

640 (14).png

关于龙蜥社区

龙蜥社区(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

相关文章
|
9月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
11月前
|
监控 安全 Shell
管道符在渗透测试与网络安全中的全面应用指南
管道符是渗透测试与网络安全中的关键工具,既可用于高效系统管理,也可能被攻击者利用实施命令注入、权限提升、数据外泄等攻击。本文全面解析管道符的基础原理、实战应用与防御策略,涵盖Windows与Linux系统差异、攻击技术示例及检测手段,帮助安全人员掌握其利用方式与防护措施,提升系统安全性。
469 6
|
10月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
667 0
|
11月前
|
机器学习/深度学习 数据采集 传感器
【故障诊断】基于matlab BP神经网络电机数据特征提取与故障诊断研究(Matlab代码实现)
【故障诊断】基于matlab BP神经网络电机数据特征提取与故障诊断研究(Matlab代码实现)
323 0
|
9月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
372 4
|
10月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
822 11
|
9月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
356 0
|
10月前
|
传感器 数据采集 存储
【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)
【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)
350 0
|
10月前
|
机器学习/深度学习 数据采集 运维
改进的遗传算法优化的BP神经网络用于电厂数据的异常检测和故障诊断
改进的遗传算法优化的BP神经网络用于电厂数据的异常检测和故障诊断
|
11月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
573 0