配置网卡多队列
1.修改虚拟机设置
(1)关闭虚拟机,修改虚拟机设置
CPU设置了4个,故后面eth0网卡有4个队列
支持多队列网卡(eth0)和用作ssh的网卡(eth1)不能都是桥接模式,否则请求eth0对应IP时,触发的是eth1的中断。
(2)打开虚拟机配置文件 Ubuntu-1604-server.vmx
修改或添加上面4个字段,ethernet0是多队列网卡,ethernet1是ssh网卡。
vmware的vmxnet3支持网卡多队列。
2.配置网络
上面只添加了两个网卡,故设置两个接口就可以。
sudo vim /etc/network/interfaces,输入
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet dhcp
虚拟机网卡接口一般是ensXX,为了方便后面写代码这里改成了ethXX。为了IP不变,ssh网卡配置成静态IP。
3.设置巨页
sudo vim /etc/default/grub
如果是虚拟机:
GRUB_CMDLINE_LINUX改成
GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg noprompt net.ifnames=0 biosdevname=0 default_hugepagesz=2M hugepagesz=2M hugepages=1024 isolcpus=0-2"
如果是物理机:
default_hugepages=1G hugepagesz=1G hugepages=20 isolcpus=0-7
sudo update-grub
重启
注意如果CPU核心数小于isolcpus+1会导致开机失败。
4.设置网卡队列的CPU亲缘性
启动虚拟机,ifconfig -a可以看到多了个多队列网卡eth0,但是未启动
启动eth0:ifup eth0
查看网卡队列中断号:cat /proc/interrupts | grep eth
可以看到eth0有4个网卡队列eth0-rxtx-0、eth0-rxtx-1、eth0-rxtx-2、eth0-rxtx-3,对应的中断号分别是56、57、58、59。这里虚拟机有多少个CPU就会有多少个队列,如果你有8个CPU则设置亲缘性时要设置8个。
设置中断号的亲缘性:
root下:
echo 1 > /proc/irq/56/smp_affinity
echo 2 > /proc/irq/57/smp_affinity
echo 4 > /proc/irq/58/smp_affinity
echo 8 > /proc/irq/59/smp_affinity
上面操作的目的是将4个网卡队列各自绑定到一个CPU。
5.设置nginx CPU亲缘性
设置每个worker绑定到一个CPU:
cd /usr/local/nginx
vim ./conf/nginx.conf
worker_processes 4;
# worker1使用1号CPU,worker2使用2号CPU...
worker_cpu_affinity 00000001 00000010 00000100 00001000;
启动nginx:./sbin/nginx -c ./conf/nginx.conf
6.另一台机器用wrk压测
wrk连接eth0对应IP
wrk -c100 -d30s -t50 http://192.168.2.199:8888
可以看到eth0有4个队列,每个队列有一个中断号(56-59)。4个队列的中断数一直增加,并且只通知各自绑定的CPU。第2列到第5列分别是CPU0,CPU1,CPU2,CPU3。
注意:
压测客户端(wrk/ab)跟服务器不能是同一台物理机或同一个虚拟机,否则HTTP请求不能触发网卡中断。
可以压测客户端在windows主机,服务器是主机的linux虚拟机。
也可以压测客户端是主机的linux虚拟机A,服务器是主机的linux虚拟机B。
到此配置网卡多队列就完成了。