问题标签 [bcc-bpf]
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.
linux-kernel - 无法使用密件抄送工具将 eBPF `kretprobes` 附加到 `napi_poll()`
想法是用来argdist
测量延迟时间,napi_poll()
其中返回处理的数据包数量(称为工作)。执行延迟与napi_poll()
处理的数据包数量的比率将为我提供以直方图形式处理每个数据包所需的平均时间。
我正在使用以下命令
argdist -H 'r:c:napi_poll():u64:$latency/$retval#avg time per packet (ns)'
这最终给了我错误Failed to attach BPF to kprobe
,在 dmesg 我收到类似的消息Could not insert probe at napi_poll+0: -2
我只是好奇为什么当类似的技巧适用时kretprobes
我不能附加?napi_poll()
net_rx_action()
c - 如何从内核空间确定 PID 位于哪些命名空间?
我正在尝试编写一个 eBPF 程序来记录系统上运行的容器对特定系统调用的每次调用。我正在使用密件抄送,可以使用bpf_get_current_pid_tgid()
.
从用户空间我可以检查 proc 文件系统以确定进程的名称空间是否与根名称空间不同,以猜测它是否是容器进程,但我不知道你如何从内核空间做到这一点?
bpf - 在 BPF 程序中总是得到 0 会话 ID
我正在尝试编写一个 BPF 程序来检查调用tty_write
内核函数的任何进程的会话 ID。我试图通过从当前task_struct
结构中检索一个字段来做到这一点。我的代码如下:
请注意,我正在将我的 BPF 程序编译clang
成一个 ELF 文件并使用gobpf 的ELF 包加载它。不幸的是, 的值sessionid
始终为 0。这是为什么呢?我认为我没有错误地访问会话 ID,因为我在 4.11 内核上使用bcc之前已经这样做了(由于 bcc 如何重写 BPF 程序,当我想自己编译程序时,我不能简单地使用相同的代码)。用于访问的等效工作密件抄送代码sessionid
如下。请注意,这仅适用于 4.11 内核,以下代码不适用于 4.13 内核。然而,上面的代码在这两个内核上都不起作用。
4.11内核:
uname -a
:Linux ubuntu16 4.11.0-14-generic #20~16.04.1-Ubuntu SMP Wed Aug 9 09:06:22 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
4.13内核:
uname -a
: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
linux - 用于用户空间范围内存泄漏检测的密件抄送工具 memleak
是否有人使用 bcc 中的 memleak 工具来分析用户空间内存分配?我一直在尝试调整它来做到这一点,但它似乎非常不可靠,即第一批未完成的分配在使用虚拟 C 应用程序测试时似乎很好,但通常在接下来的批次中,由于某种原因,条目会人为地消失/增加. 我的猜测是由于用户空间中的分配频率很高,哈希表会溢出?有没有人设法使用 ebpf(或任何其他工具)进行 mem 用户空间范围的分析?
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 - 安装 bcc 时,找不到包 bpfcc
我正在尝试在我的 Linux 机器上安装 bcc 模块,以便编写 BPF 程序。
我一直在跟进页面
https://github.com/iovisor/bcc/blob/master/INSTALL.md#kernel-configuration
构建内核并安装 bcc 模块。
但是,每当我输入
我收到一个错误:
如果我问的基本问题太多了,我很抱歉。这是唯一一个似乎有聪明人有一些答案的地方。提前谢谢你们