2

想法是用来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()

4

1 回答 1

4

大多数情况下,Failed to attach BPF to kprobe错误是由内联函数引起的。如Kprobes 文档(第 1 节Kprobes Features and Limitations)中所述,如果内联目标函数,Kprobes 将无法附加。由于napi_poll是 static,它可能在编译时被内联。

您可以检查内核符号是否napi_poll已内联:

$ cat /boot/System.map-`uname -r` | grep " napi_poll"
$
$ cat /boot/System.map-`uname -r` | grep " net_rx_action"
ffffffff817d8110 t net_rx_action

在我的系统上,napi_poll是内联的,而net_rx_action不是内联的。


此问题有多种解决方法,具体取决于您的目标。

  1. 如果您不介意重新编译内核,可以使用Linuxinline属性来确保napi_poll没有内联。
  2. 如果您无法更改内核,通常的解决方法是找到napi_poll提供相同信息的调用函数。如果调用的函数napi_poll提供了足够的信息并且本身没有内联,则它也可以工作。
于 2017-12-27T12:10:34.293 回答