当前位置: 首页 > article >正文

eBPF可观测性实战

eBPF 可观测性实战:Linux 内核级追踪与性能分析完全指南🔬 eBPF 是 Linux 内核中最强大的可观测性技术——它能让你在不修改内核代码、不重启系统的情况下,安全地在内核中运行自定义程序。本文从零开始,带你掌握 eBPF 追踪与性能分析。📌 前言当你的服务出现以下问题时,传统工具往往力不从心:偶发性延迟毛刺:Prometheus 看不到,日志里也没有内核层面的性能瓶颈:CPU profiling 只能看到用户态网络丢包:tcpdump 抓不到,因为发生在内核协议栈深处安全审计:需要追踪所有进程的文件访问行为eBPF 就是解决这些问题的「手术刀」——它让你能安全地在 Linux 内核中运行自定义代码,实时观测系统行为。一、eBPF 是什么?1.1 从 BPF 到 eBPF 的演进时间线: 1992 ─── BPF (Berkeley Packet Filter) │ 最初用于网络包过滤 │ 只有 2 个寄存器,32 位指令 │ 2014 ─── eBPF (extended BPF) │ 引入 Linux 3.18 内核 │ 64 位指令,11 个寄存器 │ 支持尾调用、map 数据结构 │ JIT 编译为原生机器码 │ 2016 ─── BCC / bpftrace 等工具诞生 │ 大幅降低使用门槛 │ 2023 ─── CO-RE (Compile Once – Run Everywhere) │ 一次编译,跨内核版本运行 │ 2025 ─── eBPF 无处不在 Kubernetes CNI (Cilium)、安全监控 (Tetragon) 网络可观测性 (Pixie)、应用性能监控1.2 eBPF 架构概览┌─────────────────────────────────────────────────────┐ │ 用户空间 │ │ ┌─────────┐ ┌─────────┐ ┌─────────────────┐ │ │ │ bpftrace│ │ BCC │ │ 你自己的程序 │ │ │ │ (脚本) │ │ (Python)│ │ (Go/Rust/C) │ │ │ └────┬─────┘ └────┬────┘ └───────┬─────────┘ │ │ │ │ │ │ │ └─────────────┼───────────────┘ │ │ │ bpf() 系统调用 │ ├─────────────────────┼───────────────────────────────┤ │ ▼ 内核空间 │ │ ┌──────────────────────────────────────────────┐ │ │ │ eBPF Verifier │ │ │ │ • 静态分析:确保程序安全终止(不会死循环) │ │ │ │ • 内存安全:验证所有内存访问合法 │ │ │ │ • 权限检查:验证程序只能访问允许的内核数据 │ │ │ └──────────────────────┬───────────────────────┘ │ │ ▼ │ │ ┌──────────────────────────────────────────────┐ │ │ │ JIT Compiler │ │ │ │ 将 eBPF 字节码编译为原生 x86_64/ARM64 指令 │ │ │ └──────────────────────┬───────────────────────┘ │ │ ▼ │ │ ┌──────────────────────────────────────────────┐ │ │ │ eBPF 程序挂载点 │ │ │ │ • kprobe/kretprobe (内核函数入口/返回) │ │ │ │ • tracepoint (内核静态追踪点) │ │ │ │ • uprobe/uretprobe (用户态函数入口/返回) │ │ │ │ • XDP (网络数据包入口) │ │ │ │ • TC (流量控制) │ │ │ │ • LSM (Linux安全模块) │ │ │ └──────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘1.3 eBPF 程序类型程序类型用途挂载点BPF_PROG_TYPE_TRACEPOINT内核静态追踪tracepointBPF_PROG_TYPE_KPROBE内核函数动态追踪kprobeBPF_PROG_TYPE_XDP高性能网络包处理网络驱动层BPF_PROG_TYPE_SOCKET_FILTERSocket 包过滤socketBPF_PROG_TYPE_CGROUP_SKBcgroup 网络控制cgroupBPF_PROG_TYPE_LSMLinux 安全模块LSM hookBPF_PROG_TYPE_PERF_EVENT性能事件采集perf二、开发环境搭建2.1 内核版本检查# eBPF 需要 Linux 5.4+ 以支持 CO-REuname-r# 输出示例: 5.15.0-91-generic# 检查 eBPF 支持ls/sys/kernel/debug/tracing/2/dev/nullecho"✅ tracing 支持"||echo"❌ 需要挂载 tracefs"cat/proc/config.gz|gunzip|grepCONFIG_BPF2.2 安装工具链# Ubuntu/Debiansudoaptupdatesudoaptinstall-y\clang llvm libbpf-dev libbpfcc-dev\linux-tools-common linux-tools-generic\bpfcc-tools linux-headers-$(uname-r)# 安装 bpftrace(高级脚本工具)sudoaptinstall-ybpftrace# 安装 bpftool(eBPF 程序管理)sudoaptinstall-ylinux-tools-common bpftool version2.3 验证安装# 编译并运行第一个 eBPF 程序sudobpftrace-e'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args-filename)); }'# 打开另一个终端执行任意命令,观察输出cat/etc/hostname# 预期输出: cat /etc/hostname三、BCC 入门:用 Python 写 eBPF 程序BCC(BPF Compiler Collection)是最流行的 eBPF 开发框架,用 Python 作为用户态接口。3.1 第一个 BCC 程序:追踪 open() 系统调用#!/usr/bin/env python3"""trace_open.py - 追踪所有 open() 系统调用"""frombccimportBPF# eBPF C 程序(运行在内核中)bpf_program=r""" #include uapi/linux/ptrace.h #include linux/sched.h // 定义输出事件结构体 struct event_t { u32 pid; u32 uid; char comm[TASK_COMM_LEN]; char filename[256]; }; // 定义 perf event 输出通道 BPF_PERF_OUTPUT(events); // 追踪 sys_enter_openat 内核追踪点 TRACEPOINT_PROBE(syscalls, sys_enter_openat) { struct event_t evt = {}; // 获取进程信息 evt.pid = bpf_get_current_pid_tgid() 32; evt.uid = bpf_get_current_uid_gid(); bpf_get_current_comm(evt.comm, sizeof(evt.comm)); // 从追踪点参数中获取文件名 bpf_probe_read_user_str(evt.filename, sizeof(evt.filename), args-filename); // 通过 perf event 输出到用户空间 events.perf_submit(args, evt, sizeof(evt)); return 0; } """# 加载并编译 eBPF 程序b=BPF(text=bpf_program)# 打印表头print(f"{'TIME':12}{'PID':8}{'UID':8}{'COMM':16}{'FILENAME'}")print("-"*80)# 定义 perf event 回调defprint_event(cpu,data,size):event=b["events"].event(data)filename=event.filename.decode("utf-8","replace")comm=event.comm.decode("utf-8","replace")print(f"{event.pid:8}{event.uid:8}{comm:16}{filename}")# 注册回调并开始读取b["events"].open_perf_buffer(print_event)print("Tracing open() calls... Ctrl-C to end.")whileTrue:try:b.perf_buffer_poll()exceptKeyboardInterrupt:exit()运行:sudopython3 trace_open.py3.2 用 BCC 追踪 TCP 连接延迟#!/usr/bin/env python3"""tcp_latency.py - 测量 TCP 连接的 RTT"""frombccimportBPFfromtimeimportsleep bpf_program=r""" #include uapi/linux/ptrace.h #include net/sock.h #include linux/tcp.h // 存储 TCP 连接信息 struct tcp_event_t { u32 pid; u32 saddr; u32 daddr; u16 sport; u16 dport; u32 rtt_us; // RTT(微秒) char comm[16]; }; BPF_PERF_OUTPUT(tcp_events); // 在 tcp_rcv_established 上挂载 kprobe int kprobe__tcp_rcv_established(struct pt_regs *ctx, struct sock *sk) { struct tcp_event_t evt = {}; struct tcp_sock *tp = (struct tcp_sock *)sk; // 获取 RTT(单位:微秒) evt.rtt_us = tp-srtt_us 3; // srtt_us 是 8 倍 RTT // 只报告 RTT 10ms 的连接 if (evt.rtt_us 10000) return 0; // 获取进程信息 evt.pid = bpf_get_current_pid_tgid() 32; bpf_get_current_comm(evt.comm, sizeof(evt.comm)); // 获取连接信息 bpf_probe_read_kernel(evt.saddr, sizeof(evt.saddr), sk-__sk_common.skc_rcv_saddr); bpf_probe_read_kernel(evt.daddr, sizeof(evt.daddr), sk-__sk_common.skc_daddr); bpf_probe_read_kernel(evt.sport, sizeof(evt.sport), sk-__sk_common.skc_num); bpf_probe_read_kernel(evt.dport, sizeof(evt.dport), sk-__sk_common.skc_dport); tcp_events.perf_submit(ctx, evt, sizeof(evt)); return 0; } """b=BPF(text=bpf_program

相关文章:

eBPF可观测性实战

eBPF 可观测性实战:Linux 内核级追踪与性能分析完全指南 🔬 eBPF 是 Linux 内核中最强大的可观测性技术——它能让你在不修改内核代码、不重启系统的情况下,安全地在内核中运行自定义程序。本文从零开始,带你掌握 eBPF 追踪与性能分析。 📌 前言 当你的服务出现以下问题…...

从智能手表到无障碍服务:深入理解Android NotificationListenerService的5种应用场景

从智能手表到无障碍服务:深入理解Android NotificationListenerService的5种应用场景 在移动设备功能日益丰富的今天,系统通知已经成为连接用户与应用的重要桥梁。而作为Android开发者,NotificationListenerService这一系统级API为我们打开了…...

Rust所有权与生命周期深度解析

Rust 所有权与生命周期深度解析:从编译器视角理解内存安全 🦀 Rust 的所有权系统是其最核心的创新——它在编译期消除了一整类内存安全 bug,零运行时开销。本文从编译器内部视角出发,带你彻底搞懂所有权、借用、生命周期的工作原理。 📌 前言 如果你是从 C/C++ 转来的开…...

我很笨--学习PG Vector--我开始研究HNSW的减少内存占用--要不你也试试!!系列 5)

❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3400人左右 …...

ARM PMU性能监控单元与PMCEID2寄存器详解

1. ARM PMU性能监控单元基础解析性能监控单元(Performance Monitoring Unit, PMU)是现代处理器架构中用于硬件级性能分析的核心组件。在ARM架构中,PMUv3作为第三代性能监控架构,提供了全面的性能事件监控能力。其工作原理是通过配置专用寄存器来选择监控…...

clwatch:AI编码工具版本监控与变更管理解决方案

1. 项目概述:一个为AI编码工具而生的“版本雷达”如果你和我一样,日常工作中重度依赖Claude Code、Codex CLI这类AI编码工具,那你一定遇到过这个痛点:你永远不知道你用的工具什么时候又悄悄更新了。新版本可能带来了梦寐以求的功能…...

免费二维CAD绘图软件LitCAD完整指南:15分钟快速上手专业设计

免费二维CAD绘图软件LitCAD完整指南:15分钟快速上手专业设计 【免费下载链接】LitCAD A very simple CAD developed by C#. 项目地址: https://gitcode.com/gh_mirrors/li/LitCAD 还在为昂贵的CAD软件费用发愁吗?还在为复杂的设计工具学习曲线感到…...

雷达仿真避坑指南:地杂波与海杂波在MATLAB中建模的5个常见误区

雷达仿真避坑指南:地杂波与海杂波在MATLAB中建模的5个常见误区 雷达系统仿真中,地杂波和海杂波的建模直接影响目标检测性能的评估准确性。许多开发者在MATLAB中实现杂波仿真时,常因几个关键环节的疏忽导致结果偏离预期。本文将结合工程实践中…...

RK3568开发板AMP双系统烧写实战:从原理到调试全解析

1. 项目概述:从单核到异构,解锁开发板的并行处理潜能最近在折腾一块瑞芯微RK3568的开发板,具体型号是迅为的iTOP-3568。这块板子性能不错,四核A55的架构,在嵌入式领域算是中坚力量了。但玩着玩着,我发现了一…...

AI文本人性化工具:开源本地化改写方案与同义词替换原理

1. 项目概述与核心价值 最近在折腾一些文本内容,发现一个挺有意思的现象:无论是学生写论文、运营写文案,还是程序员写文档,大家或多或少都会用到AI工具来辅助生成初稿。这效率是上去了,但随之而来的问题也很明显——生…...

开源AI电话系统IMAI.WORK-AI-Phone:从架构到部署的实战指南

1. 项目概述与核心价值最近在AI应用开发圈子里,一个名为“IMAI.WORK-AI-Phone”的项目引起了我的注意。这个项目由imaiwork团队开源,从名字就能看出它的野心——打造一个“AI电话”。听起来是不是有点科幻?但别误会,这可不是要造一…...

地质雷达仿真终极指南:如何使用gprMax进行地下电磁波传播模拟

地质雷达仿真终极指南:如何使用gprMax进行地下电磁波传播模拟 【免费下载链接】gprMax gprMax is open source software that simulates electromagnetic wave propagation using the Finite-Difference Time-Domain (FDTD) method for numerical modelling of Grou…...

Slack集成Cursor Agent:对话驱动开发的自动化工作流实践

1. 项目概述:在Slack里用对话驱动你的代码项目 如果你和我一样,日常开发工作流重度依赖Slack进行团队沟通,同时又对Cursor的Agent功能爱不释手,那你可能也经历过这种“割裂感”:一边在Slack里讨论需求、报Bug&#xf…...

地质雷达仿真利器:gprMax让电磁波传播可视化变得如此简单

地质雷达仿真利器:gprMax让电磁波传播可视化变得如此简单 【免费下载链接】gprMax gprMax is open source software that simulates electromagnetic wave propagation using the Finite-Difference Time-Domain (FDTD) method for numerical modelling of Ground P…...

制造企业实现产品服务化的路径

在 AI 与工业物联网(AIoT)时代,制造企业实现“产品服务化”(Servitization,又称服务型制造),本质是把企业和客户的利益绑定在同一侧:客户不再为“硬件所有权”买单,而是为…...

OpenClaw力工峰:为华人中小经营者打造低成本AI数字员工

1. 项目概述:一个为华人中小经营者量身定制的AI“全能工”如果你是一个小公司老板、个人工作室主理人,或者干脆就是个光杆司令,那你一定对下面这些事深恶痛绝:每天被行政报销、招聘沟通、内容排版、会议纪要这些重复性杂事缠身&am…...

【花雕学编程】Arduino BLDC 之基于MimiClaw+ ESP32S3的智能跟随机器人

导语 该拓展思路以 ESP32‑S3MimiClawArduino BLDC 为核心,融合嵌入式 AI 无刷动力 多模态感知,具备全向机动、地形适应、智能跟随、低功耗长续航等优势,覆盖消费随行、工业协同、特种科考、教育科研等场景。 一、系统概述 Arduino BLDC …...

别再为固定输入尺寸发愁了:用PyTorch手把手实现SPP层(附完整代码)

突破固定尺寸限制:PyTorch实现空间金字塔池化的工程实践 在计算机视觉任务中,处理不同尺寸的输入图像一直是个令人头疼的问题。想象一下这样的场景:你正在开发一个目标检测系统,训练时所有图像都被统一调整为224224像素&#xff…...

基于MCP协议构建AI图像生成服务器:连接Claude与Stable Diffusion的实践指南

1. 项目概述:一个连接AI与创意生产的MCP服务器最近在GitHub上看到一个挺有意思的项目,alexandrali0506/ai-image-generator-mcp。光看名字,你可能觉得这又是一个普通的AI画图工具,但它的核心价值远不止于此。这是一个基于模型上下…...

Python实战:用代码验证哥德巴赫猜想(python123)

1. 哥德巴赫猜想的前世今生 1742年,德国数学家克里斯蒂安哥德巴赫在给欧拉的信中提出了一个看似简单却困扰数学界数百年的猜想:"任一大于2的偶数都可表示为两个素数之和"。这个猜想后来被称为"强哥德巴赫猜想"或"关于偶数的哥德…...

Pytorch图像去噪实战(八十五):审计日志实战,记录用户行为、模型调用和敏感操作

Pytorch图像去噪实战(八十五):审计日志实战,记录用户行为、模型调用和敏感操作 一、问题场景:出了问题,却不知道是谁在什么时候做了什么 图像去噪服务进入平台化后,会出现大量用户行为: 用户上传图片 用户创建异步任务 用户下载结果 用户调用高质量模型 管理员修改套餐…...

1.QT和MySQL的连接

以下是图片中的完整文本提取:流程: 1、安装Qt 2、配置path环境变量 3、编译mysql驱动 (用Qt打开mysql.pro文件) 第6行左右,在QMAKE_USE mysql前面加上#,变为 #QMAKE_USE mysql win32:LIBS -LD:/mysql/mysql-8.0.19-winx64/lib …...

从医院PACS到你的电脑:手把手教你用免费工具查看和转换DCM文件(Windows/Mac)

从医院PACS到个人电脑:零基础掌握DICOM影像查看与转换全流程 第一次从医院PACS系统导出DICOM文件时,那种"双击打不开、专业软件不会用"的挫败感我至今记忆犹新。作为医学影像的黄金标准格式,DCM文件包含着远比普通图片丰富的诊断信…...

企业级AI工程化实战:基于OpenClaw+Matrix+Mem0的多智能体协作平台搭建

1. 项目概述:一个企业级AI工程化的真实踩坑记录去年年底,老板把我叫到办公室,指着屏幕上各种AI新闻问我:“咱们公司是不是也该‘上AI’了?你看人家,效率提升多少多少。” 我当时心里一沉,知道这…...

AI代码质量评估框架:从功能到体验的自动化评测实践

1. 项目概述:一个为AI生成代码“打分”的框架如果你和我一样,最近几个月一直在和Claude Code、Cursor这类AI编程助手打交道,那你肯定也经历过那种“过山车”般的体验。AI助手能在一分钟内给你生成一个看起来功能齐全的网站,但当你…...

5分钟完成Windows与Office智能激活:KMS_VL_ALL_AIO终极指南

5分钟完成Windows与Office智能激活:KMS_VL_ALL_AIO终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为系统激活问题而烦恼吗?KMS_VL_ALL_AIO是一款功能强大的…...

2026年主流进口工业连接器品牌探讨

在工业 4.0 深化落地与能源转型加速推进的背景下,工业连接器已成为保障工业设备、产线稳定运行的核心基础部件,其可靠性直接影响生产效率与运维成本。依托成熟的技术积淀、严格的品控体系与丰富的场景适配经验,进口工业连接器品牌在高端装备制造、新能源、工业自动化等领域仍占…...

云端AI控制机械臂:从视觉感知到运动规划的全栈实践

1. 项目概述:从“Clawd-Control”看AI驱动的机械臂控制新范式最近在GitHub上看到一个挺有意思的项目,叫“Temaki-AI/clawd-control”。光看名字,你可能会有点摸不着头脑——“Clawd”是什么?是“Claw”(爪子&#xff0…...

vibe-to-ui:让AI助手帮你将设计灵感转化为工程化设计系统

1. 项目概述:为“感觉派”开发者打造的AI设计伙伴如果你是一位能快速构建复杂后端逻辑、但对前端UI设计感到无从下手的开发者,或者你心中有一个模糊的“感觉”,却不知道如何将它转化为具体的颜色、字体和动画,那么你很可能就是“感…...

基于ESP8266与机智云平台,百元打造智能雨林缸自动控制系统

1. 项目概述:用百元预算打造一个会思考的雨林缸作为一个玩了多年水族和雨林造景的老玩家,我一直在琢磨一件事:能不能用最低的成本,给家里的雨林缸装上一个“大脑”,让它能自己照顾自己?市面上的成品智能控制…...