网卡中断负载均衡

 
现实中的问题

随着硬件成本的降低,我们服务器配置也越来越“上流”了,可是单台服务器的包处理能力还是很有限,经常看到cpu负载很高, linux内核自从2.4版本之后就引入了netfilter框架,网络数据包的处理能力很大程度上是以并发连接数来衡量的,每一个连接在内核中实际上是做了很多处理的。特别是有大量udp包处理的情况,这些udp包多是短连接,并发量又大,也就是说对cpu的耗费是非常大的。mpstat -P ALL 1:

我们从图中可以看出cpu0处于比较繁忙的状态,占用率在60%-70%,已经是高负载,实际上linux内核从2.4开始就已经支持中断数在各个cpu上的负载均衡了,很显然我们没有充分利用已有的多cpu资源。

 

解决之道

     我们知道,任何外设(如磁盘,网卡等)需要cpu服务时,都会抛出一个中断,中断告诉cpu发生了什么事情,cpu就要停止目前的工作来处理这个中断。比如当网卡收到包时,假如cpu正在执行某个应用进程处理程序,此刻就会被网卡中断所打断执行中断处理程序。每个外设对应的中断处理程序自然是不同的,因此为了进行区分,防止多个设备发出相同的中断请求,系统中的每个设备都被分配了一个独一无二的IRQ(Interupt Request)

每个设备对应的IRQ信息可以从/proc/interrupts中读取:

第一列即为每台设备对应的IRQ,这个在不同机器上可能会不同,该图中我们可以看出网卡eth1对应的IRQ16

第二列到第五列分别对应cpu0-cpu3已经处理的关于某个IRQ(对应某设备)的中断数量。这是我做过优化之后的截图,可以看到各个cpu都处理了大概一样多的eth1网卡中断。

第六列对应中断控制器。

第七列就是具体的设备了。

其实我们的优化方法也就是想把eth1的中断请求平均分配在各个cpu上,从linux 2.4开始就实现了把IRQ绑定在某个cpu或者某些cpu上,叫做多cpu中断亲和性。要实现这一点,有若干条件:

1. eth1对应的中断控制器必须是IO-APIC芯片,有时候是硬件上支持,但IO-APIC未被启用,需要调整系统启动参数来更改,这一点一定要注意。

2. 只有特定CPU才支持,如果是那种CPU超线程的,没有办法,目前我实验过的一些INTEL至强处理器是支持的,如Intel(R) Xeon(R) CPU            5130  @ 2.00GHz,AMD的试过几个型号不支持。

设置中断分配的方法很简单,就是修改/proc/irq/IRQ/smp_affinity,这里IRQ前面已经说过可以从/proc/interrupts里面查,上图的例子中eth1对应的IRQ16,如果我们需要把eth1网卡中断被各个cpu平均处理,只需要执行如下命令:

echo ff > /proc/irq/16/ smp_affinity

     如果想把eth1对应的中断绑定在cpu2上处理,执行:

      echo 04 > /proc/irq/16/ smp_affinity

  此处echo的数字为十六进制,置1的位对应cpu生效,1对应cpu0, 2对应cpu1, 4对应cpu28对应cpu3,如此类推。

     下面看下我们优化后的效果吧:

       可以看出cpu繁忙程度平均了,单个cpu的占用率只有20-30%了,处理能力大大提升。

   上面截图都是在聊天记录漫游的几台机器上做的优化,优化后机器cpu负载大大降低,不需要进行扩容,有效降低了运营成本。

 

附:

1、如何察看某个进程在哪个CPU上运行:

#top

之后按下f 进入top Current Fields设置页面:

选中:j: P          = Last used cpu (SMP)

则多了一项:P 显示此进程使用哪个CPU。

2、Linux下,如何看每个CPU的使用率:

#top

之后按下1. 则显示多个CPU

Cpu0  1.0%us,  3.0%sy,  0.0%ni, 96.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

另外,shift+p,按cpu使用率排序,shift+m,按内存使用率排序

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是ESXi双网卡配置负载均的步骤: 1. 确认服务器上已经安装了ESXi系统,并且已经插入了两张网卡。 2. 在vSphere客户端中,选择主机并进入“配置”选项卡,然后选择“网络适配器”并单击“添加网络适配器”按钮。 3. 在“添加网络适配器向导”中,选择“VMkernel”并单击“下一步”。 4. 在“选择网络适配器”页面上,选择其中一张网卡并单击“下一步”。 5. 在“设置IP地址”页面上,为VMkernel端口组分配一个IP地址,并单击“下一步”。 6. 在“自定义TCP/IP设置”页面上,选择“使用以下IP哈希”并选择“源MAC地址”或“传输控制协议/用户数据报协议(TCP/UDP)端口”作为哈希算法。然后单击“下一步”。 7. 在“完成”页面上,为VMkernel端口组命名并单击“完成”。 8. 重复步骤2-7,为另一张网卡创建另一个VMkernel端口组。 9. 创建一个新的标准交换机,并将两个VMkernel端口组添加到该交换机中。 10. 在vSphere客户端中,选择主机并进入“配置”选项卡,然后选择“网络适配器”并单击“添加网络适配器”按钮。 11. 在“添加网络适配器向导”中,选择“VMkernel”并单击“下一步”。 12. 在“选择网络适配器”页面上,选择另一张网卡并单击“下一步”。 13. 在“设置IP地址”页面上,为VMkernel端口组分配一个IP地址,并单击“下一步”。 14. 在“自定义TCP/IP设置”页面上,选择“使用以下IP哈希”并选择“源MAC地址”或“传输控制协议/用户数据报协议(TCP/UDP)端口”作为哈希算法。然后单击“下一步”。 15. 在“完成”页面上,为VMkernel端口组命名并单击“完成”。 16. 将第二个VMkernel端口组添加到标准交换机中。 17. 在vSphere客户端中,选择主机并进入“配置”选项卡,然后选择“网络适配器”并单击“添加网络适配器”按钮。 18. 在“添加网络适配器向导”中,选择“虚拟机”并单击“下一步”。 19. 在“选择网络适配器”页面上,选择标准交换机并单击“下一步”。 20. 在“完成”页面上,为虚拟机网络适配器命名并单击“完成”。 21. 重复步骤17-20,为另一张网卡创建另一个虚拟机网络适配器。 22. 将两个虚拟机网络适配器添加到虚拟机中。 23. 在Cisco交换机上配置portchannel,并启用“基于IP哈希的路由”。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值