基于eBPF的云原生可观测性开源项目Kindling之慢系统调用

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
可观测监控 Prometheus 版,每月50GB免费额度
简介: Kindling通过eBPF技术和内核提供的系统调用tracepoint捕获了所有的系统调用数据,然后把系统调用与线程信息做了关联,并在用户空间对系统调用的enter和exit进行了latency的计算以判断是否为慢系统调用。

【视频回放】Kindling之慢系统调用

背景

系统调用是内核提供给用户的功能接口,在我们的系统中,通常会运行许多系统调用,其中有很多系统调用是由我们的用户程序来触发的(比如C语言中的printf()函数,实际会触发底层的write()系统调用)。在绝大多数情况下,系统调用可以在很短的时间内执行完成并且返回,但是在某些情况下, 系统调用可能会执行的比较慢,从而成为我们进程运行时的瓶颈。

对于这些执行较慢的系统调用我们可以分为两类,一类是在一定时间内执行完成,但是执行时间过长的系统调用,我们可以称之为慢系统调用;另一类是在一定时间内一直未返回的系统调用,我们称之为超时系统调用。在Kindling中,我们实现了对于这两类系统调用的捕获和分析,并将其报告给上层用户,以便用户洞察系统调用的情况。

实现原理

内核空间eBPF捕获系统调用

首先,我们可以使用eBPF技术通过内核提供的rawsyscalls目录下的tracepoint来捕获所有系统调用的入口和出口(sysenter对应系统调用的入口,sysexit对应系统调用的出口),可在`/sys/kernel/debug/tracing/events/rawsyscalls/`中看到该tracepoint的具体信息。

1.png

图1 sys_enter tracepoint的format信息

我们通过该tracepoint捕获所有系统调用,并将每一个系统调用关联到具体的线程上,发送至用户空间进行进一步处理。

用户空间关联系统调用时间信息

慢系统调用

对于一个系统调用而言,它有一个enter和一个exit(所有系统调用都只有一个trap,不会出现堆栈序列的enter和exit),我们可以在系统调用enter时获取当前时间戳,然后在exit时再获取当前时间戳,此时两个时间戳的差值就是该系统调用的实际执行时长,在Kindling中,我们将该值称为一个慢系统调用的latency。

2.png

图2 慢系统调用实现示意

超时系统调用

对于超时的系统调用,它们在一段时间范围内并未返回,因此我们无法获取到系统调用的exit信息,目前kindling采取的策略是维护一个以tid为key,syscall信息为value的map,当有系统调用进入时,在map做一次标记,然后我们会定时去扫描这个map,如果发现map中有超时的系统调用则立即将该系统调用标记为超时系统调用。

3.png

图3 超时系统调用实现示意

demo测试

这里我们写一个简单的demo来测试一下我们所捕获到的慢系统调用 ,我们写一个最简单的调用nanosleep()系统调用的例子,让进程睡眠3秒钟,我们可以在运行的Kindling输出日志中看到捕获到的信息:

4.png

5.png

我们可以看到,Kindling捕获到了该系统调用,并给出了其类型,执行时长以及TID、PID等具体信息。

总结

首先,我们通过eBPF技术和内核提供的系统调用tracepoint捕获了所有的系统调用数据,然后把系统调用与线程信息做了关联,然后我们在用户空间对系统调用的enter和exit进行了latency的计算以判断是否为慢系统调用,特别的是,对于那些超时的系统调用,我们无法直接计算latency,采取了使用map标记系统调用入口并定时扫描map的策略,从而完成对于超时系统调用的捕获。


Kindling是一款基于eBPF的云原生可观测性开源工具,旨在帮助用户更好更快的定界云原生系统问题,并致力于打造云原生全故障域的定界能力。

Kindling项目地址:Kindling

在云可观测性方面有任何疑问欢迎与我们联系:Kindling官网

目录
相关文章
|
4月前
|
监控 Cloud Native 网络协议
|
1月前
|
Kubernetes 监控 Cloud Native
eBPF技术大揭秘:一张全景图彻底改变Kubernetes问题排查,助你成为云原生时代的超级英雄!
【8月更文挑战第8天】在云原生时代,Kubernetes作为容器编排的标准,其问题排查变得日益复杂。eBPF技术无需改动内核即可编写高效、安全的内核程序,实现系统细粒度观测与控制。近期发布的基于eBPF的Kubernetes问题排查全景图,展示了如何利用eBPF监控资源使用、网络性能及调度策略等,例如通过eBPF程序监控CPU使用率。此全景图有助于快速定位如高CPU使用率等问题所在Pod,进而优化配置或调整调度。
69 8
|
4月前
|
Kubernetes 监控 Cloud Native
全栈声明式可观测:KubeVela开箱即用且灵活定制的云原生应用洞察
KubeVela 是一个开箱即用的现代化应用交付与管理平台。本文我们将聚焦 KubeVela 的可观测体系,介绍云原生时代的可观测挑战及 KubeVela 的解决方案。
110 0
|
2月前
|
存储 监控 Cloud Native
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
|
3月前
|
弹性计算 监控 Cloud Native
构建多模态模型,生成主机观测指标,欢迎来战丨2024天池云原生编程挑战赛
本次比赛旨在如何通过分析 ECS 性能数据和任务信息,综合利用深度学习、序列分析等先进技术,生成特定机器的性能指标。参赛者的解决方案将为云资源管理和优化决策提供重要参考,助力云计算资源的高效稳定运行和智能化调度。
628 12
|
3月前
|
人工智能 监控 Cloud Native
多款可观测产品全面升级丨阿里云云原生 5 月产品月报
多款可观测产品全面升级丨阿里云云原生 5 月产品月报。
|
4月前
|
自然语言处理 监控 Cloud Native
对话阿里云云原生产品负责人李国强:推进可观测产品与OpenTelemetry开源生态全面融合
阿里云宣布多款可观测产品全面升级,其中,应用实时监控服务 ARMS 在业内率先推进了与 OpenTelemetry 开源生态的全面融合,极大丰富了可观测的数据类型及规模,大幅增强了 ARMS 核心能力。本次阿里云 ARMS 产品全面升级的背景是什么?为什么会产生围绕 OpenTelemetry 进行产品演进的核心策略?在云原生、大模型等新型应用架构类型层出不穷的今天,又将如何为企业解决新的挑战?阿里云云原生应用平台产品负责人李国强接受采访解答了这些疑问,点击本文走进全新升级的阿里云可观测产品。
41970 11
|
4月前
|
Java Serverless Apache
9 个开源项目、25 个课题可选丨欢迎报名阿里云云原生开源之夏
2024 开源之夏,阿里云云原生应用平台团队开放了包括 Apache Dubbo/Apache RocketMQ/Apache Seata/Higress/iLogtail /Nacos/Sentinel/Spring Could Alibaba / Serverless Devs 在内,涉及微服务、消息、可观测、Serverless 4 大技术领域的 9 个开源项目。
1232 4
|
4月前
|
存储 Prometheus 运维
【阿里云云原生专栏】云原生下的可观测性:阿里云 ARMS 与 Prometheus 集成实践
【5月更文挑战第25天】阿里云ARMS与Prometheus集成,为云原生环境的可观测性提供强大解决方案。通过集成,二者能提供全面精准的应用监控,统一管理及高效告警,助力运维人员及时应对异常。集成示例代码展示配置方式,但需注意数据准确性、监控规划等问题。这种集成将在云原生时代发挥关键作用,不断进化以优化用户体验,推动业务稳定发展。
192 0
|
4月前
|
人工智能 运维 监控
「云原生可观测团队」获选「InfoQ 年度技术内容贡献奖」
「云原生可观测团队」获选「InfoQ 年度技术内容贡献奖」
1177 5