微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2017版:KVM网络性能调优终极版

《2017版:KVM网络性能调优终极版》要点:
本文介绍了2017版:KVM网络性能调优终极版,希望对您有用。如果有疑问,可以联系我们。

四、KVM网络性能调优

首先,我给大家看一张图,这张图是数据包从虚拟机开始然后最后到物理网卡的过程.

数据包

我们分析下这张图,虚拟机有数据包肯定是先走虚拟机自身的那张虚拟网卡,然后发到中间的虚拟化层,再然后是传到宿主机里的内核网桥中,最后传到物理网卡,这个过程很好理解.

那么我们要做网络的优化,让虚拟机的网络运行得更加高效,我们要想的就是让虚拟机访问到物理网卡的层次要少.或者说能不能让宿主机的物理网卡直接丢给虚拟机用,这样达到最高的网络性能.

那么目前KVM提高网络性能这块有以下四种方法

1. 使用virtio半虚拟化网卡

2. 使用vhost_net

3. 虚拟机网卡独占

4. SRIOV技术

4.1 使用virtio半虚拟化网卡

首先要明确一点,那就是全虚拟化网卡的性能是不如半虚拟化网卡的,因为半虚拟化网卡virtio是使用了驱动进行改造了的,所以性能上肯定是强过用户态下的全虚拟化网卡,这点我们在上一章讲磁盘优化的时候也提到过.

virtio半虚拟化网卡

这张图可以看出全虚拟化跟半虚拟化的区别

2017版:KVM网络性能调优终极版

使用virtio 就是让vm的数据包直接跟虚拟化层接触,如上图.

注意,Linux的内核是从2.6.24才开始支持Virtio的.CentOS6系列都是支持的,我们查看linux是否支持Virtio可以通过下面这个命令查看:

grep -i Virtio /boot/config-2.6.32-358.2.1.el6.x86_64 (演示的宿主机是CentOS7.1)

2017版:KVM网络性能调优终极版

Linux系统原生自带就有,但是如果你的虚拟机是Windows,那么得装Virtio驱动.

那么下载Virtio驱动是在这个网址:

http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers

使用Virtio,我们可以在创建虚拟机的时候在Virtual Machine Manager图形界面里指定下:

Virtio

当然也可以编辑XML文件,添加<model type=’virtio’/>

 

XML

如果你不指定,那么虚拟机会认使用8139的全虚拟化网卡,8139网卡是Realtek的百兆.

在实际的测试结果中使用virtio要比使用e1000或者rtl8139网络吞吐性能要高出2倍左右,如下图的测试数据就可以看出,注意,蓝色和绿色分别是全虚拟化下的8139和e1000,红色的就是virtio模式;测试的数据差距确实很大.

数据

4.2 使用vhost_net

vhost-net是对于virtio的优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以在内核态得到处理.

vhost-net

我们可以从这图看到,数据包从虚拟网卡出来后,直接跳到了内核那一层中.这里要注意的是,如果你要使用vhost-net那么,你虚拟机的网卡类型必须是virtio的.

我们要使用vhost-net,只要编辑虚拟机的XML文件,加入<driver name=”vhost”/>即可

2017版:KVM网络性能调优终极版

如果不使用vhost-net那么把vhost变成qemu或者删除这句话.

至于vhost-net跟virtio的区别,我们可以看红帽官方文档的解释:

红帽官方文档

首先,我们可以从架构图看到区别,vhost_net 下用户态QEMU不参与数据包的发送了,虚拟机数据包直接进入内核态,减少了两个空间内存拷贝和cpu的切换.这样的好处就是图中红色框框里说的那样,可以降低延迟以及提高cpu的使用率.但是这里要注意一点的就是,如果虚拟机接收数据包的速度慢于宿主机发送的速度,那么不建议使用vhost_net.

4.3 虚拟机网卡独占

虚拟机网卡独占,很简单,就是说把宿主机的网卡直接配置给虚拟机使用,这样,减少了中间的三个层次,如图:

虚拟机网卡

我们可以先用lspci命令查看宿主机pci网卡信息:

2017版:KVM网络性能调优终极版

当然,这里会显示很多PCI设备,我们可以过滤下,只显示网卡的PCI信息

# lspci | grep Ethernet

2017版:KVM网络性能调优终极版

通过上面这个命令,我们可以发现宿主机有4块网卡(注意前面02:00.0的短标识符信息,我们接下来会用到)

我们使用virsh nodedev-list –cap pci命令也可以罗列出PCI设备列表

注意,我们可以通过上个图中前面显示的短标识符(如02:00.0),找到下面对应的PCI名称(后面的02_00_0),如红色框框所示:

PCI

然后我们可以再用virsh nodedev-dumpxml + pci name得到PCI XML配置信息:

如:virsh nodedev-dumpxml pci_0000_02_00_0

2017版:KVM网络性能调优终极版

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生效,最后重启系统.

2017版:KVM网络性能调优终极版

做完以上操作之后,我们就可以开始给虚拟机添加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′

作者:宝哥 云技术社区金牌作

文章来自微信公众号:云技术实践

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐