当网卡收到数据包时会产生中断,通知内核有新数据包,然后内核调用中断处理程序进行响应,把数据包从网卡缓存拷贝到内存
中断
# 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做性能测试