内核收包解析

  • 数据结构

每个cpu都配有一个napi queue,用于放待处理的napi结构,napi结构里有对应的网卡、poll函数等重要信息(如果是非napi,每个cpu的这个napi queue里内置了2个东东:一个特殊的napi用于兼容napi处理,其含有一个特殊的poll函数;另外一个是input queue,用于存放收到的包)。

  • 硬中断处理

当有包来时,收包的该网卡的对应硬中断(multiqueue时一个网卡会对应多个中断)在某个cpu上的处理:

调用函数将该网卡的该中断对应的napi结构(napi时,每个网卡的每个中断都会有一个对应的napi结构;非napi时,则使用该cpu的napi queue里内置的napi结构,同时会将包收至该napi queue里的input queue,一次硬中断里最多放1000个,否则丢弃)放到该cpu的napi queue里

然后触发软中断,剩下就是软中断的事了

  • 软中断处理

该cpu上的软中断的处理:

逐个处理本cpu的napi queue里的各个napi结构体,其实就是调用该结构体里标识的网卡的poll函数进行收包并上送至协议栈(非napi时不需要poll了,直接从上述的input queue里读),处理时遵守三个原则:(第一个违反了则跳过该设备,后两个违反了则跳出本轮软中断,由下一轮软中断继续处理)

1)本轮软中断里该网卡的各个napi的总包数不超过64个

2)本轮软中断里所有收包数不能超过300个

3)本轮软中断里总耗时不能超过2ms