问题标签 [ebpf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - BPF Helper 的 eBPF 隐式声明
我在编译使用 TC 安装的 eBPF 程序时遇到问题。目前,它只执行一些基本的修改,这需要重新计算 IP 校验和。
我注意到在 BPF 助手中,有一个函数 bpf_l3_csum_replace 这似乎是我想要的。但是,当我尝试使用使用 BPF_FUNC 宏映射的任何内置函数时,我得到一个隐式声明错误:
...警告:“bpf_l3_csum_replace”的隐式声明在 C99 中无效。
随后是来自验证者的错误:
... 不支持调用全局函数 'bpf_l3_csum_replace'。只允许调用预定义的 BPF 助手。
我的编译行:
我应该注意,只要我不使用任何“预定义”的 bpf 助手,我就可以编译和安装 BPF 对象(使用 TC)。一旦我这样做,问题就会出现。
我在内核树之外做这个,FWIW。不确定这是否是一个问题。我包括了 bpf 标头(linux/bpf.h),并且我使用了 iproute2 包中的 bpf_api.h 标头(对 bpf_helpers.h 标头没有太多运气)。
我对 eBPF 还是比较陌生,所以如果我遗漏了什么,我不会感到惊讶。任何帮助,将不胜感激。
编辑:代码
python - 使用 eBPF 在 Python 堆栈级别跟踪代码是否可行?
长期以来,非 Linux 平台上的 dtrace 一直被宣传为能够动态检测 node.js 代码以在节点级别进行动态跟踪,例如允许在 JavaScript 堆栈帧和变量级别调试节点程序(连同较低的级别跟踪)来自核心转储。
Linux 上的 eBPF 现在是否达到了这种复杂程度?我特别对 Python 感兴趣,但如果这个问题是针对任何类似的动态语言回答的,我会考虑回答这个问题。
如果没有,还需要做什么来支持它?
go - golang、ebpf 和函数持续时间
我正在玩 gobpf 并且在计算跟踪的用户空间函数的持续时间时遇到了问题。我使用 bpf_ktime_get_ns() 来读取时间,然后尝试计算增量,但是得到了巨大的数字,尽管跟踪的函数只休眠了 1 秒。
这是经过测试的 C 程序,它有一个名为“ameba”的函数。
去代码
程序输出示例:
PID 命令持续时间 RAW
15515 ameba 1193179h21m9.457496929s 4295445669457496929 15550
ameba 1193198h27m37.653709676s 4295514457653709676
哪里错了??
trace - 在 eBPF 中取被调用函数的名称
我想跟踪特定 PID 的函数并收集一些统计信息(总调用次数、总时间等),但我并不完全清楚如何使用 funcname+my_struct 对创建 BPF_HASH。
有没有办法在 BPF 程序中获取被调用函数的名称?
我想我应该使用“PT_REGS_IP(ctx)”读取 IP 寄存器,但我不完全理解如何将值转换为人类可读的字符串。
目前 BPF 程序看起来如下:
但是在启动时我得到了:
c - eBPF,跟踪值长于堆栈大小?
我正在扩展一个程序,它接受跟踪函数的参数并打印它。数字参数和短字符串一切正常。但目前尚不清楚如何处理长于 eBPF 中堆栈大小的长字符串(限制为 512 字节)。
在下面的例子中,字符串被限制为 80 字节,当然最多可以增加到 512,但是如何跟踪更长的字符串呢?
带有被称为“ameba”的跟踪函数的 C 程序示例
Go 代码示例
我读到了 BPF_MAP_TYPE_PERCPU_ARRAY 在这种情况下可能会有所帮助,但我不清楚如何使用它。
编辑:Go 程序已修改为使用“C”和“不安全”。
bpf - eBPF 程序将 HTTP 请求转发到不同的端口
我正在尝试实现一项功能,根据 HTTP 请求的路径,我可以将请求转发到不同的端口。
比如请求GET /foo,我想转发到81端口,如果是/bar我想转发到82端口。如果是别的,我想继续转发到端口 80,因为它是传入的。
有这样的示例 eBPF 程序吗?
我试图弄清楚我将如何确定 HTTP 请求是什么,因为 eBPF 将应用于数据包级别
x86-64 - 如何在 eBPF 程序中访问 xmm 寄存器
我正在尝试使用 bcc-tools 使用 uprobe 跟踪用户进程,但有些函数采用浮点参数。根据 x86_64 ABI,这些值通常在 xmm 寄存器中传递。
bcc 中的 eBPF 函数接受一个struct pt_regs *
参数,因为我可以访问(?的副本?)大多数“常用”寄存器,但不能访问 xmm 寄存器。
有没有办法做到这一点?或者这是在 eBPF 的设计中被忽略的东西
linux-kernel - 为什么 sys_futex 上的 kretprobe 调用频率低于相应的 kprobe?
我正在跟踪各种内核函数和系统调用,并在它们之间建立可用于某些性能分析的模式。
我注意到的一件事是,有时,即使在我的简单测试应用程序中,它启动了一些与一些互斥锁一起使用的线程,我也不会收到任何kretprobe__sys_futex
对kprobe__sys_futex
.
我假设这是因为例如一个线程正在调用sys_futex
,并进入睡眠状态或可能终止,但我实际上看到相同的进程sys_futex
连续多次调用,而返回探针却没有注意到任何事情。
然后我假设问题在于我如何过滤对 的调用kprobe__sys_futex
,所以我使用 BCC/eBPF 做了一个最小的例子来测试这个:
我注意到在各种应用程序中(一个很好的例子是 mysql-server,即使在空闲时也会执行常规的 futex 操作 - 至少在我的机器上),futex start
在返回探针的消息之前会打印许多(通常是 10+)s。
这是我在写这篇文章时运行了几分钟的上述程序的示例跟踪:
如您所见,例如 pid 697 似乎已经调用了sys_futex
四次,而仅在这个小跟踪中没有返回。
我认为这不是 eBPF 代码中的竞争条件,因为如果您将打印语句静音并且只定期打印,则计数通常会在零附近的几个范围内sys_write
,这比sys_futex
(至少在我的系统的工作负载上)更频繁地发生),所以我希望任何竞争条件都会加剧而不是解决。
我在位于 VirtualBox 的 Ubuntu 18.04 LTS 上运行内核 4.15.0-43-generic。
很高兴提供更多可能有用的上下文!
IOVisor 邮件列表中有一个相关的主题:https ://lists.iovisor.org/g/iovisor-dev/topic/29702757
linux - 尝试访问“struct rq”时,bpf/bcc 报告错误
这是我用来分析内核函数的 bpf 程序pick_next_task_fiar
。
它报告错误如下:
我的问题是为什么 bpf 无法识别 ,struct rq
因为我已经包含了# include <linux/sched.h>
. 然而,它确实承认struct task_struct
. 这两个结构在同一个头文件中。
内核版本:ubuntu 16.04 上的 4.4.0-141-generic
bpf - 函数“bpf”的隐式声明
我最近一直在研究 BPF,但由于一个非常基本的问题而没有进行。
我按照 man bpf(2) 中的描述包含了 linux/bpf.h,但 GCC 找不到 bpf 函数。此代码仅用于测试以确保 GCC 可以找到 bpf 函数。
GCC 输出是这样的。
我使用的是 Archlinux,linux 内核版本是 4.20.11-arch1-1-ARCH。请帮助我如何包含 bpf 功能。