当网卡收到数据包时会产生中断,通知内核有新数据包,然后内核调用中断处理程序进行响应,把数据包从网卡缓存拷贝到内存

中断

# cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       
  3:     204093     942723     502178     584481     GICv2  30 Level     arch_timer
  7:          0          0          0          0     GICv2 175 Level     arm-pmu
  8:          0          0          0          0     GICv2 176 Level     arm-pmu
  9:          0          0          0          0     GICv2 177 Level     arm-pmu
 10:          0          0          0          0     GICv2 178 Level     arm-pmu
 13:          0          0          0          0     GICv2 156 Level     zynqmp-dma
 14:          0          0          0          0     GICv2 157 Level     zynqmp-dma
 15:          0          0          0          0     GICv2 158 Level     zynqmp-dma
 16:          0          0          0          0     GICv2 159 Level     zynqmp-dma
 17:          0          0          0          0     GICv2 160 Level     zynqmp-dma
 18:          0          0          0          0     GICv2 161 Level     zynqmp-dma
 19:          0          0          0          0     GICv2 162 Level     zynqmp-dma
 20:          0          0          0          0     GICv2 163 Level     zynqmp-dma
 23:   45766295          0          0          0     GICv2  95 Level     eth0, eth0

配置中断均衡
法一:

# echo f > /proc/irq/23/smp_affinity

以十六进制输入

法二:

# echo 0-3 > /proc/irq/23/smp_affinity_list

法三:

# apt-get install irqbalance

查看软中断占用

cat /proc/softirqs 
                    CPU0       
          HI:          1
       TIMER:  247177394
      NET_TX:       1300
      NET_RX:  322174830
       BLOCK:    2828269
BLOCK_IOPOLL:          0
     TASKLET:         16
       SCHED:          0
     HRTIMER:          0
         RCU:  178199932

RPS/RFS
RPS 全称是 Receive Packet Steering,这是Google工程师 Tom Herbert (therbert@google.com )提交的内核补丁,在2.6.35进入Linux内核。这个patch采用软件模拟的方式,实现了多队列网卡所提供的功能,分散了在多CPU系统上数据接收时的负载,把软中断分到各个CPU处理,而不需要硬件支持,大大提高了网络性能。
RFS 全称是 Receive Flow Steering,这也是Tom提交的内核补丁,它是用来配合RPS补丁使用的,是RPS补丁的扩展补丁,它把接收的数据包送达应用所在的CPU上,提高cache的命中率。

配置RPS/RFS

# cat /proc/sys/net/core/rps_sock_flow_entries 
# echo N > /proc/sys/net/core/rps_sock_flow_entries

N:根据活跃连接数来配置

# cat /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
# echo N > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt

eth0:网卡设备(可能多个)
rx-0:接收队列(可能多个)
N:rps_sock_flow_entries/接收队列的数量(做除法)

可以使用Netperf做性能测试