密集负载下的网卡中断负载均衡smp affinity及单队列RPS

简单的说就是,每个硬件设备(如:硬盘、网卡等)都需要和 CPU 有某种形式的通信以便 CPU 及时知道发生了什么事情,这样 CPU 可能就会放下手中的事情去处理应急事件,硬件设备主动打扰 CPU 的现象就是硬件中断。

关于SMP IRQ affinity?

新的内核, Linux改进了分配特定中断到指定的处理器(或处理器组)的功能. 这被称为SMP IRQ affinity, 它可以控制系统如何响应各种硬件事件. 允许你限制或者重新分配服务器的工作负载, 从而让服务器更有效的工作. 以网卡中断为例,在没有设置SMP IRQ affinity时, 所有网卡中断都关联到CPU0, 这导致了CPU0负载过高,而无法有效快速的处理网络数据包,导致了瓶颈。 通过SMP IRQ affinity, 把网卡多个中断分配到多个CPU上,可以分散CPU压力,提高数据处理速度。

irqbalance的一些个介绍

irqbalance 用于优化中断分配,它会自动收集系统数据以分析使用模式,并依据系统负载状况将工作状态置于 Performance mode 或 Power-save mode.处于 Performance mode时irqbalance 会将中断尽可能均匀地分发给各个CPU以充分利用 CPU 多核,提升性能.处于 Power-save mode时,irqbalance 会将中断集中分配给第一个 CPU,以保证其它空闲 CPU 的睡眠时间,降低能耗。

在没有配置SMP IRQ affinity,也没有开启irqbalance的时候~

在配置了SMP IRQ affinity,启动了RPS,关闭irqbalance

在作网络程序的时候, 经常需要了解interrupts和软中断的平衡情况, 需要知道每秒有多少中断发生,发生在哪个cpu上.Linux下中断来源信息可以从 /proc/interrupts 中了解到~

大家会看到他的频率是一样的,因为我们这边已经开了irqbalance,这个东西在负载不大的情况下,是个很不错的服务,他的主要功能是可以合理的调配使用各个CPU核心,特别是对于目前主流多核心的CPU,简单的说就是能够把压力均匀的分配到各个CPU核心上,对提升性能有很大的帮助。

[root@102 ~]# service irqbalance statusirqbalance (pid 21745) is running…[root@102 ~]#

首先我们可以通过访问/proc/cpuinfo的信息查看到cpu的具体信息。

获取eth0网卡的中断irq号,并且赋值给shell变量

关闭irqbalance自动分配服务,好让咱们手动分配中断请求`

/etc/init.d/irqbalance stop

指定CPU来处理对应网卡的中断请求

我这里是选择cpu2来处理这个网卡中断~

这里的4是cpu的16进制表达式

CPU Binary oct

CPU 0 00000001 1

CPU 1 00000010 2

CPU 2 00000100 4

CPU 3 00001000 8

这里分享一个脚本,直接算就可以了~

#!/bin/bash#echo “统计cpu的16进制”[ $# -ne 1 ] && echo ‘$1 is Cpu core number’ && exit 1CCN=$1echo “Print eth0 affinity”for((i=0; i<${CCN}; i++))doecho ==============================echo “Cpu Core $i is affinity”((affinity=(1<<i)))echo “obase=16;${affinity}” | bcdone

要是16个核心的~

[root@102 ~]# sh run.sh 16统计cpu的16进制“Print eth0 affinity”==============================Cpu Core 0 is affinity1==============================Cpu Core 1 is affinity2==============================Cpu Core 2 is affinity4==============================Cpu Core 3 is affinity8==============================Cpu Core 4 is affinity10==============================Cpu Core 5 is affinity20==============================Cpu Core 6 is affinity40==============================Cpu Core 7 is affinity80==============================Cpu Core 8 is affinity100==============================Cpu Core 9 is affinity200==============================Cpu Core 10 is affinity400==============================Cpu Core 11 is affinity800==============================Cpu Core 12 is affinity1000==============================Cpu Core 13 is affinity2000==============================Cpu Core 14 is affinity4000==============================Cpu Core 15 is affinity8000

两个配置是相通的,smp_affinity_list使用的是十进制,相比较smp_affinity的十六进制,可读性更好些。

echo 3,8 > /proc/irq/31/smp_affinity_listecho 0-4 > /proc/irq/31/smp_affinity_list

利用watch查看切换后的效果

[root@102 ~]# watch -n 2 “cat /proc/interrupts |grep eth”

好了,需要说明的是:

对单队列网卡而言,smp_affinity和smp_affinity_list配置多CPU是没有效果的。这话也不是绝对的,咱们可以用RPS来搞定。

也只有懂的接受自己的失败,才能更好的去发挥自身优势,也才能够更好的去实现自我;

密集负载下的网卡中断负载均衡smp affinity及单队列RPS

相关文章:

你感兴趣的文章:

标签云: