问题标签 [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 - 在 dev_queue_xmit 中使用 ebpf 读取 sk_buff 会产生有问题的数据
我试图在本地主机上捕获传出的以太网帧,然后通过将 kprobe 插入到__dev_queue_xmit()
. 但是,我从sk_buff结构中提取的字节与随后捕获的数据包不匹配。
到目前为止,我只对线性 skb 进行了尝试,因为我已经在那里得到了意想不到的结果。例如,我的 kprobe 在调用时报告了以下信息__dev_queue_xmit()
:
COMM是调用函数的进程名,
PID是调用线程的id,TGID是它的线程组id。LEN是 的值(skb->len - skb->data_len)
,DATA_LEN是skb->data_len
。
接下来,程序从 开始复制 LEN(在本例中为 90)字节skb->data
。由于 DATALEN 为零,因此这是一个线性 skb。因此,这些字节应该包含即将发送的帧,不是吗?
嗯,Wireshark 随后记录了这一帧:
构成以太网报头的前 14 个字节与预期的一样完美匹配。其他一切都完全不匹配。现在的问题是:为什么字节不匹配?
(是的,我确信来自 Wireshark 的帧确实是由这次调用引起的__dev_queue_xmit()
。这是因为当时只有使用网络的后台程序在运行,所以传出的流量很小。另外,捕获的帧正如预期的那样,包含 90 个字节。此外,此帧包含一个 NTP 有效负载,这正是您对chronyd的期望。)
我的内核版本是 5.12.6-200.fc33.x86_64。
如果你想自己尝试一下或者仔细看看我的程序,这里是:
ebpf - 在 eBPF 中从文本文件中打印某些内容
我想从文件中加载一些文本并使用 eBPF 打印出来。这样的事情甚至可能吗?我使用 bpf_probe_read 做了类似的事情,但我想知道是否有一种更简单的方法来做这样的事情,只需给它一个位置?例如,我想尝试通过使用 CSV 作为一种实践手段来扩展它。
bpf - BPF crc32 奇怪的错误:最后一个 insn 不是退出或跳转
使用 eBPF 并决定尝试另一种 crc32 算法尝试,但遇到了另一个我似乎无法找到太多信息的错误。我不断收到一个 bpf:无法加载程序:无效参数最后一个 insn 不是退出或 jmp。我试图看看它是否与我编写函数的方式有关,但我生成的只是警告,然后跳转到这个错误。
这也是我看到的详细错误:
生成 5 个警告。附加到 uretprobe bpf:无法加载程序:无效参数最后一个 insn 不是退出或 jmp 处理 0 个 insns(限制 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
c - 在没有指针的情况下提取C中句子中的前两个单词
到目前为止,我已经习惯了编写 eBPF 代码,并且希望避免在我的 BPF 文本中使用指针,因为从中获得正确的输出非常困难。由于所有示例代码都需要指针,因此使用 strtok() 似乎是不可能的。我还想在将来将其扩展为 CSV 文件,因为这对我来说是一种练习方式。我能够在这里找到另一个用户的代码,但由于一个指针,它给了我一个密件抄送终端错误。
bpf - Possible to see tracing when using cat or vi opening a text file
Is it possible to trace through what is being read through a text file using eBPF? There are ways to see the amount of memory being used and count reads and writes but I would like to even output the user data using bpf_trace_print if possible.
filesystems - ebpf biolatency 是否会自行产生进程?
我正在尝试在不同的架构和文件系统上运行性能测试以了解 I/O 延迟。ebpf 是否会根据灵活 I/O 等用户输入产生不同的进程,还是我需要运行一些工作负载?
io - 如何运行 ebpf biolatency 工具?
我正在尝试在不同的架构和文件系统上运行性能测试以了解 I/O 延迟。ebpf 工具(如 biosnoop、biolatency)是否会根据灵活 I/O 等用户输入产生不同的进程,还是我需要运行一些工作负载?
postgresql - 你能描述一下这个FlameGraph(Postgres,RHEL7)为什么CPU等待和阻塞进程吗
我正在测试 PostgreSQL(v12)(server1) 并使用 pgbench (server2) 应用负载。
裸机 server1 配置:
- 80 个逻辑 CPU(Intel Xeon Gold 6230 2.10GHz)
- 800GB 内存
- 用于 Postgres 表空间 (550Gb) 的 RAM 中的 tmpfs 磁盘
- 红帽 EntLinux 7.9、3.10.0-1160.15.2.el7.x86_64
我看到很多(~5-40)被阻塞的进程(vmstat 列“b”)和 CPU 等待(~25%)。通常,它表示降级 IO 系统,但现在我使用 RAM 磁盘 (tmpfs)。
交换失踪。
我使用 bcc-tools 将 off-cpu 事件收集为“offcputime -f 10”并制作了一个 FlameGraph。
但我不明白发生了什么:)
我看到 43% 的正常上下文切换和一点点“bit_wait_io”。
什么是“bit_wait_io”,为什么是 CPU 等待?
谢谢
ebpf - open / openat 相对文件名的完整路径
使用来自iovisor/bcc的opensnoop.py,我正在尝试扩展 ebpf 代码以处理从相对路径中提取完整路径。
例如,运行 opensnoop.py 并在另一个终端运行cat anything.txt
, opensnoop 中的输出将显示相对文件名,而不是绝对路径:
我已经在 opensnoop.py 中叙述了我应该考虑修改的代码块,并添加了一些类似于以下的逻辑:
我被困的地方是 TODO 部分,似乎没有很多/任何使用新bpf_d_path
辅助函数的好例子
linux - “此平台不支持 SMP”
我目前正在尝试在安装了 Ubuntu 的 Raspberry Pi 3 Model B V1.2 上使用 eBPF 程序。为了管理编译、系统调用和所有这些,我使用 BPF 编译器集合。
每当 BCC 尝试编译程序时,我都会收到大量错误,其中一个是“此平台不支持 SMP”,另一个是“ARMv6 之前的 CPU 不支持 SMP”。
这对我来说似乎很奇怪,因为查看标题,只有在 __LINUX_ARM_ARCH__ 小于 6 时才会出现这些标题。
“uname -m”给了我armv7l,这应该足够了,对吧?查看内核配置,CONFIG_SMP 是 y,CONFIG_CPU_32v7 也是 y。据我了解,一切似乎都是正确的。
那么为什么它不起作用,我该如何解决呢?
另外,如果您需要更多信息,我很乐意提供。我从来没有对这些东西如此深入,所以我不知道什么更重要,什么不那么重要。