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

我们分析下这张图,虚拟机有数据包肯定是先走虚拟机自身的那张虚拟网卡,然后发到中间的虚拟化层,再然后是传到宿主机里的内核网桥中,最后传到物理网卡,这个过程很好理解。
那么我们要做网络的优化,让虚拟机的网络运行得更加高效,我们要想的就是让虚拟机访问到物理网卡的层次要少。或者说能不能让宿主机的物理网卡直接丢给虚拟机用,这样达到最高的网络性能。
那么目前KVM提高网络性能这块有以下四种方法:
- 使用virtio半虚拟化网卡
- 使用vhost_net
- 虚拟机网卡独占
- SRIOV技术
1、使用virtio半虚拟化网卡
首先要明确一点,那就是全虚拟化网卡的性能是不如半虚拟化网卡的,因为半虚拟化网卡virtio是使用了驱动进行改造了的,所以性能上肯定是强过用户态下的全虚拟化网卡。

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

使用virtio 就是让vm的数据包直接跟虚拟化层接触,如上图。
注意,Linux的内核是从2.6.24才开始支持Virtio的。CentOS6系列都是支持的,我们查看linux是否支持Virtio可以通过下面这个命令查看:
[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模式;测试的数据差距确实很大。

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。
3、虚拟机网卡独占
虚拟机网卡独占,很简单,就是说把宿主机的网卡直接配置给虚拟机使用,这样,减少了中间的三个层次,如图:

我们可以先用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
KVM网络性能调优的更多相关文章
- Oracle 12C -- 网络性能调优
1.传输数据压缩 网络性能主要受两方面影响:bandwidth和data volume. 在网络层对数据进行压缩,可以减少对网络带宽的需求.而且对应用是透明的. 如果是CPU是瓶颈时开启网络层数据压缩 ...
- <Linux性能调优指南>主要思路流程
网上IBM很早放出的一本免费电子书, 十来年了,参考意义还是很大. 国内有翻译成中文在线阅读的版本. 见如下两个URL Linux Performance and Tuning Guidelines ...
- 恒天云技术分享系列3 – KVM性能调优
恒天云技术分享:http://www.hengtianyun.com/download-show-id-11.html KVM是什么 KVM 是 kernel-based Virtual Machin ...
- sql server 性能调优 资源等待之网络I/O
原文:sql server 性能调优 资源等待之网络I/O 一.概述 与网络I/O相关的等待的主要是ASYNC_NETWORK_IO,是指当sql server返回数据结果集给客户端的时候,会先将结果 ...
- web前端性能调优
最近2个月一直在做手机端和电视端开发,开发的过程遇到过各种坑.弄到快元旦了,终于把上线了.2个月干下来满满的的辛苦,没有那么忙了自己准备把前端的性能调优总结以下,以方便以后自己再次使用到的时候得于得心 ...
- 第0/24周 SQL Server 性能调优培训引言
大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...
- hadoop 性能调优与运维
hadoop 性能调优与运维 . 硬件选择 . 操作系统调优与jvm调优 . hadoop运维 硬件选择 1) hadoop运行环境 2) 原则一: 主节点可靠性要好于从节点 原则二:多路多核,高频 ...
- iOS-------应用性能调优的25个建议和技巧
性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论.然而由于iOS设备的限制,有时搞好性能是一件难事.开发过程中你会有很多需要注意的 ...
- iOS应用性能调优建议
本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...
随机推荐
- Mybatis中oracle如何批量insert语句
<insert id="batchInsertNoticeUser" useGeneratedKeys="false" keyProperty=" ...
- ORA-28000: the account is locked
1.用system账号登录 2.执行一下sql: ALTER USER username ACCOUNT UNLOCK; 此处username 可能为scott或者你要解锁的用户名. ........ ...
- 1:TwoSum(如果两个和为某个数,找出这俩数的位置)
package leetcode; import java.util.HashMap; import java.util.Map; /** * @author mercy *Example: *Giv ...
- QA规范
规范流程: 1)拿到需求,分析需求,先写一版checklist: 2)进行codediff,过程中最好一行行代码review,尽早发现代码错误或代码逻辑不完善的地方,codediff之后修改check ...
- tomcat------->简单配置
主机名:www.snowing.com 域名:snowing.com http://主机+服务器端口号/path(web应用)/xxx.html 例: http://localhost:8080/it ...
- nested exception is java.lang.IllegalStateException: Context namespace element 'annotation-config' a
公司还用的是spring低版本,今天用jre 8测试了一下,发现错误: Unexpected exception parsing XML document from class path resour ...
- UVA12470—Tribonacci (类似斐波那契,简单题)
题目链接:https://vjudge.net/problem/UVA-12470 题目意思:我们都知道斐波那契数列F[i]=F[i-1]+F[i-2],现在我们要算这样的一个式子T[i]=T[i-1 ...
- Spark Streaming Programming Guide
参考,http://spark.incubator.apache.org/docs/latest/streaming-programming-guide.html Overview SparkStre ...
- golang函数学习笔记
golang函数特点: a.不支持重载,一个包不能有两个名字一样的函数 b.函数是一等公民,函数也是一种类型,一个函数可以赋值给变量 c.匿名函数 d.多返回值 例子1 func add(a, b ...
- java获取src下文件
方式一: InputStream in = Test.class .getResourceAsStream("/env.properties"); URL url = Test.c ...