eBPF 与 bpftrace:更深入地观测内核
eBPF 与 bpftrace更深入地观测内核实验环境Ubuntu 24.04 / 内核 6.8.0-106-generic / Cgroup v2 / 华为云 FlexusX 8C16G本文所有命令输出均来自真实实验机可直接复现。bpftrace 版本 v0.20.2内核自带 BTF。一、引子ftrace 还不够聪明的时候上一篇 ftrace 能看调用链、能插桩内核函数但它有个天花板所有逻辑都在内核态记录聚合、过滤、统计得事后在用户态做。如果你想问这个容器过去 10 秒里每次read的延时分布是多少“哪个 cgroup 的openat最多”“把几十万次事件按进程聚合出一张直方图”——ftrace 做不到在内核里就地算好再回传。这时候需要eBPF一套运行在内核态、带 JIT、有 Verifier 安全保障的虚拟机让你写一小段 C 逻辑挂到 kprobe / tracepoint / syscalls 上在内核里直接聚合数据进 map用户态只来取结果。再配上bpftrace类 awk 的一行脚本语言无需写 C、无需编译就能把上面的问题一行搞定。二、eBPF 原理简述2.1 它是怎么跑起来的写程序用 CBCC或 bpftrace 脚本描述探针触发时做什么。编译 VerifierLLVM 把 eBPF 字节码编译内核Verifier在加载前做严格校验——无越界、无死循环、只访问合法内存、调用受限 helper——不通过就拒绝加载因此 eBPF 不会把内核搞崩。JIT校验通过后eBPF 字节码被JIT 编译为原生机器码执行开销接近普通内核代码。MapeBPF 程序与用户态通过Map内核里的键值存储哈希表/数组/直方图等交换数据。探针高频写 map用户态低频读 map——这就是内核态聚合的关键。挂载点eBPF 程序可挂到kprobe / kretprobe动态同 ftrace 的 kprobe、tracepoint静态、perf event、XDP网络、cgroup等。2.2 它比 ftrace 强在哪维度ftraceeBPF聚合只能全量记录事后分析内核态就地聚合hist/sum/count过滤函数级 / 简单谓词任意 C 表达式谓词comm、pid、算数数据结构文本 trace 缓冲Map直方图、统计、栈表编程能力无配置式图灵完备可计算延时、关联事件安全内核内置稳Verifier 沙箱保障典型用途看调用链/耗时统计分布、按 cgroup 聚合、网络观测一句话ftrace 回答发生了什么调用eBPF 回答这些调用按 X 维度聚合后长什么样。三、bpftrace 单行实战bpftrace 语法probe { action }变量name是全局 Map退出时自动打印。下面每个都真跑过。3.1 系统调用次数 Top谁最忙rootecs-a8bb-0002:~# bpftrace -e tracepoint:raw_syscalls:sys_enter { [comm] count(); }Attaching1probe... [wpa_supplicant]:1[cron]:7[timeout]:9[sh]:109[irqbalance]:102[multipathd]:97[pluginctl]:148[bpftrace]:304[remotectl]:348[containerd]:929[uniagentd]:3848一眼看出本机系统调用最密集的是uniagentd云监控 agent3848 次、containerd929 次。count()在 Map 里累加退出时按值排序打印——这正是 eBPF 内核态聚合的缩影。3.2 跟踪 execveexecsnoop 效果execsnoop是经典工具谁在偷偷起进程可能是攻击、cron、 Hook。bpftrace 一行复刻rootecs-a8bb-0002:~# bpftrace -e tracepoint:syscalls:sys_enter_execve { printf(%-6d %-12s %s\n, pid, comm, str(args-filename)); }Attaching1probe...49032bash/usr/bin/ls49033bash/usr/bin/whoami49034bash/usr/bin/sleep49035bash/usr/bin/grep49036bash/usr/bin/headargs-filename是 tracepoint 的上下文字段str()把它从内核指针解成字符串。跑ls/whoami时被实时抓到——排查未知进程从哪来非常直接。3.3 I/O 延时直方图本来想做块 I/O 延时直方图block:block_rq_issue/block_rq_complete算差值。但本环境块设备走 virtio 半虚拟化实测block:*tracepoint 完全不触发已用count()验证block_rq_complete恒为 0。这是云环境的真实限制按替代方案原则我换成VFS read 延时直方图——技法完全一样入口记时间戳、出口算差值、丢进hist()且必然可复现rootecs-a8bb-0002:~# bpftrace -e tracepoint:syscalls:sys_enter_read{start[pid]nsecs;}tracepoint:syscalls:sys_exit_read /start[pid]/{ushist((nsecs - start[pid])/1000);delete(start[pid]);} us:[0]190|[1]210||[2,4)194|[4,8)20|[8,16)23|[16,32)28|[32,64)15|[128,256)11|[256,512)5|[512, 1K)1|[1K, 2K)8|[2K, 4K)1|[4K, 8K)3|解读绝大多数read在0~4µs内完成命中页缓存极快右侧长尾ms 级是首次读/页错误/落到磁盘的那几次。这正是直方图的价值——一眼看出分布而非只看平均值。同样的hist() issue/complete 时间戳差值技法可直接套到块 I/O / 网络 / 任意两点间延时。3.4 跟踪容器内进程按 comm 过滤要观测某个容器在宿主机上用 eBPF 最方便的是按进程名comm过滤——容器的业务进程通常 comm 固定且不同于宿主。我编译了一个只做open/read的iohog放容器里跑commiohog宿主机上按 comm 过滤统计它的系统调用rootecs-a8bb-0002:~# docker run -d -v /root/iohog:/iohog --name bpf-ct alpine /iohogrootecs-a8bb-0002:~# bpftrace -e tracepoint:syscalls:sys_enter_openat /commiohog/{opencount();}tracepoint:syscalls:sys_enter_read /commiohog/{readcount();} open:5787read:115987 秒内容器内iohog进程触发了 5787 次openat、11598 次read——完全隔离于宿主其他进程。如果把探针换成sys_enter_openat打印str(args-filename)就能逐条列出容器打开了哪些文件换成sys_enter_accept4 /commnginx/就是经典的nginx 容器连接接受观测。这就是生产里看清一个容器在干啥的标准手法。关于 cgroup 过滤更精确的做法是按 cgroup id 过滤bpftrace 有cgroup内建函数返回当前任务的 cgroup id。本机 cgroup v2 目录无cgroup.id文件但 cgroup id 等于该目录的 inode 号stat -c %i /sys/fs/cgroup/.../docker-id.scope可取用/ cgroup id /即可精准锁定某容器。本实验用 comm 过滤已能干净隔离故采用之。四、BCC 与 bpftrace怎么选bpftraceBCC形态单行/短脚本类 awkPython C完整项目上手极快改一行就能跑需写 C 程序 Python 胶水能力覆盖 90% 观测场景任意复杂逻辑、自定义 Map、USDT、网络/XDP依赖少bpftrace BTF多LLVM、Python、头文件典型临时排障、快速验证常驻监控、定制化工具、产品化实践建议临时排查、验证假设用bpftrace 一行脚本5 秒出结果。要做成常驻监控 / 复杂关联如按 cgroup 聚合所有容器的 TCP 重传用BCC写工具或基于 eBPF 的 Prometheus exporter如cilium/ebpf、bcc的TC/socket类。容器场景bpftrace 在宿主机跑配合comm/cgroup/pid过滤观测任意容器无需进容器。五、排查思路eBPF 在排障里的位置先问聚合后长啥样延时分布hist、Top Ncount、速率interval这类问题首选 eBPF/bpftrace。容器观测范式宿主机起 bpftrace → 用comm/cgroup/pid过滤器圈定目标容器 → 选 tracepointsyscalls/sched/block 等或 kprobe → 用 Map 聚合。与 perf/ftrace 联动perf 定位CPU 热点函数 → ftrace 看单次调用链与耗时 → eBPF 看海量事件的分布与按维度聚合。三者构成完整的核观测栈。注意环境限制如本机block:*tracepoint 不触发半虚拟化存储、部分 tracepoint 在容器视角的参数需str()解引用。遇到不触发就换同类探针如块 I/O 改 VFS read别卡死。六、小结与思考题小结eBPF 是运行在内核态、经 Verifier 校验、JIT 执行的虚拟机通过 Map 在内核态聚合、用户态取数比 ftrace 更适合统计分布与多维过滤。bpftrace 用一行脚本即可完成系统调用 Top、execsnoop、延时直方图、按 comm 过滤观测容器等任务。本环境实测block:*不触发以 VFS read 延时直方图替代技法一致。BCC 适合复杂/常驻场景bpftrace 适合临时排障。思考题eBPF 的 Verifier 为什么要禁止无界循环如果允许会有什么后果上面 read 延时直方图里为什么大部分在 0~4µs却有 ms 级长尾提示页缓存命中 vs 页错误/磁盘要统计每个 cgroup 的 TCP 重传次数bpftrace 该挂哪个探针、用什么 Map为什么用comm过滤容器不如用cgroup过滤精确什么情况下 comm 过滤会误伤或漏掉block:block_rq_complete在本机恒为 0这能说明磁盘没有 I/O吗为什么内核调试工具专题完。perf / ftrace / eBPF 三件套分别对应热点占比 / 调用链耗时 / 内核态聚合三层观测能力配合使用可覆盖绝大多数内核态排障场景。

相关新闻

ONNX运行时优化生成式AI模型部署实践

ONNX运行时优化生成式AI模型部署实践

1. ONNX运行时在生成式AI中的应用全景 在生成式AI技术爆发的当下,模型跨平台部署已成为行业刚需。ONNX(Open Neural Network Exchange)作为中立的开放格式,正在成为连接模型训练与生产部署的"通用语言"。我亲历过多个从…

2026/7/25 15:28:23 阅读更多 →
WSL环境下Autoware图形界面问题排查与优化

WSL环境下Autoware图形界面问题排查与优化

1. 问题现象与初步排查最近在Windows WSL环境下运行Autoware时遇到了一个典型问题:程序能够正常启动并生成日志,但Rviz界面无法显示,甚至有时Autoware完全无法启动。这种情况在WSL环境中并不少见,尤其当涉及图形界面和复杂依赖时。…

2026/7/25 15:28:23 阅读更多 →
Letterphile文字游戏:提升英语词汇量的单字母挑战技巧

Letterphile文字游戏:提升英语词汇量的单字母挑战技巧

1. 先搞清楚 Letterphile 到底是个什么类型的文字游戏Letterphile 是一个让你用同一个字母开头,尽可能多地拼出单词的文字游戏。它不像填字游戏那样需要交叉匹配,也不像 Scrabble 那样需要计算分数,核心玩法很简单:给你一个字母&a…

2026/7/25 15:27:22 阅读更多 →

最新新闻

AI Agent任务轨迹可视化系统设计与实践

AI Agent任务轨迹可视化系统设计与实践

1. 项目背景与核心价值去年在开发一个智能客服系统时,我遇到了一个典型问题:当多个AI Agent协同处理复杂工单时,很难直观理解它们的决策逻辑和协作过程。这促使我开发了一套任务执行轨迹可视化系统,现在把实现方案分享给大家。这种…

2026/7/25 15:44:30 阅读更多 →
在小米上检索照片/视频的5种方法:完整指南

在小米上检索照片/视频的5种方法:完整指南

丢失珍贵的照片和视频令人心烦意乱,但小米设备上有多种方法可以恢复照片和视频。无论您是意外删除了媒体,还是由于其他原因丢失,您都可以使用各种内置工具来恢复这些文件。从图库应用、小米云到 Google Photos,本指南将帮助您轻松…

2026/7/25 15:44:30 阅读更多 →
Ollama与AnythingLLM构建高效本地知识库问答系统

Ollama与AnythingLLM构建高效本地知识库问答系统

1. 项目概述:本地知识库问答系统搭建方案去年在帮一家金融机构做内部知识管理系统时,我首次尝试将Ollama与AnythingLLM组合使用。这个方案最大的优势是能在完全离线的环境下,让企业文档的查询响应速度从原来的平均12秒缩短到3秒以内。今天要分…

2026/7/25 15:44:30 阅读更多 →
小红书无水印下载神器XHS-Downloader:新手必看的完整使用指南

小红书无水印下载神器XHS-Downloader:新手必看的完整使用指南

小红书无水印下载神器XHS-Downloader:新手必看的完整使用指南 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链…

2026/7/25 15:44:30 阅读更多 →
世界模型与强化学习的融合架构解析

世界模型与强化学习的融合架构解析

1. 项目概述:当世界模型遇上强化学习去年在NeurIPS上第一次看到GigaBrain项目的海报时,就被它那个大胆的副标题吸引了——"用世界模型训练视觉语言智能体"。这让我想起2018年还在用LSTM做视觉导航时,每次调整超参数都要重新跑几十小…

2026/7/25 15:44:30 阅读更多 →
暗黑破坏神4登录闪退问题:系统性排查与解决方案

暗黑破坏神4登录闪退问题:系统性排查与解决方案

最近《暗黑破坏神4》新赛季开启,不少玩家兴冲冲地打开游戏准备开荒,结果刚登录就遭遇闪退,这种"秒退"的体验确实让人抓狂。作为一名经历过多次游戏闪退并成功解决的技术玩家,我深知这个问题的棘手性——它不像普通卡顿那样有明确提示,而是直接关闭游戏,连错误信…

2026/7/25 15:43:30 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 5:08:22 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 5:13:53 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻