linux | 网络数据包softirq 软中断与CPU
发布网友
发布时间:2024-10-03 21:13
我来回答
共1个回答
热心网友
时间:2024-11-28 06:20
Linux系统在每个CPU上创建一个ksoftirqd内核线程,软中断(softirqs)在内核编译时就预先定义好,例如网络接收数据包对应的NET_RX_SOFTIRQ软中断。软中断是一种静态机制,若想新增一种软中断类型,需修改内核并重新编译。
在Linux内核代码中,通过open_softirq函数注册网卡收发数据包的软中断处理函数,如open_softirq(NET_TX_SOFTIRQ,net_tx_action)和open_softirq(NET_RX_SOFTIRQ,net_rx_action)。
NAPI(New API)设计旨在提高处理传入卡数据包的效率。硬中断昂贵,因为它无法被中断。即使使用中断合并,中断处理器将完全独占一个CPU核心。NAPI设计允许驱动程序进入轮询模式,而不是每次接收数据包时硬中断。在正常运行时,会引发初始硬中断或IRQ,随后由SoftIRQ处理器使用NAPI例程轮询卡。轮询程序设有预算*,*代码在CPU上运行的时间。此设定防止SoftIRQ独占CPU。完成后,内核退出轮询程序并重新启动,整个过程重复。
若SoftIRQ运行时间过短,传入数据速率可能超过内核消耗缓冲区的速度。结果,NIC缓冲区溢出,流量丢失。有时需要增加允许SoftIRQ在CPU上运行的时间,即netdev_budget。默认预算值为300,意味着在离开CPU之前,SoftIRQ进程能从NIC排出300条消息。