1

我编写了一个内核模块并使用 dev_add_pack 来获取所有传入的数据包。根据给定的过滤规则,如果数据包匹配,我将其转发到用户空间。

当我加载这个内核模块并使用 sipp 发送 udp 流量时,出现 ksoftirqd 进程并开始消耗 cpu。(我正在通过 top 命令对此进行测试)

有什么办法可以节省cpu?

4

1 回答 1

2

我猜你使用 ETH_P_ALL 类型将你的 packet_type 结构注册到协议栈。而且我认为你的 packet_type->func 是瓶颈,它可能本身会消耗大量的 cpu,或者它破坏了现有的协议栈模型并触发其他现有的 packet_type 函数来消耗 cpu。所以节省cpu的唯一方法是优化你的packet_type->func。如果你的函数太复杂,你应该考虑将函数拆分为几个部分,使用简单的部分作为在ksoftirqd上下文中运行的packet_type->func,而复杂的部分应该放在其他内核线程上下文中(你可以创建如果需要,内核模块中的新线程)。

于 2013-03-22T07:56:31.333 回答