某生产系统前端LVS软负载均衡业务会话量达5百万级,某日出现业务卡顿,LVS服务器Ping响应丢包和时延较大,本文记录了调优过程。
一、问题现象:
某生产系统前端LVS软负载均衡业务会话量达5百万级,服务器为8核16G的虚拟机,某日出现业务卡顿,LVS服务器Ping响应丢包和时延较大。top查看CPU负荷如下图:
可以看到CPU已完全跑满,业务当然要受影响了。
二、原因分析
1、经与业务侧沟通,业务侧进行了策略调整,将原长连接调整为短连接了,业务终端并没有增加,但每秒连接量有大幅增加。
2、检查业务情况,高CPU占用的进程均为ksoftirqd进程,显示为网卡软中断切换占据了全部CPU时间,导致系统卡顿,响应出现问题。
三、问题处理
1、首先尝试对虚拟服务器进行CPU扩容,从8核16G调整为16核16G,增加了8个CPU核,重启后检查服务器负荷如下:
2、此时服务器不再卡顿、Ping也恢复正常。分析可知,Cpu0目前负荷降下来了,服务器操作就不受影响了,但明显可以看到CPU 1、3、5、7、9、10、12、14核处于跑满的情况,对应占用CPU核的进程还是ksoftirqd,业务连接还是不畅。
3、检查irqbalance服务状态,可以看到irqbalance服务运行正常。
[root@lvs-10 ~]# systemctl status irqbalance
● irqbalance.service - irqbalance daemon
Loaded: loaded (/usr/lib/systemd/system/irqbalance.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-03-20 22:11:44 CST; 10h ago
Docs: man:irqbalance(1)
https://github.com/Irqbalance/irqbalance
Process: 1091 ExecStart=/usr/sbin/irq_balancer (code=exited, status=0/SUCCESS)
Main PID: 1098 (irqbalance)
Tasks: 2 (limit: 98893)
Memory: 588.0K
CGroup: /system.slice/irqbalance.service
└─1098 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
3月 20 22:11:44 lvs-10.227.49.244 systemd[1]: Starting irqbalance daemon...
3月 20 22:11:44 lvs-10.227.49.244 systemd[1]: Started irqbalance daemon.
4、检查网卡的中断占用情况
[root@lvs-10 ~]# cat /proc/interrupts |egrep "CPU|ens192"
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15
57: 0 0 0 0 0 0 0 0 0 0 2327223 80554 0 0 0 0 PCI-MSI 5767168-edge ens192-rxtx-0
58: 0 0 0 0 0 0 0 0 0 0 0 0 2400361 0 0 0 PCI-MSI 5767169-edge ens192-rxtx-1
59: 0 2305749 0 0 0 0 0 0 0 0 0 0 0 80809 0 0 PCI-MSI 5767170-edge ens192-rxtx-2
60: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2507274 0 PCI-MSI 5767171-edge ens192-rxtx-3
61: 0 0 0 2355732 0 0 0 0 0 0 0 0 0 0 0 80091 PCI-MSI 5767172-edge ens192-rxtx-4
62: 81682 0 0 0 0 2370166 0 0 0 0 0 0 0 0 0 0 PCI-MSI 5767173-edge ens192-rxtx-5
63: 0 81439 0 0 0 0 0 2269751 0 0 0 0 0 0 0 0 PCI-MSI 5767174-edge ens192-rxtx-6
64: 0 0 81183 0 0 0 0 0 0 2328560 0 0 0 0 0 0 PCI-MSI 5767175-edge ens192-rxtx-7
65: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI 5767176-edge ens192-event-8
可以看到CPU 1、3、5、7、9、10、12、14核分别对应网卡队列关系如下:
CPU10 <-------> ens192-rxtx-0
CPU12 <-------> ens192-rxtx-1
CPU1 <-------> ens192-rxtx-2
CPU14 <-------> ens192-rxtx-3
CPU3 <-------> ens192-rxtx-4
CPU5 <-------> ens192-rxtx-5
CPU7 <-------> ens192-rxtx-6
CPU9 <-------> ens192-rxtx-7
综上可见,服务器对应的网卡队列数为8,irqbalance服务也运行生效了,网卡中断分配到了8个CPU核上,但因为业务负荷大,8个CPU核无法完成相关数据的转发任务,导致相应CPU负荷打满。解决办法应该就是增加网卡的队列数。
5、检查虚拟服务器网卡
服务器为vmware虚拟机,网卡为VMXNET3型虚拟网卡:
该型网卡仅支持8队列,不能增加队列数,将虚拟网卡更换为E1000E,测试发现E1000E虚拟网卡也仅支持8队列,不能增加队列数。看来用vmware虚拟机无法解决,遂考虑切换到物理机平台。
6、切换业务到物理机平台(2路16核CPU,总计32物理核,支持超线程)
支持的线程数如下:
[root@localhost opt]# nproc
64
7、查看物理机网卡情况
物理机网卡为2个万兆光口,配置为bond,网卡情况
# ip add |grep "state UP"
4: ens4f0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000
12: ens6f0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000
18: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 10
查看物理机网卡队列数
[root@lvs-10 tmp]# ethtool -l ens4f0
Channel parameters for ens4f0:
Pre-set maximums:
RX: n/a
TX: n/a
Other: 1
Combined: 63
Current hardware settings:
RX: n/a
TX: n/a
Other: 1
Combined: 63
[root@lvs-10 tmp]# ethtool -l ens6f0
Channel parameters for ens6f0:
Pre-set maximums:
RX: n/a
TX: n/a
Other: 1
Combined: 63
Current hardware settings:
RX: n/a
TX: n/a
Other: 1
Combined: 63
可以看到两张网卡的队列数均支持到63个且配置为63个队列。
8、启动LVS服务,观察CPU负荷:
可以看到CPU负荷不均衡,CPU0承担了较大负荷,继续观察,服务器卡顿及Ping丢包问题依然存在。
9、检查irqbalance服务运行情况,可以看到其在运行
[root@lvs-10 log]# systemctl status irqbalance
● irqbalance.service - irqbalance daemon
Loaded: loaded (/usr/lib/systemd/system/irqbalance.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-03-22 14:51:20 CST; 14min ago
Docs: man:irqbalance(1)
https://github.com/Irqbalance/irqbalance
Process: 1763 ExecStart=/usr/sbin/irq_balancer (code=exited, status=0/SUCCESS)
Main PID: 1769 (irqbalance)
Tasks: 2 (limit: 821304)
Memory: 932.0K
CGroup: /system.slice/irqbalance.service
└─ 1769 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
Mar 22 14:51:20 lvs-10.227.49.245 systemd[1]: Starting irqbalance daemon...
Mar 22 14:51:20 lvs-10.227.49.245 systemd[1]: Started irqbalance daemon.
10、查看网卡中断的CPU占用情况
[root@lvs-10 log]# cat /proc/interrupts |egrep "CPU|ens4f0"
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15 CPU16 CPU17 CPU18 CPU19 CPU20 CPU21 CPU22 CPU23 CPU24 CPU25 CPU26 CPU27 CPU28 CPU29 CPU30 CPU31 CPU32 CPU33 CPU34 CPU35 CPU36 CPU37 CPU38 CPU39 CPU40 CPU41 CPU42 CPU43 CPU44 CPU45 CPU46 CPU47 CPU48 CPU49 CPU50 CPU51 CPU52 CPU53 CPU54 CPU55 CPU56 CPU57 CPU58 CPU59 CPU60 CPU61 CPU62 CPU63
90: 212 25 0 0 0 38 51 7855040 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 94 0 0 0 0 0 0 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 1048576-edge ens4f0-TxRx-0
91: 76 23 37 32 0 83 0 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8017172 0 90 0 30 0 0 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 1048577-edge ens4f0-TxRx-1
92: 0 0 21 1567822 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 52904 0 159 0 0 0 0 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 1048578-edge ens4f0-TxRx-2
93: 0 1846548 0 23 0 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 0 0 0 0 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 1048579-edge ens4f0-TxRx-3
94: 0 42 0 0 2354851 0 0 53144 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0