我编写了一个内核模块并使用dev_add_pack来获取所有传入的数据包。 根据给定的过滤规则,如果数据包匹配,我将其转发到用户空间。
当我加载此内核模块并使用sipp发送udp流量时, ksoftirqd进程出现并开始消耗cpu。 (我是用top命令测试的)
有什么方法可以保存cpu吗?
答案 0 :(得分:2)
我猜您使用ETH_P_ALL类型将packet_type结构注册到协议栈。我认为你的packet_type-> func是瓶颈,它可能本身消耗大量的cpu,或者它破坏了现有的协议栈模型并触发其他现有的packet_type函数来消耗cpu。因此,保存CPU的唯一方法是优化packet_type-> func。如果你的函数太复杂,你应该考虑将函数吐出到几个部分,使用简单部分作为在ksoftirqd上下文中运行的packet_type-> func,而复杂的部分应该放到其他内核线程上下文中(你可以如果需要,在内核模块中创建新线程。