eBPF 问答
这里每天收录一个关于 eBPF、Linux 可观测性、性能分析、运行时扩展或安全问题的回答。每篇回答都以公开的一手资料为依据,并在末尾附上匿名化的当日社区讨论摘要。
问题可能来自公开 issue、邮件列表、论坛或技术社区。发布前,我们会重新表述问题,删除身份、私有部署细节和可能定位原讨论的措辞,再用公开资料核对答案。这里每天发布一篇;如果当日窗口有无法覆盖的部分,会在页面中如实说明这一缺口,而不是中止发布,也绝不用虚构内容填补。
最新回答
- 为什么生成式 BPF loader 对象会在只有子程序或未加载程序把数量推过上限时被拒绝,而检查又如何移到真实的已加载程序数量上?
- 为什么 iocost 的 cgroup 代价模型文件只能在内建模型的 auto 与 user 系数集之间切换,而 BPF struct ops 代价模型接管设备之后,这个文件为什么不再选择模型?
- BPF 重定向到邻居的辅助函数为什么会在以太网头很短的包上触发内核 BUG,修复又为什么在接收路径和发送路径上读取真实头部长度要使用不同的字段?
- 为什么不可睡眠的 BPF fentry 与 fexit 程序会悄悄跳过同一 CPU 上其他任务的调用,被跳过的调用又为什么会记成递归丢失?
- BPF binfmt-misc 处理器以透明模式执行 exec 时,为什么进程的 exe 链接、comm 和命令行仍然描述的是被执行的二进制,而不是实际运行的解释器?
- 本地嵌入模型没有服务器也没有 token 计数,为什么它的 GenAI span 属性要声明期望缺失项,这些缺失项如何保持符合规范?
- OpenTelemetry OBI 的 Collector 接收器为什么保持独立模块和独立版本线,为什么普通的 go get 更新不会把接收器拉到 RC 标签?
- OpenTelemetry OBI 指标为什么会在 TTL 之后还在 store 里保留最长达两倍时长,Prometheus 导出器会不会在每次 scrape 时都删掉同一组 label?
- OBI 的 HTTP span 为什么会出现高基数的名称,OpenTelemetry 语义约定又如何限制 span 名称的基数?
- BPF LRU 哈希 map 什么时候淘汰一个条目,当它的 LRU 列表是每 CPU 一份而不是跨 CPU 共享时会改变什么?
- FUSE 守护进程对 OBI trace 上下文 map 的查询返回了一个条目时,这个条目一定是当前请求的 trace 上下文吗?它什么时候会过期?
- 为什么 FUSE 文件系统运行在 PID 命名空间内时,FUSE 守护进程对 OBI trace 上下文 map 的查询会查不到?
- OpenTelemetry eBPF 插桩如何判定它能为哪些语言运行时打上 trace 上下文,又如何验证 FUSE 守护进程线程确实继承了上下文?
- 为什么 eBPF kprobe 的字符串读取会截断较长的 open 与 stat 路径,又如何读取完整路径?
- FUSE 用户态文件系统守护进程如何通过按 pid 和 tid 读取 OBI trace 上下文 map 来继承 OpenTelemetry trace propagation?
- 为什么通过 Cilium eBPF Go 库 attach 的 tracepoint eBPF 程序在新内核上只在 CPU 0 上触发,而同一程序在旧发行版上却能系统级地记录系统调用?
- 为什么 Node.js 的 GenAI 插桩放在 opentelemetry-js-contrib 里而不是独立仓库,为什么没有对应 Python GenAI 插桩仓库的 Node.js 仓库?
- 为什么 GenAI 遥测里可用智能体技能列表应当是挂在 span 上的专属属性,而不是单独的 span 或 span 事件?span 的时长模型又为何排除掉 span 形式?
- 为什么 GenAI 插桩该用日志管道严重级来控制推理事件发射而不是专门的 emit 标志?logger 的 enabled 是 opt-in 还是 opt-out?
- 为什么 OpenTelemetry GenAI 指标目录只到引擎无关的时延与 token 计数,model-serving-signals 又怎样补齐模型服务与自动扩缩容那部分?
- 为什么 UMEM 的 chunk 尺寸会封顶 AF-XDP 零拷贝模式下最大的包,FILL 环又该怎样一直喂饱,内核才不会静默丢入向流量?
- 为什么冗余包的丢弃判定应该留在内核态,而不是把每次重试都升级给用户态?高负载 BPF ring buffer 又该怎样定容量、盯水位?
- 为什么 trace 看不出智能体当时有哪些技能可选,新的技能定义属性如何让这份列表可见?
- 当两条重叠的 L3/L4 策略条目同时命中时,为什么 Hubble 会把流量归因到错误的策略规则,而 BPF 数据面实际执行的是正确的那条?
- 为什么在 OBI 的 Config v2 文档下,Helm 图自动注入的 Kubernetes 缓存地址环境变量会被忽略,缓存地址又该写在哪里?
- 在 Cilium LoadBalancer 中,拥有共享 VIP 端口的冲突 Service 被删除后,为什么前端会一直缺失,控制器应如何恢复它?
- 为什么在 TLS uprobe 捕获下,TLS 连接上第一个之后的每个 HTTP/2 请求都会 HPACK 解码失败,解码器应如何保持每连接状态?
- 为什么 BPF 哈希 map 的键迭代顺序是随机的,而不是插入顺序?
- BPF task 迭代器为什么分为可睡眠与不可睡眠两种程序,哪些进程视图分别落在哪一侧?
- 为什么 connect 或 accept 探针会漏掉通过文件描述符交接而换了主人的 socket?
- 为什么 BPF hash 表满了以后,插入新 key 会报 E2BIG,而更新已存在的 key 仍然成功?
- 为什么 BPF LPM-trie 查找会返回更不具体的已存储前缀,key 的 prefixlen 字段又是怎么决定哪条记录命中的?
- 删除 BPF hash 表的一个 key 时,值内存会被清零吗?被复用的槽位是否可能残留旧值的字节?
- 为什么 TLS 加密的服务间 trace 无法拼接,而零代码 eBPF 追踪中真正跨越加密边界的又是哪个组件?
- 被 OBI 插桩的 Node.js 服务,为什么不能因为不用手动 span 和日志富化就直接关掉每次回调的 trace 上下文哨兵?
- 当智能体循环跑在厂商托管服务里而不是你的进程内时,如何从托管智能体 harness 里取出可观测数据?
- 为什么 OBI 的 v1 到 v2 配置迁移在有些字段无法映射时拒绝写出文件,中间地带是什么?
- 为什么把服务排除出 eBPF 追踪后,eBPF 追踪器注入的 Node.js 代理仍留在进程里,直到 pod 重启才消失?
- GenAI 智能体 span 是否应把每次工具执行嵌套在请求它的模型调用下面,还是把模型调用与工具执行都作为同一个智能体 span 的兄弟节点?
- 为什么给 Node.js 服务启用 eBPF 追踪后,热路径的 p99 会翻三倍,而 eBPF 探针本身却很廉价?
- BPF 程序能否安全读取属于另一个进程的用户态内存?
- 为什么 BPF 程序不能睡眠或阻塞,在不可睡眠上下文里应该用什么替代?
- 为什么函数被编译器内联后,给它的 kprobe 永远不会触发?
- 什么时候应该用 BPF ring buffer 而不是 perf event 数组来采集 eBPF 样本?
- 为什么 SIGKILL 无法终止 BPF 程序加载,即使验证已经成功?
- 构建进程行为重构工具时,架构上需要把哪些 eBPF/内核限制考虑进去?
- 实践中,哪些技术边界真正约束恶意的 eBPF 载荷?
- eBPF 瞬时 TCP 故障恢复基准必须覆盖哪些场景才有意义?
- 为什么只在低 32 位成立的关系会被 eBPF 验证器丢失?
- 为什么反向路径过滤会丢弃 eBPF Kubernetes 数据路径中的返回流量?
- 为什么 eBPF 程序不能读取
bpf_tail_call()的返回值? - 为什么 PID 和 TID 不足以关联并发 TLS、HTTP/2 和 SSE 流量?
- 为什么释放 BPF dynptr 时必须让所有派生 slice 和 clone 失效?
- 非特权容器能否创建自己的 BPF token?
- 为什么单次 compare-and-swap 会在竞争下丢失原子 min/max 更新?
- 没有 systemd 时,怎样在开机后启动
sched_ext调度器? - 为什么 syscall rewriting trampoline 会让
clone或clone3创建的线程崩溃? - OpenTelemetry GenAI 评估结果是否应该携带可验证证据的引用?
- 为什么无人抓取的 OBI Prometheus endpoint 仍会让内存持续增长?
- OpenTelemetry 指标生产者是否应该把服务身份复制到每个数据点?
- 如何判断 OpenTelemetry GenAI 属性是否已经稳定到可以依赖?
- 为什么安装了许多内核模块的主机上,libbpf 加载 BPF 对象会变慢?
- BPF 可扩展调度生效时,cgroup v2 的
cpu.max仍会限制 CPU 时间吗? - 为什么使用 BPF 私有栈的可抢占内核可能被 classic uprobe 程序触发崩溃?
- eBPF 程序应如何在多个网络 hook 之间携带每包元数据?
- Linux VM eBPF 后端应如何支持 macOS 和 Windows,同时不误报宿主机覆盖范围?
- OpenInference 应如何与 OpenTelemetry 的 GenAI 语义约定共存?
- 为什么
scxctl接受了调度器切换命令,服务却仍未按预期启动? - 为什么在 TC egress 中把 socket 放入
SOCKHASH会导致内核 soft lock? - 为什么
sched_ext调度器要升级pahole后才能加载? - eBPF 能否识别网络流量中的密钥,同时不采集密钥本身?
继续阅读
- 最后更新
- 2026年10月31日
- 首次发布
- 2026年8月8日
- 贡献者
- Yunwei 123, Yunwei, Littlefisher619
这个页面有帮助吗?