Linux Virtual Server (LVS)之:ksoftirqd進程耗盡單核100%si處理非強制中斷導致效能瓶頸
最近測試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 Port Addresses 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,目前還有待確認