文档简介:
开启网卡多队列功能
随着网络IO的带宽不断提升,单核CPU处理网络中断存在瓶颈,不能完全满足网卡的需求,通过开启网卡多队列功能,您可以将弹性云主机中的网卡中断分散给不同的CPU处理,以满足网卡的需求,从而提升网络PPS和带宽性能。
网卡多队列支持列表
虚拟化类型为XEN的弹性云主机,不支持开启网卡多队列。
虚拟化类型为KVM的弹性云主机,使用下表镜像时,支持开启网卡多队列功能。
【注意】 弹性云主机实例规格列表中的“最大带宽/基准带宽”、“最大收发包能力”均需在网卡多队列数达到最大值时达到上限。
KVM云主机网卡多队列支持列表
类别 |
镜像 |
支持度 |
Windows |
Windows Server 2008 WEB R2 64bit |
可通过私有镜像支持 |
Windows Server 2008 Enterprise SP2 64bit |
可通过私有镜像支持 |
|
Windows Server 2008 R2 Standard/Datacenter/Enterprise 64bit |
可通过私有镜像支持 |
|
Windows Server 2008 R2 Enterprise 64bit_WithGPUdriver |
可通过私有镜像支持 |
|
Windows Server 2012 R2 Standard 64bit_WithGPUdriver |
可通过私有镜像支持 |
|
Windows Server 2012 R2 Standard/Datacenter 64bit |
可通过私有镜像支持 |
|
Linux |
Ubuntu 14.04 server 32bit |
支持 |
Ubuntu 14.04/16.04 server 64bit |
支持 |
|
OpenSUSE 13.2/42.2 64bit |
支持 |
|
SUSE Enterprise 12 SP1/SP2 64bit |
支持 |
|
CentOS 6.3/6.5/6.8/6.9/7.0/7.1/7.2/7.3/7.4 64bit |
支持 |
|
Redhat 6.10/7.5 64bit |
支持 |
|
Debian 8.2.0/8.8.0/9.0.0 64bit |
支持 |
|
Fedora 24/25 64bit |
支持 |
|
EulerOS 2.2 64bit |
支持 |
1)Linux系统开启网卡多队列功能
操作步骤
使用Linux操作系统的弹性云主机,本节以CentOS 7.4为例,介绍开启网卡多队列的具体操作:
步骤 1开启网卡多队列功能
1.登录弹性云主机。
2.执行以下命令,查看网卡支持和已开启的队列数。
ethtool -l 网卡
3.执行以下命令,设置网卡当前使用的队列数。
ethtool -L 网卡 combined 队列数
示例:
[root@localhost ~]# ethtool -l eth0 #查询网卡eth0的队列数
Channel parameters for eth0:
Pre-set maximums:
RX: 0
TX: 0
Other: 0
Combined: 4 #表示此网卡最多支持设置开启4个队列
Current hardware settings:
RX: 0
TX: 0
Other: 0
Combined: 1 #表示当前开启的是1个队列
[root@localhost ~]# ethtool -L eth0 combined 4 #设置eth0网卡开启4个队列
步骤 2(可选)建议开启irqbalance服务,让系统自动调整网卡中断在多个CPU核上的分配。
a)执行以下命令,开启irqbalance服务。
service irqbalance start
b)执行以下命令,查询irqbalance服务状态。
service irqbalance status
如果回显中“Active”字段的值包含“active(running)”,表示irqbalance服务已正常开启,如下图所示。
步骤 3(可选)开启中断绑定。
开启irqbalance服务让中断自由调度,网络性能提升。如果提升后的网络性能仍不满足您的预期,可以手动设置弹性云主机操作系统的中断亲和性。
具体操作如下:
执行以下脚本,使得弹性云主机中每个CPU服务一个多队列的中断请求,一对一的对应设置。即一个队列对应一个中断号,一个中断号绑定一个CPU,一一对应。
#!/bin/bash
service irqbalance stop
eth_dirs=$(ls -d /sys/class/net/eth*)
if [ $? -ne 0 ];then
echo "Failed to find eth* , sleep 30" >> $ecs_network_log
sleep 30
eth_dirs=$(ls -d /sys/class/net/eth*)
fi
for eth in $eth_dirs
do
cur_eth=$(basename $eth)
cpu_count=`cat /proc/cpuinfo| grep "processor"| wc -l`
virtio_name=$(ls -l /sys/class/net/"$cur_eth"/device/driver/ | grep pci |awk {'print $9'})
affinity_cpu=0
virtio_input="$virtio_name""-input"
irqs_in=$(grep "$virtio_input" /proc/interrupts | awk -F ":" '{print $1}')
for irq in ${irqs_in[*]}
do
echo $((affinity_cpu%cpu_count)) > /proc/irq/"$irq"/smp_affinity_list
affinity_cpu=$[affinity_cpu+2]
done
affinity_cpu=1
virtio_output="$virtio_name""-output"
irqs_out=$(grep "$virtio_output" /proc/interrupts | awk -F ":" '{print $1}')
for irq in ${irqs_out[*]}
do
echo $((affinity_cpu%cpu_count)) > /proc/irq/"$irq"/smp_affinity_list
affinity_cpu=$[affinity_cpu+2]
done
done
步骤 4(可选)开启XPS、RPS特性。
xps主要是针对多队列的网卡发送时的优化,当发送一个数据包的时候,它会根据CPU来选择对应的队列。
#!/bin/bash
# enable XPS feature
cpu_count=$(grep -c processor /proc/cpuinfo)
dec2hex(){
echo $(printf "%x" $1)
}
eth_dirs=$(ls -d /sys/class/net/eth*)
if [ $? -ne 0 ];then
echo "Failed to find eth* , sleep 30" >> $ecs_network_log
sleep 30
eth_dirs=$(ls -d /sys/class/net/eth*)
fi
for eth in $eth_dirs
do
cpu_id=1
cur_eth=$(basename $eth)
cur_q_num=$(ethtool -l $cur_eth | grep -iA5 current | grep -i combined | awk {'print $2'})
for((i=0;i<cur_q_num;i++))
do
if [ $i -eq $ cpu_count ];then
cpu_id=1
fi
xps_file="/sys/class/net/${cur_eth}/queues/tx-$i/xps_cpus"
rps_file="/sys/class/net/${cur_eth}/queues/rx-$i/rps_cpus"
cpuset=$(dec2hex "$cpu_id")
echo $cpuset > $xps_file
echo $cpuset > $rps_file
let cpu_id=cpu_id*2
done
done
----结束
2)Windows开启网卡多队列功能
-
通过管理控制台方式修改镜像的网卡多队列属性
用户可以选择以下任一种方式设置镜像的网卡多队列属性。
方式1:
1.登录管理控制台。
2.单击“计算”下的“镜像服务”。
3.单击“私有镜像”进入对应的镜像列表。
4.在镜像所在行的“操作”列下,单击“修改”。
5.设置镜像的网卡多队列属性。
方式2:
6.登录管理控制台。
7.单击“计算”下的“镜像服务”。
8.单击“私有镜像”进入对应的镜像列表。
9.在镜像列表中,单击镜像名称,进入镜像详情页面。
10.在镜像详情页面单击“修改”,在弹出的“修改镜像”对话框中,设置镜像的网卡多队列属性。