想法是使用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
to napi_poll()
当类似的技巧适用于net_rx_action()
?
大多数时候Failed to attach BPF to kprobe
错误是由内联函数引起的。正如中所解释的Kprobes 文档 https://www.kernel.org/doc/Documentation/kprobes.txt(部分Kprobes Features and Limitations
),如果目标函数是内联的,Kprobes 将无法附加。自从napi_poll是静态的 https://elixir.free-electrons.com/linux/v4.14.9/source/net/core/dev.c#L5524,它可能已在编译时内联。
您可以检查内核符号,如果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
is not.
此问题有多种解决方法,具体取决于您的目标。
- 如果你不介意重新编译内核,你可以使用Linux inline属性 https://www.kernel.org/doc/local/inline.html确保
napi_poll
不是内联的。
- 如果你不能改变你的内核,通常的解决方法是找到一个调用函数
napi_poll
提供相同的信息。调用的函数napi_poll
如果它提供了足够的信息并且本身没有内联,也可以工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)