对Linux 网卡软中断做负载均衡

        测试中发现服务器整体负载较低,但有cpu负载特别高,其中一个cpu几乎一半是软中断si,特别忙,而还有的cpu特别空闲。

top - 16:12:08 up 31 days,  3:52,  1 user,  load average: 0.11, 0.11, 0.06
Tasks: 242 total,   4 running, 238 sleeping,   0 stopped,   0 zombie
Cpu0  : 12.3%us, 14.6%sy,  0.0%ni, 70.2%id,  0.0%wa,  0.0%hi,  3.0%si,  0.0%st
Cpu1  : 21.6%us, 22.9%sy,  0.0%ni,  7.3%id,  0.0%wa,  0.0%hi, 48.2%si,  0.0%st
Cpu2  : 16.5%us, 19.1%sy,  0.0%ni, 43.9%id,  0.0%wa,  0.0%hi, 20.5%si,  0.0%st
Cpu3  :  2.3%us,  2.6%sy,  0.0%ni, 94.1%id,  0.0%wa,  0.0%hi,  1.0%si,  0.0%st
Cpu4  :  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

       先用mpstat -I SUM -P ALL 5 来看一下每个cpu的终端情况,发现cpu1和cpu2处理的中断确实很多,是什么dd在使用这两个cpu做中断呢?

# mpstat -I SUM -P ALL 5
Linux 2.6.32-220.13.1.el6.x86_64 (talus186) 	12/26/2013 	_x86_64_	(12 CPU)

04:15:18 PM  CPU    intr/s
04:15:23 PM  all  62422.60
04:15:23 PM    0      0.00
04:15:23 PM    1  21566.20
04:15:23 PM    2  12123.00
04:15:23 PM    3      0.00
04:15:23 PM    4      1.00

      使用 cat /proc/interrupts 查看中断情况,间隔几秒后再次cat /proc/interrupts,然后比较对应值的变化,发现eth0-1、eth0-2等使用cpu1、cpu2做中断,这两个对应的中断号分别是95,96...

 

 95:         33  325897741          0   30997484         72          0   93968731          0          0          0        426        864  IR-PCI-MSI-edge      eth0-1
  96:         50        206   66609822        117          0          0          0          0          0          0          0   24437509  IR-PCI-MSI-edge      eth0-2
     注:网卡(包括磁盘 等外设)需要cpu服务时,都会抛出一个中断,中断告诉cpu发生了什么事情,cpu就要停止目前的工作来处理这个中断。比如当网卡收到包时,假如cpu正在执行某个应用进程处理程序,此刻就会被网卡中断所打断执行中断处理程序。每个外设对应的中断处理程序自然是不同的,因此为了进行区分,防止多个设备发出相同的中断请求,系统中的每个设备都被分配了一个独一无二的IRQ(Interupt Request),上面95、96就是所谓的IRQ,如果网卡有多队列,每个队列可以对应一个IRQ(参考net)。

      在使用 cat /proc/irq/95/smp_affinity cat /proc/irq/smp_affinity 等看出网卡的队列都在使用cpu1 和cpu2

cat /proc/irq/95/smp_affinity
00000002
cat /proc/irq/96/smp_affinity
00000004

      好了,把空闲的cpu用上来分摊网卡中断

echo 08 > /proc/irq/97/ smp_affinity
echo 10 > /proc/irq/98/ smp_affinity
...

      再进行测试,发现cpu消耗整体还不够均衡,TOP下使用f,然后再加j,发现应用进程使用的cpu与网卡中断使用的cpu重合,再把单线程应用进程绑定到其他CPU,终于均衡下来。

      最后,网卡软中断绑定cpu需要满足几个条件:1 linux内核版本必须在2.4+; 2 网卡对应的中断控制器必须是IO-APIC芯片,且需启用IO-APIC;3 部分CPU可能不支持。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我们可以使用LVS(Linux Virtual Server)来实现Linux C三层负载均衡。LVS是一个高性能、高可用性和可伸缩性的服务器集群解决方案,它可以将多个物理服务器组成一个虚拟服务器,从而提高服务器的性能和可用性。 以下是实现Linux C三层负载均衡的步骤: 1. 安装LVS软件包 在Linux系统中,可以使用以下命令安装LVS软件包: ```shell yum install ipvsadm -y ``` 2. 配置LVS集群 在LVS集群中,需要有一个负载均衡器和多个后端服务器。可以使用以下命令配置LVS集群: ```shell # 添加虚拟服务器 ipvsadm -A -t <虚拟服务器IP>:<端口> -s rr # 添加后端服务器 ipvsadm -a -t <虚拟服务器IP>:<端口> -r <后端服务器IP>:<端口> -g ``` 其中,-s rr表示使用轮询算法进行负载均衡,-g表示使用DR模式进行负载均衡。 3. 启用IP转发 在负载均衡器上,需要启用IP转发功能,以便将请求转发到后端服务器。可以使用以下命令启用IP转发: ```shell echo 1 > /proc/sys/net/ipv4/ip_forward ``` 4. 配置路由 在负载均衡器上,需要配置路由,以便将请求转发到后端服务器。可以使用以下命令配置路由: ```shell route add -host <后端服务器IP> dev <网卡名称> ``` 其中,<网卡名称>是指连接负载均衡器和后端服务器的网卡名称。 5. 测试负载均衡 在完成以上步骤后,可以使用curl命令测试负载均衡是否正常工作: ```shell curl <虚拟服务器IP>:<端口> ``` 如果一切正常,应该能够看到后端服务器的响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值