首先,我给你们看一张图,这张图是数据包从虚拟机开始而后最后到物理网卡的过程。
node
咱们分析下这张图,虚拟机有数据包确定是先走虚拟机自身的那张虚拟网卡,而后发到中间的虚拟化层,再而后是传到宿主机里的内核网桥中,最后传到物理网卡,这个过程很好理解。
那么咱们要作网络的优化,让虚拟机的网络运行得更加高效,咱们要想的就是让虚拟机访问到物理网卡的层次要少。或者说能不能让宿主机的物理网卡直接丢给虚拟机用,这样达到最高的网络性能。linux
那么目前KVM提升网络性能这块有如下四种方法:vim
一、使用virtio半虚拟化网卡
首先要明确一点,那就是全虚拟化网卡的性能是不如半虚拟化网卡的,由于半虚拟化网卡virtio是使用了驱动进行改造了的,因此性能上确定是强过用户态下的全虚拟化网卡。
网络
这张图能够看出全虚拟化跟半虚拟化的区别
使用virtio 就是让vm的数据包直接跟虚拟化层接触,如上图。架构
注意,Linux的内核是从2.6.24才开始支持Virtio的。CentOS6系列都是支持的,咱们查看linux是否支持Virtio能够经过下面这个命令查看:dom
[root@collber cobbler]# grep -i Virtio /boot/config-3.10.0-693.el7.x86_64 CONFIG_VIRTIO_VSOCKETS=m CONFIG_VIRTIO_VSOCKETS_COMMON=m CONFIG_VIRTIO_BLK=m CONFIG_SCSI_VIRTIO=m CONFIG_VIRTIO_NET=m CONFIG_VIRTIO_CONSOLE=m CONFIG_HW_RANDOM_VIRTIO=m CONFIG_DRM_VIRTIO_GPU=m CONFIG_VIRTIO=m # Virtio drivers CONFIG_VIRTIO_PCI=m CONFIG_VIRTIO_PCI_LEGACY=y CONFIG_VIRTIO_BALLOON=m CONFIG_VIRTIO_INPUT=m # CONFIG_VIRTIO_MMIO is not set
Linux系统原生自带就有,可是若是你的虚拟机是Windows,那么得装Virtio驱动。性能
若是你不指定,那么虚拟机会默认使用8139的全虚拟化网卡,8139网卡是Realtek的百兆。测试
在实际的测试结果中使用virtio要比使用e1000或者rtl8139网络吞吐性能要高出2倍左右,以下图的测试数据就能够看出,注意,蓝色和绿色分别是全虚拟化下的8139和e1000,红色的就是virtio模式;测试的数据差距确实很大。
优化
二、使用vhost_net
vhost-net是对于virtio的优化,在内核中加入了vhost-net.ko模块,使得对网络数据能够在内核态获得处理。
code
咱们能够从这图看到,数据包从虚拟网卡出来后,直接跳到了内核那一层中。这里要注意的是,若是你要使用vhost-net那么,你虚拟机的网卡类型必须是virtio的。
咱们要使用vhost-net,只要编辑虚拟机的XML文件,加入
若是不使用vhost-net那么把vhost变成qemu或者删除这句话。
至于vhost-net跟virtio的区别,咱们能够看红帽官方文档的解释:
首先,咱们能够从架构图看到区别,vhost_net 下用户态QEMU不参与数据包的发送了,虚拟机数据包直接进入内核态,减小了两个空间内存拷贝和cpu的切换。这样的好处就是图中红色框框里说的那样,能够下降延迟以及提升CPU的使用率。可是这里要注意一点的就是,若是虚拟机接收数据包的速度慢于宿主机发送的速度,那么不建议使用vhost_net。
三、虚拟机网卡独占
虚拟机网卡独占,很简单,就是说把宿主机的网卡直接配置给虚拟机使用,这样,减小了中间的三个层次,如图:
咱们能够先用lspci命令查看宿主机pci网卡信息:
经过上面这个命令,咱们能够发现宿主机有4块网卡(注意前面02:00.0的短标识符信息,咱们接下来会用到)
咱们使用virsh nodedev-list --cap pci命令也能够罗列出PCI设备列表
注意,咱们能够经过上个图中前面显示的短标识符(如02:00.0),找到下面对应的PCI名称(后面的02_00_0),如红色框框所示:
而后咱们能够再用virsh nodedev-dumpxml + pci name获得PCI XML配置信息:
如:virsh nodedev-dumpxml pci_0000_02_00_0
OK,以上是PCI信息的查看,那么咱们如何把PCI网卡直接丢给虚拟机使用呢?接下来咱们作如下配置便可:
首先你得确认你的宿主机是否开启了IOMMU服务,CentOS7下默认是不开启的,咱们用命令dmesg | grep -iE "dmar|iommu"能够先查看(执行这个命令若是没任何输出,说明没打开)。而后咱们修改vim /etc/sysconfig/grub ,在GRUB_CMDLINE_LINUX那行添加intel_iommu=on(若是是intel平台的话);再而后执行grub2-mkconfig -o /boot/grub2/grub.cfg生效,最后重启系统。
作完以上操做以后,咱们就能够开始给虚拟机添加PCI设备了。
咱们要关注的是PCI XML信息里的如下四个:
<domain>0</domain> <bus>2</bus> <slot>0</slot> <function>0</function>
有了这四个信息后,咱们先把须要设置的VM进行关机,而后运行virsh edit vmname 进行xml的修改。
咱们在虚拟机的XML添加下面内容:
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0' bus='2' slot='0' function='0'
本文转自:http://www.sohu.com/a/140668189_610730