【发布时间】:2013-03-21 12:21:56
【问题描述】:
我编写了一个内核模块并使用 dev_add_pack 来获取所有传入的数据包。 根据给定的过滤规则,如果数据包匹配,我将其转发到用户空间。
当我加载这个内核模块并使用 sipp 发送 udp 流量时, ksoftirqd 进程出现并开始消耗cpu。 (我正在通过 top 命令进行测试)
有没有办法节省cpu?
【问题讨论】:
标签: c linux linux-kernel kernel
我编写了一个内核模块并使用 dev_add_pack 来获取所有传入的数据包。 根据给定的过滤规则,如果数据包匹配,我将其转发到用户空间。
当我加载这个内核模块并使用 sipp 发送 udp 流量时, ksoftirqd 进程出现并开始消耗cpu。 (我正在通过 top 命令进行测试)
有没有办法节省cpu?
【问题讨论】:
标签: c linux linux-kernel kernel
我猜你使用 ETH_P_ALL 类型将你的 packet_type 结构注册到协议栈。而且我认为你的 packet_type->func 是瓶颈,它可能本身会消耗大量的 cpu,或者它破坏了现有的协议栈模型并触发其他现有的 packet_type 函数来消耗 cpu。所以节省cpu的唯一方法是优化你的packet_type->func。如果你的函数太复杂,你应该考虑将函数拆分为几个部分,使用简单的部分作为在ksoftirqd上下文中运行的packet_type->func,而复杂的部分应该放在其他内核线程上下文中(你可以创建如果需要,可以在内核模块中添加新线程)。
【讨论】:
static struct packet_type my_proto = { .type = __constant_htons(ETH_P_ALL), .func = my_packet_handler, }; 虽然“my_packet_handler”函数很简单。我正在通过其 src 地址过滤数据包,并且在匹配时我将该数据包放入 work_queue。问题是当我加载模块并启动 udp 流量时,ksoftirqd 出现并开始消耗 cpu,即使没有匹配的规则。我该怎么办?