以intel网卡IGB驱动为例,网口eth0与网卡eth1的中断进行亲核性配置。两个网卡驱动起来之后,查看其中断分配情况。如下为eth0的中断217到225共9个中断,除去217号中断,其余8个一半为接收队列中断,另一半为发送队列中断。
/ # cat /proc/interrupts | grep eth0
217: 1 0 0 0 IR-PCI-MSI-edge eth0
218: 411 875 0 0 IR-PCI-MSI-edge eth0-rx-0
219: 411 875 0 0 IR-PCI-MSI-edge eth0-rx-1
220: 411 875 0 0 IR-PCI-MSI-edge eth0-rx-2
221: 411 875 0 0 IR-PCI-MSI-edge eth0-rx-3
222: 411 875 0 0 IR-PCI-MSI-edge eth0-tx-0
223: 411 875 0 0 IR-PCI-MSI-edge eth0-tx-1
224: 411 875 0 0 IR-PCI-MSI-edge eth0-tx-2
225: 412 875 0 0 IR-PCI-MSI-edge eth0-tx-3
网卡eth1的中断分配情况与eth0类似,自中断号236到243为4个接收队列中断和4个发送队列中断。
/ # cat /proc/interrupts | grep eth1
235: 1 0 0 0 IR-PCI-MSI-edge eth1
236: 482 806 0 0 IR-PCI-MSI-edge eth1-rx-0
237: 482 806 0 0 IR-PCI-MSI-edge eth1-rx-1
238: 483 805 0 0 IR-PCI-MSI-edge eth1-rx-2
239: 483 805 0 0 IR-PCI-MSI-edge eth1-rx-3
240: 483 805 0 0 IR-PCI-MSI-edge eth1-tx-0
241: 485 804 0 0 IR-PCI-MSI-edge eth1-tx-1
242: 484 804 0 0 IR-PCI-MSI-edge eth1-tx-2
243: 484 804 0 0 IR-PCI-MSI-edge eth1-tx-3
系统默认的亲核性为掩码F,由于当前处理器为4核心,表明每个中断都有可能调度到任意个核心上处理。
/ # cat /proc/irq/218/smp_affinity
f
/ # cat /proc/irq/236/smp_affinity
f
在配置亲核性之前,我们看一下默认的接收流的哈希配置,以eth0设备为例,默认的tcp4与tcp6的哈希字段相同,分别为源IP地址、目的IP地址、源端口号和目的端口号。哈希结果决定了数据包将发送到4个接收队列中的哪一个:
/ # ethtool --show-ntuple eth0 rx-flow-hash tcp4
TCP over IPV4 flows use these fields for computing Hash flow key:
IP SA
IP DA
L4 bytes 0 & 1 [TCP/UDP src port]
L4 bytes 2 & 3 [TCP/UDP dst port]
/ #
/ # ethtool --show-ntuple eth0 rx-flow-hash tcp6
TCP over IPV6 flows use these fields for computing Hash flow key:
IP SA
IP DA
L4 bytes 0 & 1 [TCP/UDP src port]
L4 bytes 2 & 3 [TCP/UDP dst port]
默认的udp4和udp6的哈希字段相同,分别为源IP地址和目的IP地址。
/ # ethtool --show-ntuple eth0 rx-flow-hash udp4
UDP over IPV4 flows use these fields for computing Hash flow key:
IP SA
IP DA
/ #
/ # ethtool --show-ntuple eth0 rx-flow-hash udp6
UDP over IPV6 flows use these fields for computing Hash flow key:
IP SA
IP DA
目前不需要改动接收哈希配置。在默认的接收哈希配置和中断亲核性配置情况下,进行实际的流量转发测试,记录测试结果。之后,改变中断的亲核性,再次实测一下系统的转发性能。将每个队列的中断绑定在一个核心上,如下的eth0设备:
/ # echo 1 > /proc/irq/218/smp_affinity
/ # echo 2 > /proc/irq/219/smp_affinity
/ # echo 4 > /proc/irq/220/smp_affinity
/ # echo 8 > /proc/irq/221/smp_affinity
/ # echo 1 > /proc/irq/222/smp_affinity
/ # echo 2 > /proc/irq/223/smp_affinity
/ # echo 4 > /proc/irq/224/smp_affinity
/ # echo 8 > /proc/irq/225/smp_affinity
同样,将设备eth1的队列中断都散列在不同的处理器核心上,如下:
/ # echo 1 > /proc/irq/236/smp_affinity
/ # echo 2 > /proc/irq/237/smp_affinity
/ # echo 4 > /proc/irq/238/smp_affinity
/ # echo 8 > /proc/irq/239/smp_affinity
/ # echo 1 > /proc/irq/240/smp_affinity
/ # echo 2 > /proc/irq/241/smp_affinity
/ # echo 4 > /proc/irq/242/smp_affinity
/ # echo 8 > /proc/irq/243/smp_affinity
后一个测试完成之后,中断在每个核心上的处理统计如下,以eth0设备为例,eth1与之相同,很明显每个核心处理了几乎相同数量的中断:
/ # cat /proc/interrupts | grep eth0
217: 8 0 0 0 IR-PCI-MSI-edge eth0
218: 4058641 3 0 0 IR-PCI-MSI-edge eth0-rx-0
219: 78 4076468 0 0 IR-PCI-MSI-edge eth0-rx-1
220: 78 3 4108261 0 IR-PCI-MSI-edge eth0-rx-2
221: 78 3 0 4063524 IR-PCI-MSI-edge eth0-rx-3
222: 4131960 3 0 0 IR-PCI-MSI-edge eth0-tx-0
223: 78 4120127 0 0 IR-PCI-MSI-edge eth0-tx-1
224: 78 3 4159907 0 IR-PCI-MSI-edge eth0-tx-2
225: 81 3 0 3421841 IR-PCI-MSI-edge eth0-tx-3
以实际测试来说,后者相较前者性能提升了大约50%。测试用处理器型号为4核心的: Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz。