1. 查看每一个cpu的负载以及中断指标:(参考:https://www.cnblogs.com/tcicy/p/10197136.html)
业务方在使用KVM虚拟机进行性能压测时,发现某一个核的softirq占比特别高,如下所示:
mpstat -P ALL 1
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 9.96 0.00 3.17 0.01 0.71 2.00 0.00 0.00 0.00 84.15
Average: 0 0.30 0.00 0.51 0.00 0.05 1.24 0.00 0.00 0.00 97.89
Average: 1 55.32 0.00 18.52 0.00 0.53 0.14 0.00 0.00 0.00 25.49
Average: 2 37.03 0.00 15.00 0.00 11.73 12.93 0.00 0.00 0.00 23.30
Average: 3 56.76 0.00 18.98 0.00 0.50 0.14 0.00 0.00 0.00 23.62
Average: 4 50.96 0.00 11.05 0.00 1.41 0.07 0.00 0.00 0.00 36.52
Average: 5 55.81 0.00 19.03 0.00 0.47 0.14 0.00 0.00 0.00 24.56
Average: 6 43.61 0.00 10.13 0.00 0.49 0.09 0.00 0.00 0.00 45.68
Average: 7 57.33 0.00 19.45 0.00 0.47 0.13 0.00 0.00 0.00 22.62
Average: 8 44.77 0.00 9.83 0.00 0.42 0.09 0.00 0.00 0.00 44.90
Average: 9 1.08 0.00 2.77 0.00 1.42 0.08 0.00 0.00 0.00 94.65
Average: 10 0.04 0.00 0.17 0.00 1.21 6.78 0.00 0.00 0.00 91.79
Average: 11 0.02 0.00 0.06 0.00 0.01 0.01 0.00 0.00 0.00 99.89
Average: 12 0.02 0.00 0.16 0.00 1.39 7.04 0.00 0.00 0.00 91.39
Average: 13 0.02 0.00 0.08 0.01 0.01 0.00 0.00 0.00 0.00 99.88
Average: 14 0.00 0.00 0.07 0.00 0.00 0.00 0.00 0.00 0.00 99.92
Average: 15 0.04 0.00 0.09 0.00 0.00 0.00 0.00 0.00 0.00 99.86
Average: 16 0.02 0.00 0.05 0.00 0.00 0.00 0.00 0.00 0.00 99.92
Average: 17 0.04 0.00 0.03 0.00 0.01 0.01 0.00 0.00 0.00 99.91
Average: 18 0.00 0.00 0.04 0.00 0.01 0.01 0.00 0.00 0.00 99.94
Average: 19 0.05 0.00 0.23 0.03 0.00 0.00 0.00 0.00 0.00 99.68
Average: 20 0.03 0.00 0.13 0.00 1.05 7.76 0.00 0.00 0.00 91.03
Average: 21 0.02 0.00 0.03 0.00 0.00 0.00 0.00 0.00 0.00 99.94
Average: 22 0.01 0.00 0.01 0.00 0.00 0.00 0.00 0.00 0.00 99.98
Average: 23 0.02 0.00 0.02 0.09 0.00 0.00 0.00 0.00 0.00 99.86
Average: 24 0.00 0.00 0.12 0.00 3.17 15.49 0.00 0.00 0.00 81.22
Average: 25 0.00 0.00 0.18 0.00 0.00 0.00 0.00 0.00 0.00 99.82
Average: 26 0.03 0.00 0.06 0.00 0.00 0.04 0.00 0.00 0.00 99.86
Average: 27 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.99
Average: 28 0.02 0.00 0.03 0.00 0.00 0.05 0.00 0.00 0.00 99.90
Average: 29 0.44 0.00 0.94 0.00 0.02 0.01 0.00 0.00 0.00 98.59
Average: 30 0.01 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0.00 99.97
Average: 31 0.01 0.00 0.08 0.05 0.00 0.00 0.00 0.00 0.00 99.85
Average: 32 0.05 0.00 0.08 0.00 0.00 0.00 0.00 0.00 0.00 99.85
Average: 33 0.03 0.00 0.04 0.00 0.00 0.00 0.00 0.00 0.00 99.91
Average: 34 0.00 0.00 0.10 0.00 1.33 6.77 0.00 0.00 0.00 91.79
Average: 35 0.06 0.00 0.15 0.00 0.01 0.00 0.00 0.00 0.00 99.77
Average: 36 0.06 0.00 0.10 0.00 1.30 10.50 0.00 0.00 0.00 88.05
Average: 37 0.02 0.00 0.07 0.00 0.02 0.02 0.00 0.00 0.00 99.86
Average: 38 0.05 0.00 0.14 0.00 1.35 10.39 0.00 0.00 0.00 88.07
Average: 39 0.02 0.00 0.13 0.18 0.01 0.01 0.00 0.00 0.00 99.64
其实,看到前面mpstat的显示,如果对网卡多队列,RPS/RFS很熟悉,就会意识到他们在这里不适用。 一句话解释:这个kvm虚拟机只有一个网卡,有网络包到达这个网卡后,它会给某一个cpu(如果没有设置亲和性,这个可以认为是随机的一个cpu,然后就会一直固定在这个cpu上)发中断,通知该cpu来处理这个包,然后cpu就会触发一个软中断把该包送到tcp/ip协议栈(对于tcp包而言)里去处理,该包被放入某一个socket的receive buffer中(如果是一个数据包),软中断结束。
%soft就是指的CPU耗在软中断处理上的时间。
可以看到核1的%soft很高,其他的核的%soft基本为0.
所以就想着把核1的%soft给均摊下,是否可以提升QPS。
我们想到的方法是网卡多队列,或者RPS/RFS。用这种手段来把网卡软中断给均摊到其他的核上去。
2. 查看每个CPU上的中断变化:
watch -d -n 1 'cat /proc/interrupts'
watch -d -n 1 'cat /proc/interrupts |grep -E "enp5s0f3"'
Every 1.0s: cat /proc/interrupts |grep -E "enp5s0f3" localhost.localdomain: Thu Jan 21 20:46:10 2021
95: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 IR-PCI-MSI 2627584-edge enp5s0f3
96: 0 0 568542973 0 16929902 0 3284654 0 182591750 0 2263993 0 3753337 0 74401525
0 216870268 0 552241418 0 15685 0 3674387 0 112125 0 2881645 0 3546554 0 5439101
0 5256804 0 45385219 0 1656062 0 69829199 0 IR-PCI-MSI 2627585-edge enp5s0f3-TxRx-0
97: 0 0 4607649 0 1479663 0 2786155 0 46627891 0 736533668 0 3750151 0 106562556
0 3765484 0 1693397 0 554069952 0 508746 0 18870 0 3239848 0 9600866 0 71546816
0 1272910 0 13978513 0 12613923 0 13481427 0 IR-PCI-MSI 2627586-edge enp5s0f3-TxRx-1
98: 0 0 0 0 510 0 11880 0 1803 0 14090 0 96163845 0 0
0 360800202 0 3084618 0 696758357 0 9 0 570 0 374160885 0 95515 0 1907818
0 6936473 0 190 0 196122799 0 8473283 0 IR-PCI-MSI 2627587-edge enp5s0f3-TxRx-2
99: 0 0 2245 0 8332855 0 36497 0 6115511 0 25791519 0 0 0 7455
0 167804562 0 543627622 0 0 0 18982920 0 541808143 0 2219164 0 294297212 0 1431021
0 27269 0 10280 0 114868812 0 6056541 0 IR-PCI-MSI 2627588-edge enp5s0f3-TxRx-3
100: 0 0 9155 0 69422794 0 18162315 0 4466926 0 189110717 0 0 0 11995261
0 41574430 0 1680987 0 8875 0 1525786 0 521395 0 2322062 0 364377557 0 823854973
0 40 0 17336324 0 940570 0 22848418 0 IR-PCI-MSI 2627589-edge enp5s0f3-TxRx-4
101: 0 0 4931536 0 53429823 0 631213311 0 5700165 0 371677111 0 12402 0 1100738
0 65434558 0 896685 0 378432869 0 7574076 0 5807676 0 5615317 0 8297189 0 14207899
0 14640 0 194774810 0 3579341 0 5431105 0 IR-PCI-MSI 2627590-edge enp5s0f3-TxRx-5
102: 0 0 761536 0 18302532 0 60965 0 2862940 0 7080043 0 4744878 0 295883
0 0 0 3719027 0 0 0 124772699 0 859454102 0 46192 0 2767191 0 6519441
0 0 0 700 0 684847631 0 8185540 0 IR-PCI-MSI 2627591-edge enp5s0f3-TxRx-6
103: 0 0 9565 0 4940735 0 1352508 0 55642 0 61360 0 554759678 0 82639147
0 360683 0 1632161 0 0 0 2458 0 25397625 0 4196539 0 185625265 0 1520
0 4347106 0 848968539 0 65254 0 32430039 0 IR-PCI-MSI 2627592-edge enp5s0f3-TxRx-7
网卡多队列配置如下:
[root@localhost ~]# cat /proc/irq/99/smp_affinity
0000,00000400
[root@localhost ~]# cat /proc/irq/100/smp_affinity
0040,00000000
[root@localhost ~]# cat /proc/irq/101/smp_affinity
0004,00000000
[root@localhost ~]# cat /proc/irq/102/smp_affinity
0000,01000000
[root@localhost ~]# cat /proc/irq/103/smp_affinity
0000,00001000
[root@localhost ~]# cat /proc/irq/104/smp_affinity
0000,10000000
[root@localhost ~]# cat /proc/irq/103/smp_affinity_list
12
[root@localhost ~]# cat /proc/irq/102/smp_affinity_list
24
[root@localhost ~]# cat /proc/irq/101/smp_affinity_list
34
[root@localhost ~]# cat /proc/irq/100/smp_affinity_list
38
[root@localhost ~]# cat /proc/irq/99/smp_affinity_list
10
[root@localhost ~]# cat /proc/irq/98/smp_affinity_list
36
[root@localhost ~]# cat /proc/irq/97/smp_affinity_list
20
[root@localhost ~]# cat /proc/irq/96/smp_affinity_list
2
[root@localhost ~]# echo 0080,00000000 > /proc/irq/103/smp_affinity
[root@localhost ~]# echo 0040,00000000 > /proc/irq/102/smp_affinity
[root@localhost ~]# echo 0020,00000000 > /proc/irq/101/smp_affinity
[root@localhost ~]# echo 0010,00000000 > /proc/irq/100/smp_affinity
[root@localhost ~]# cat /proc/irq/103/smp_affinity_list
39
[root@localhost ~]# cat /proc/irq/102/smp_affinity_list
38
[root@localhost ~]# cat /proc/irq/101/smp_affinity_list
37
[root@localhost ~]# cat /proc/irq/100/smp_affinity_list
36
[root@localhost ~]# echo 000f,00000000 > /proc/irq/99/smp_affinity
[root@localhost ~]# echo 0008,00000000 > /proc/irq/98/smp_affinity
[root@localhost ~]# echo 0004,00000000 > /proc/irq/97/smp_affinity
[root@localhost ~]# echo 0002,00000000 > /proc/irq/96/smp_affinity
需要先把irqbalance关闭:
关闭方式:
停止irqbalance服务。
systemctl stop irqbalance.service
关闭irqbalance服务。
systemctl disable irqbalance.service
查看irqbalance服务状态是否已关闭。
systemctl status irqbalance.service
网卡多队列配置脚本:
cat /proc/irq/96/smp_affinity
cat /proc/irq/97/smp_affinity
cat /proc/irq/98/smp_affinity
cat /proc/irq/99/smp_affinity
cat /proc/irq/100/smp_affinity
cat /proc/irq/101/smp_affinity
cat /proc/irq/102/smp_affinity
cat /proc/irq/103/smp_affinity
cat /proc/irq/103/smp_affinity_list
cat /proc/irq/102/smp_affinity_list
cat /proc/irq/101/smp_affinity_list
cat /proc/irq/100/smp_affinity_list
cat /proc/irq/99/smp_affinity_list
cat /proc/irq/98/smp_affinity_list
cat /proc/irq/97/smp_affinity_list
cat /proc/irq/96/smp_affinity_list
echo 0080,00000000 > /proc/irq/103/smp_affinity
echo 0040,00000000 > /proc/irq/102/smp_affinity
echo 0020,00000000 > /proc/irq/101/smp_affinity
echo 0010,00000000 > /proc/irq/100/smp_affinity
echo 0008,00000000 > /proc/irq/99/smp_affinity
echo 0004,00000000 > /proc/irq/98/smp_affinity
echo 0002,00000000 > /proc/irq/97/smp_affinity
echo 0001,00000000 > /proc/irq/96/smp_affinity
cat /proc/irq/96/smp_affinity
cat /proc/irq/97/smp_affinity
cat /proc/irq/98/smp_affinity
cat /proc/irq/99/smp_affinity
cat /proc/irq/100/smp_affinity
cat /proc/irq/101/smp_affinity
cat /proc/irq/102/smp_affinity
cat /proc/irq/103/smp_affinity
cat /proc/irq/103/smp_affinity_list
cat /proc/irq/102/smp_affinity_list
cat /proc/irq/101/smp_affinity_list
cat /proc/irq/100/smp_affinity_list
cat /proc/irq/99/smp_affinity_list
cat /proc/irq/98/smp_affinity_list
cat /proc/irq/97/smp_affinity_list
cat /proc/irq/96/smp_affinity_list