最近测试LVS性能,发现当CPU其中一个核耗尽后系统达到性能顶峰。
消耗CPU资源的是ksoftirqd进程,全部用于处理软中断(从进程名也能识别出了)。
搜了一下,很多人都遇到这类问题,似乎也没有解决。了解到并尝试过的解决方案有:
1、减少集群成员的数量;
2、修改集群模式(NAT、TURNL、DR);
3、修改集群调度算法;
4、升级操作系统内核到2.6.20以上;
5、调整网卡的最大传输单元(MTU);
6、修改设备中断方式;
7、使用多网卡负载均衡;
8、升级硬件(网卡);
9、更换操作系统。
一一解说如下吧:
第1点 :减少集群成员的数量。由于瓶颈不在真实服务器上,所以减少成员数量,lvs性能没有明显变化。
第2点 :修改集群模式。理论上DR模式是最省资源的,大概了解理论的朋友应该都知道。由于NAT模式不满足需求,故仅对比了DR和TUN模式,两者没有明显区别。
第3点 :修改集群调度算法。已有的十种算法中属rr最简单,而且目前瓶颈还未深入到这一层。实际上在处理网络包的时候导致的瓶颈。调度算法简单比较了rr和wrr,两者没有明显区别。
第4点 :升级操作系统内核到2.6.20以上。我直接升级到当前已发布的最新版本2.6.34,结果瓶颈并没有得到改善。
第5点 :调整网卡的最大传输单元。交换机支持最大的传输单元是9216,将网卡的最大传输单元分别修改为:1500(默认)、5000、9000、9216。其中1500和5000两者没有明显差别,9000和9216会导致网络不稳定,性能也没有提高反而出现大量连接超时。
第6点 :修改设备中断方式。通过修改设置中断/proc/irq/${网卡中断号}/smp_affinity:
测试服务器CPU为四核,理论上网卡的smp_affinity值为1、2、4、8分别对应cpu0、cpu1、cpu2、cpu3。
结果:
1、网卡的smp_affinity默认值为8,测试过程中软中断全部由cpu3处理。正确
2、设置smp_affinity = 1,测试过程中软中断全部由cpu0处理。正确
3、设置smp_affinity = 2,测试过程中软中断全部由cpu1处理。正确
4、设置smp_affinity = 4,测试过程中软中断全部由cpu2处理。正确
5、设置smp_affinity = 5,测试过程中软中断全部由cpu0处理,预期应该分配给cpu0和cpu2处理。无效
6、设置smp_affinity = f,测试过程中软中断全部由cpu0处理,预期应该分配给cpu0、cpu1、cpu2和cpu2处理。无效
即:修改smp_affinity的功能只针对单核有效 。
第7点 :使用多网卡负载均衡。此方案可行! 使用两张网卡绑定一个IP地址,性能就提升了一倍,效果非常明显。原因就是两张网卡各用一个CPU核,相比用单核而言,性能自然提升一倍。
配置方式如下:
单网卡工作模式
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.223.255
HWADDR=00:1E:90:76:6F:E0
IPADDR=192.168.223.113
NETMASK=255.255.254.0
NETWORK=10.20.222.0
ONBOOT=yes
GATEWAY=192.168.222.1
TYPE=Ethernet
绑定双网卡操作步骤
echo 'alias bond0 bonding' >> /etc/modprobe.conf
# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
BROADCAST=192.168.223.255
MACDDR=00:1E:90:76:6F:E2
IPADDR=192.168.223.113
NETMASK=255.255.254.0
NETWORK=192.168.222.0
USERCTL=no
ONBOOT=yes
GATEWAY=10.20.222.1
TYPE=Ethernet
BONDING_OPTS="mode=0 miimon=100"
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
# service network restart
第8点 ,升级硬件,使用支持RSS功能的网卡。
下面是intel对RSS的说明
Receive-side scaling (RSS) routes incoming packets to specific queues, efficiently balancing network loads across CPU cores and increasing performance on multi-processor systems. RSS, called Scalable I/O in Linux*, creates a hash table from IP, TCP, and PortAddresses and uses that table to decide which queue to route a packet to, and to which processor the packet should be associated.
可是从我们使用网卡的官网硬件指标上,都是支持RSS的。Windows的设置方式是`netsh int tcp set global rss=enabled `。
第9点 ,更换操作系统。此方案在生产环境下部署的可能性比较小,但是否关操作系统的事确实需要确认。
据说Windows的NLB、solaris、AIX支持网卡RSS,目前还有待确认。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com