首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用eBPF内核程序生成延迟

如何使用eBPF内核程序生成延迟
EN

Stack Overflow用户
提问于 2022-06-09 03:05:43
回答 1查看 229关注 0票数 0

我试图使用eBPF内核程序对出口包产生延迟确认。我正在使用密件抄送运行python+c程序。我尝试了用delay.h函数来实现mdelay.h函数的mdelay.h函数,给出了“程序使用外部函数无法解决”的LLVM错误。

然后,我尝试实现睡眠功能:接受3个变量: tprev (在启动prog时获得当前时间)tnow(当循环启动时获得当前时间,并在每次迭代中获得当前时间的更新)定时器:这是我们希望程序延迟的持续时间。that循环是: while (( tprev)≤定时器),但是ebpf将其视为n个无限循环,并给出了检测到的无限循环的误差。而不是无限循环。

是否有一种方法在Ack中引入延迟,或者在eBPF程序中引入一般的延迟?

EN

回答 1

Stack Overflow用户

发布于 2022-06-09 12:29:54

简短的回答是“否”(不在eBPF中)。至少在5.18内核中没有。这是因为eBPF程序,特别是在网络堆栈中运行的程序,通常是从不应该休眠的代码中调用的。

在您的情况下,最有用的可能是TC (流量控制)程序可以要求TC为您延迟数据包。实际的延迟发生在eBPF程序之外的TC子系统中。您可以通过设置__sk_buff->tstamp请求TC在给定时间发送数据包。注意:这只适用于母线(传出)通信量,而不适用于进入(内开)通信量。这种行为也可以通过TC配置触发,而无需使用eBPF。

尝试使用delay.h库实现mdelay.h等函数,给出了“程序使用外部函数无法解决”的LLVM错误。

是的,您不能在eBPF程序中使用stdlib,因为它们使用eBPF中不可用的内核工具。

边注:

我们确实有“睡眠”程序,但是只有syscall、LSM和跟踪程序才能入睡。。“睡眠”并不意味着我们可以调用具有持续时间的某种睡眠助手,它意味着我们可以调用助手函数,这些函数反过来可能会休眠(例如,堆栈)。所以你不能控制程序的睡眠时间。

另一个与时间相关的特性是BPF定时器,它允许您设置定时器并在给定时间后执行回调。这里的限制是您不能向这个回调传递任何参数,而且它是在没有上下文的情况下调用的。因此,在设置定时器后,原始程序将继续并像往常一样返回。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72554292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档