KVM总结-KVM性能优化之网络性能优化
前面已经介绍了KVM CPU优化(http://blog.csdn.net/dylloveyou/article/details/71169463)、内存优化(http://blog.csdn.net/dylloveyou/article/details/71338378)、磁盘IO优化(http://blog.csdn.net/dylloveyou/article/details/71515880),下面继续介绍网络性能调优。
首先,我给大家看一张图,这张图是数据包从虚拟机开始然后最后到物理网卡的过程。
我们分析下这张图,虚拟机有数据包肯定是先走虚拟机自身的那张虚拟网卡,然后发到中间的虚拟化层,再然后是传到宿主机里的内核网桥中,最后传到物理网卡,这个过程很好理解。
那么我们要做网络的优化,让虚拟机的网络运行得更加高效,我们要想的就是让虚拟机访问到物理网卡的层次要少。或者说能不能让宿主机的物理网卡直接丢给虚拟机用,这样达到最高的网络性能。
那么目前KVM提高网络性能这块有以下四种方法:
- 使用virtio半虚拟化网卡
- 使用vhost_net
- 虚拟机网卡独占
- SRIOV技术
使用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文件,添加<model type='virtio'/>
如果你不指定,那么虚拟机会默认使用8139的全虚拟化网卡,8139网卡是Realtek的百兆。
在实际的测试结果中使用virtio要比使用e1000或者rtl8139网络吞吐性能要高出2倍左右,如下图的测试数据就可以看出,注意,蓝色和绿色分别是全虚拟化下的8139和e1000,红色的就是virtio模式;测试的数据差距确实很大。
使用vhost_net
vhost-net是对于virtio的优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以在内核态得到处理。
我们可以从这图看到,数据包从虚拟网卡出来后,直接跳到了内核那一层中。这里要注意的是,如果你要使用vhost-net那么,你虚拟机的网卡类型必须是virtio的。
我们要使用vhost-net,只要编辑虚拟机的XML文件,加入<driver name="vhost"/>即可
如果不使用vhost-net那么把vhost变成qemu或者删除这句话。
至于vhost-net跟virtio的区别,我们可以看红帽官方文档的解释:
首先,我们可以从架构图看到区别,vhost_net 下用户态QEMU不参与数据包的发送了,虚拟机数据包直接进入内核态,减少了两个空间内存拷贝和cpu的切换。这样的好处就是图中红色框框里说的那样,可以降低延迟以及提高CPU的使用率。但是这里要注意一点的就是,如果虚拟机接收数据包的速度慢于宿主机发送的速度,那么不建议使用vhost_net。
虚拟机网卡独占
虚拟机网卡独占,很简单,就是说把宿主机的网卡直接配置给虚拟机使用,这样,减少了中间的三个层次,如图:
我们可以先用lspci命令查看宿主机pci网卡信息:
当然,这里会显示很多PCI设备,我们可以过滤下,只显示网卡的PCI信息
# lspci | grep Ethernet
- 1
通过上面这个命令,我们可以发现宿主机有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>
- 1
- 2
- 3
- 4
有了这四个信息后,我们先把需要设置的VM进行关机,然后运行virsh edit vmname 进行xml的修改。
我们在虚拟机的XML添加下面内容:
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0' bus='2' slot='0' function='0' />
</source>
</hostdev>
- 1
- 2
- 3
- 4
- 5
SRIOV技术
原作者没有写 %>_<%
转载自云技术实践微信公众号,作者宝哥。
KVM总结-KVM性能优化之网络性能优化的更多相关文章
- 常用CSS优化总结——网络性能与语法性能建议
在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时多少会用到一些,但突然问我,很难把自己知道的都说出来.页面优化明显不是一两句能够说完的,这两天总结了一下 ...
- (转)常用CSS优化总结——网络性能与语法性能建议
原文地址:http://www.cnblogs.com/dolphinX/p/3508657.html 在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时 ...
- KVM on CubieTruck 原理以及网络性能相关思考
1.virtio框架包括哪些? (1)virtio:面向guest驱动的API接口,它在概念上将前端驱动附加到后端驱动,具体实现位于driver/virtio/virtio.c (2)Transpor ...
- 携程App的网络性能优化实践
首先介绍一下携程App的网络服务架构.由于携程业务众多,开发资源导致无法全部使用Native来实现业务逻辑,因此有相当一部分频道基于Hybrid实现.网络通讯属于基础&业务框架层中基础设施的一 ...
- 转:携程App的网络性能优化实践
http://kb.cnblogs.com/page/519824/ 携程App的网络性能优化实践 受益匪浅的一篇文章,让我知道网络交互并不是简单的传输和接受数据.真正的难点在于后面的性能优化 下面对 ...
- KVM总结-KVM性能优化之CPU优化
前言 任何平台根据场景的不同,都有相应的优化.不一样的硬件环境.网络环境,同样的一个平台,它跑出的效果也肯定不一样.就好比一辆法拉利,在高速公路里跑跟乡村街道跑,速度和激情肯定不同… 所以,我们做运维 ...
- KVM网络性能调优
首先,我给大家看一张图,这张图是数据包从虚拟机开始然后最后到物理网卡的过程. 我们分析下这张图,虚拟机有数据包肯定是先走虚拟机自身的那张虚拟网卡,然后发到中间的虚拟化层,再然后是传到宿主机里的内核网桥 ...
- SQL性能优化:如何定位网络性能问题
一同事跟我反馈他遇到了一个SQL性能问题,他说全表只有69条记录,客户端执行耗费了两分多钟,这不科学呀.要我分析一下原因并解决.我按照类似表结构,构造了一个案例,测试截图如下所示 这个表有13800K ...
- 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
随机推荐
- pycharm Process finished with exit code (0xC0000005)
pycharm Process finished with exit code (0xC0000005)解决办法 上次报过这个错误,是在安装浏览器时发现的,报过同样的错误.按当时的方法,以为切地解 ...
- thinkphp5 怎么获取当前的模块,控制器和方法名
//当前模块url地址 $request= Request::instance(); $module_name=$request->module(); $controller_name=$req ...
- spring-AOP框架(基于AspectJ注解配置AOP)
基于AspectJ注解配置AOP 1.加入jar包: 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.w ...
- Centos系统下Docker的安装
一.检查内核版本 安装Docker,需要linux内核大于3.10 使用uname -r 来检查 二. Centos系统下Docker的安装 1. 安装需要的软件包 yum install -y yu ...
- C# 结构和类
不同点: 1.结构是值类型,而类是引用类型:2.结构不支持继承,而类支持继承:3.结构不能定义构造函数,编译器会定义. 适用场合: 结构:分配内存快,作用域结束即被删除,不需要垃圾回收,适用于小型数据 ...
- js for dwg viewer in B/S
https://github.com/autodesk-forge/ https://sharecad.org/zh/DWGOnlinePlugin http://3d-viewers.com/lic ...
- DEVC++ C++ Builder6.0
Devc++安装后无法正常编译程序 出现错误,不知道是什么,可能是不兼容的原因 然后就是一直编译出错,程序是最简单的helloworld程序. 之后选择安装C++ Builder 6.0
- 黄聪:jquery.bootgrid表格插件有的属性(visibleInSelection、cssClass、headerCssClass、headerAlign)不能识别的解决办法
主要是属性大小写问题,修改jquery.bootgrid.js文件,在function loadColumns()方法里面添加下面的语句就好了 data.headerAlign = data.head ...
- go get golang.org/x 包失败解决方法
由于墙的原因,国内使用 go get安装golang 官方包可能会失败 解决方法 方法1 [不需要FQ] Win10下相关配置: GOPATH : E:\go 安装记录: E:\>go get ...
- PAT 乙级 1069 微博转发抽奖(20) C++版
1069. 微博转发抽奖(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 小明PAT考了满分,高兴之余决定 ...