问题标签 [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.

0 投票
1 回答
576 浏览

go - golang、ebpf 和函数持续时间

我正在玩 gobpf 并且在计算跟踪的用户空间函数的持续时间时遇到了问题。我使用 bpf_ktime_get_ns() 来读取时间,然后尝试计算增量,但是得到了巨大的数字,尽管跟踪的函数只休眠了 1 秒。

这是经过测试的 C 程序,它有一个名为“ameba”的函数。

去代码

程序输出示例:

PID 命令持续时间 RAW
15515 ameba 1193179h21m9.457496929s 4295445669457496929 15550
ameba 1193198h27m37.653709676s 4295514457653709676

哪里错了??

0 投票
0 回答
280 浏览

linux-kernel - bpf_asm 在编译时返回单个 '

我是伯克利数据包过滤器的新手。我正在尝试学习如何手动滚动我自己的 bpf 代码,然后使用 bpf_asm 编译它。我正在使用内核 4.4.0-137 开发 ubuntu 16.04。我已经下载了源代码,并且正在阅读推荐的阅读材料,Documentation/networking特别是[filter.txt][1]. 我使用提供的 makefile安装binutils、构建和安装bpf_asmtools/net到目前为止,一切似乎都很顺利。当我运行bpf_asm -c bpf_example程序时,会产生一个标准输出的 ' 标记。我正在尝试编译的代码Documentation/networking/filter.txt是为了完整起见,我将其包含在此处提供的示例代码。

中提到的输出filter.txt

但是,我的输出是

我显然把事情搞砸了。有人可以指出我忽略了什么,为尝试的事情提供建议,或者提供额外的文献补充filter.txt吗?谢谢你。

编辑

仔细阅读代码后,我发现 bpf_exp.y 正在调用 yyerror。有一条消息“lex unknown character”,我觉得这有点奇怪,因为我将文本filter.txt直接从一个新文件中拉出来。使用 bpf_exp.l 我在 for 的产生中发现了一些奇怪的行为.,它用于捕获任何其他词法分析器未捕获的输出并输出错误。将这些评论出来......这可能是一个糟糕的主意,我能够产生 bpf 输出。但是,它并不等同于filter.txt建议的输出。但是,它确实包含与输入的 bpf 相同的行数,并且在运行它之后bpf_dbg程序我恢复了我输入的相同输出。这个程序不再维护了吗?或者我仍然没有正确使用它?此外,输入 bpf 程序似乎很难filter.txt作为建议的程序输出,因为我不相信解析器对输出代码有任何优化。因此,它似乎需要具有相同数量的行。这是一个正确的假设吗?

0 投票
1 回答
1062 浏览

trace - 在 eBPF 中取被调用函数的名称

我想跟踪特定 PID 的函数并收集一些统计信息(总调用次数、总时间等),但我并不完全清楚如何使用 funcname+my_struct 对创建 BPF_HASH。

有没有办法在 BPF 程序中获取被调用函数的名称?

我想我应该使用“PT_REGS_IP(ctx)”读取 IP 寄存器,但我不完全理解如何将值转换为人类可读的字符串。

目前 BPF 程序看起来如下:

但是在启动时我得到了:

0 投票
1 回答
382 浏览

linux - 将 eBPF 字节码附加到 SOCK_STREAM 套接字

我正在使用https://elixir.bootlin.com/linux/v4.9.137/source/samples/bpf/sockex3_kern.c这个例子,但我使用的是普通的 AF_INET6/SOCK_STREAM 和 BPF_PROG_TYPE_SOCKET_FILTER 而不是 RAW 套接字。

我不明白为什么用 load_half 来读取 proto。前 32 位是长度字段:

或者,如果我尝试这样做:

我收到“无效的 bpf_context 访问关闭 = 80 大小 = 4”错误。据我了解,我应该从此处的“数据”字段中读取所有数据。

那么,也许有人可以告诉我当前 sk_buff 的前 34 个字节(eth + ip 标头)在哪里修剪?在 tcp_v4_rcv 的某个地方?

是否可以使用 SOCK_STREAM 套接字访问 IP 标头字段?

UPD:看起来没有办法直接从过滤器访问数据:

https://elixir.bootlin.com/linux/v4.9.137/source/net/core/filter.c#L2647

0 投票
1 回答
873 浏览

c - eBPF,跟踪值长于堆栈大小?

我正在扩展一个程序,它接受跟踪函数的参数并打印它。数字参数和短字符串一切正常。但目前尚不清楚如何处理长于 eBPF 中堆栈大小的长字符串(限制为 512 字节)。

在下面的例子中,字符串被限制为 80 字节,当然最多可以增加到 512,但是如何跟踪更长的字符串呢?

带有被称为“ameba”的跟踪函数的 C 程序示例

Go 代码示例

我读到了 BPF_MAP_TYPE_PERCPU_ARRAY 在这种情况下可能会有所帮助,但我不清楚如何使用它。

编辑:Go 程序已修改为使用“C”和“不安全”。

0 投票
1 回答
1052 浏览

bpf - eBPF 程序将 HTTP 请求转发到不同的端口

我正在尝试实现一项功能,根据 HTTP 请求的路径,我可以将请求转发到不同的端口。

比如请求GET /foo,我想转发到81端口,如果是/bar我想转发到82端口。如果是别的,我想继续转发到端口 80,因为它是传入的。

有这样的示例 eBPF 程序吗?

我试图弄清楚我将如何确定 HTTP 请求是什么,因为 eBPF 将应用于数据包级别

0 投票
1 回答
79 浏览

filter - 经典 BPF——没有简单的统计数据?

我正在使用经典BPF来过滤netlink套接字上的某些内容,发现没有简单的统计数据可用于验证数据包是否已被丢弃或允许。

所以我查看了https://elixir.bootlin.com/linux/latest/source/net/core/filter.c#L90是的,它执行过滤器 bpf 程序,但没有更新任何可以告诉我用户的内容空间(例如通过 /proc FS)过滤器是否丢弃了一个数据包。这将简化 cBPF 过滤器的调试。

这是预期的,还是我错过了什么?

0 投票
1 回答
243 浏览

x86-64 - 如何在 eBPF 程序中访问 xmm 寄存器

我正在尝试使用 bcc-tools 使用 uprobe 跟踪用户进程,但有些函数采用浮点参数。根据 x86_64 ABI,这些值通常在 xmm 寄存器中传递。

bcc 中的 eBPF 函数接受一个struct pt_regs *参数,因为我可以访问(?的副本?)大多数“常用”寄存器,但不能访问 xmm 寄存器。

有没有办法做到这一点?或者这是在 eBPF 的设计中被忽略的东西

0 投票
2 回答
2654 浏览

bpf - 是否有任何允许配置防火墙的 bpfilter 工具?

我想了解 bpfilter。我不能使用 netfilter(太慢)、nftables(没有我的功能集)。

内核说:

CONFIG_BPFILTER: │ │ 这构建了实验性的 bpfilter 框架,旨在 │ │ 通过 BPF 提供与 netfilter 兼容的功能

有没有:

  • 允许使用 BPF 而不是 netfilter 配置防火墙规则的工具?
  • 允许轻松进入主题的文档?
  • 手动的?....

到目前为止,我只追踪了一篇 LWN 帖子,解释了 bpffilter 有多酷,但出于管理目的,它毫无用处。

https://lwn.net/Articles/747551/

它是否太新太粗略以至于无法关心?

0 投票
1 回答
359 浏览

linux-kernel - 为什么 sys_futex 上的 kretprobe 调用频率低于相应的 kprobe?

我正在跟踪各种内核函数和系统调用,并在它们之间建立可用于某些性能分析的模式。

我注意到的一件事是,有时,即使在我的简单测试应用程序中,它启动了一些与一些互斥锁一起使用的线程,我也不会收到任何kretprobe__sys_futexkprobe__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