【问题标题】:protocol handler using dev_add_pack consumes cpu使用 dev_add_pack 的协议处理程序消耗 cpu
【发布时间】:2013-03-21 12:21:56
【问题描述】:

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

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

有没有办法节省cpu?

【问题讨论】:

    标签: c linux linux-kernel kernel


    【解决方案1】:

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

    【讨论】:

    • 是的,tian 绝对正确,你是正确的 下面是我的处理程序结构和函数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,即使没有匹配的规则。我该怎么办?
    • 嗨 John:你知道 fd=socket(PF_PACKET, mode, htons(ETH_P_ALL)) 也会触发内核代码调用 dev_add_pack() 来添加 ETH_P_ALL packet_type,函数是 packet_rcv_spkt()。它工作正常。所以我认为您的功能可以使用这种替代方法,并且代码在用户空间中最多。或者你坚持你的方法,你可以比较 my_packet_handler 和 packet_rcv_spkt() 看看它们之间的区别。
    • thanx tian,非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 2010-12-11
    • 1970-01-01
    • 2016-09-11
    • 2016-10-06
    • 2011-07-14
    • 2011-01-15
    • 2013-04-28
    相关资源
    最近更新 更多