专栏名称: 云技术实践
关注云计算,云技术,云运维,云存储,存储,分布式,OpenStack,SDN,Ceph,虚拟化,运维,分享在云计算/虚拟化/运维项目实施中的资讯、经验、技术,坚持干货。
目录
相关文章推荐
架构师之路  ·  CAS下的ABA问题及优化方案!技术交流,没 ... ·  2 天前  
架构师之路  ·  DeepSeek开源的DualPipe,居然 ... ·  昨天  
架构师之路  ·  善用AI可以大大提高自己的能力上限,让AI帮 ... ·  3 天前  
架构师之路  ·  巧用CAS,一分钟实现分布式ID生成器!(第 ... ·  3 天前  
51好读  ›  专栏  ›  云技术实践

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

云技术实践  · 公众号  · 架构  · 2017-05-15 11:15

正文


四、KVM网络性能调优


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


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


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

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


1. 使用virtio半虚拟化网卡

2. 使用vhost_net

3. 虚拟机网卡独占

4. SRIOV技术


4.1 使用virtio半虚拟化网卡

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

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


使用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)

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


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

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


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

当然也可以编辑XML文件,添加



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


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


4.2 使用vhost_net

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

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


我们要使用vhost-net,只要编辑虚拟机的XML文件,加入 即可

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


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

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


4.3 虚拟机网卡独占







请到「今天看啥」查看全文