本文转自http://xiaoli110.blog.51cto.com/1724/1558984

一个完整的数据包从虚拟机到物理机的路径是:

虚拟机--QEMU虚拟网卡--虚拟化层--内核网桥--物理网卡

KVM的网络优化方案,总的来说,就是让虚拟机访问物理网卡的层数更少,直至对物理网卡的单独占领,和物理机一样的使用物理网卡,达到和物理机一样的网络性能。

方案一 全虚拟化网卡和virtio

Virtio与全虚拟化网卡区别

全虚拟化网卡是虚拟化层完全模拟出来的网卡,半虚拟化网卡通过驱动对操作系统做了改造;

viritio简单的说,就是告诉虚拟机,hi 你就是在一个虚拟化平台上跑,咱们一起做一些改动,让你在虚拟化平台上获得更好的性能;

关于virtio的使用场景

因 为windows虚拟机使用viritio有网络闪断的情况发生,windows 虚拟机如果网络压力不高,建议使用e1000这样的全虚拟化网卡,如果网络压力比较高,建议使用SRIVO或者PCI Device Assignment这样的技术;viritio也在不断的演进,希望windows的闪断的问题越来越少。

KVM天生就是为linux系统设计的,linux系统请放心大胆的使用viritio驱动;

方案二 vhost_net macvtap技术

vhost_net使虚拟机的网络通讯直接绕过用户空间的虚拟化层,直接可以和内核通讯,从而提供虚拟机的网络性能;

macvtap则是跳过内核的网桥;

使用vhost_net,必须使用virtio半虚拟化网卡;

vhost_net虚拟机xml文件配置,

  1. <interface type='bridge'>
  2. <mac address=''/>
  3. <source bridge='br0'/>
  4. <model type='virtio'/>
  5. <driver name="vhost"/>
  6. <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  7. </interface>

如果不使用vhost_net,则为

  1. <driver name="qemu"/>

macvtap 虚拟机xml配置

  1. <interface type='direct'>
  2. <mac address='00:16:3e:d5:d6:77'/>
  3. <source dev='lo' mode='bridge'/>
  4. <model type='e1000'/>
  5. <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  6. </interface>

注意:macvtap在windows虚拟机上性能很差,不建议使用

vhost_net macvtap比较

macvlan的功能是给同一个物理网卡配置多个MAC地址,这样可以在软件商配置多个以太网口,属于物理层的功能。

macvtap是用来替代TUN/TAP和Bridge内核模块,macvtap是基于macvlan这个模块,提供TUN/TAP中tap设备使用的接口,

使用macvtap以太网口的虚拟机能够通过tap设备接口,直接将数据传递到内核中对应的macvtap以太网口。

vhost-net是对于virtio的优化,virtio本来是设计用于进行客户系统的前端与VMM的后端通信,减少硬件虚拟化方式下根模式个非根模式的切换。

而是用vhost-net后,可以进一步进入CPU的根模式后,需要进入用户态将数据发送到tap设备后再次切入内核态的开销,而是进入内核态后不需要在进行内核态用户态的切换,进一步减少这种特权级的切换,说vhost-net属于哪个层不准确,而是属于进行二层网络数据传递的优化。

方案三 虚拟机网卡独占

网卡passthrough在虚拟机的配置方法

使用lcpci 设备查看pci设备信息

  1. 04:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
  2. 04:00.1 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)

也可以使用virsh nodedev-list –tree得到信息

  1. +- pci_0000_00_07_0
  2. |   |
  3. |   +- pci_0000_04_00_0
  4. |   |   |
  5. |   |   +- net_p1p1_00_1b_21_88_69_dc
  6. |   |
  7. |   +- pci_0000_04_00_1
  8. |       |
  9. |       +- net_p1p2_00_1b_21_88_69_dd

使用virsh nodedev-dumxml pci_0000_04_00_0得到xml配置信息

  1. [root@]# virsh nodedev-dumpxml pci_0000_04_00_0
  1. <device>
  2. <name>pci_0000_04_00_0</name>
  3. <parent>pci_0000_00_07_0</parent>
  4. <driver>
  5. <name>e1000e</name>
  6. </driver>
  7. <capability type='pci'>
  8. <domain>0</domain>
  9. <bus>4</bus>
  10. <slot>0</slot>
  11. <function>0</function>
  12. <product id='0x105e'>82571EB Gigabit Ethernet Controller</product>
  13. <vendor id='0x8086'>Intel Corporation</vendor>
  14. </capability>
  15. </device>

3 编辑虚拟机xml文件,加入pci设备信息

  1. <hostdev mode='subsystem' type='pci' managed='yes'>
  2. <source>
  3. <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
  4. </source>
  5. </hostdev>

Domain bus slot function信息从dumpxml出的xml文件获取,define虚拟机,然后开启虚拟机就可以,注意以为附件上去的是物理设备,需要在系统里面安装相应的驱动。

方案四 SR-IVO技术

SRIOV的原理

SR-IVO 是the single root I/O virtualization 的简写,是一个将PCIe共享给虚拟机使用的标准,目前用在网络设备上比较多,理论上也可以支持其他的PCI设备,SRIOV需要硬件的支持。

以下内容来自oracle网站,链接为   
http://docs.oracle.com/cd/E38902_01/html/E38873/glbzi.html

物理功能 (Physical Function, PF)

用 于支持 SR-IOV 功能的 PCI 功能,如 SR-IOV 规范中定义。PF 包含 SR-IOV 功能结构,用于管理 SR-IOV 功能。PF 是全功能的 PCIe 功能,可以像其他任何 PCIe 设备一样进行发现、管理和处理。PF 拥有完全配置资源,可以用于配置或控制 PCIe 设备。

虚拟功能 (Virtual Function, VF)

与物理功能关联的一种功能。VF 是一种轻量级 PCIe 功能,可以与物理功能以及与同一物理功能关联的其他 VF 共享一个或多个物理资源。VF 仅允许拥有用于其自身行为的配置资源。

每 个 SR-IOV 设备都可有一个物理功能 (Physical Function, PF),并且每个 PF 最多可有 64,000 个与其关联的虚拟功能 (Virtual Function, VF)。PF 可以通过寄存器创建 VF,这些寄存器设计有专用于此目的的属性。

一 旦在 PF 中启用了 SR-IOV,就可以通过 PF 的总线、设备和功能编号(路由 ID)访问各个 VF 的 PCI 配置空间。每个 VF 都具有一个 PCI 内存空间,用于映射其寄存器集。VF 设备驱动程序对寄存器集进行操作以启用其功能,并且显示为实际存在的 PCI 设备。创建 VF 后,可以直接将其指定给 IO 来宾域或各个应用程序(如裸机平台上的 Oracle Solaris Zones)。此功能使得虚拟功能可以共享物理设备,并在没有 CPU 和虚拟机管理程序软件开销的情况下执行 I/O。

SR-IOV 的优点

SR-IOV 标准允许在 IO 来宾域之间高效共享 PCIe 设备。SR-IOV 设备可以具有数百个与某个物理功能 (Physical Function, PF) 关联的虚拟功能 (Virtual Function, VF)。VF 的创建可由 PF 通过设计用来开启 SR-IOV 功能的寄存器以动态方式进行控制。缺省情况下,SR-IOV 功能处于禁用状态,PF 充当传统 PCIe 设备。

具有 SR-IOV 功能的设备可以利用以下优点:

1.性能-从虚拟机环境直接访问硬件。

2.成本降低-节省的资本和运营开销包括:

  • 节能
  • 减少了适配器数量
  • 简化了布线
  • 减少了交换机端口

SRIOV的使用

启动SRIVO内核模块

modprobe igb

激活虚拟功能VF

modprobe igb max_vfs=7

千兆网卡最多支持8个vf0-7,千兆网卡目前支持比较好的是INTEL I350, 82576S虽然也支持SRIOV但是只支持虚拟机是linux的情况,windows系统不支持;

万兆网卡最多支持64个vg0-63,intel的新新一代万兆网卡都支持SRIOV x520 x540等;

如果需要重新设置vf 可以删除模块在重新加载

modprobe -r igb

将配置永久写入配置文件

echo "options igb max_vfs=7" >>/etc/modprobe.d/igb.conf

通过lspci命令可以看多主网卡和子网卡

  1. # lspci | grep 82576
  2. 0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
  3. 0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
  4. 0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  5. 0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  6. 0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  7. 0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  8. 0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  9. 0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  10. 0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  11. 0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  12. 0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  13. 0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  14. 0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  15. 0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  16. 0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  17. 0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)

虚拟机可以听过pci网卡独占的方式使用子网卡;

  1. <interface type='hostdev' managed='yes'>
  2. <source>
  3. <address type='pci' domain='0' bus='11' slot='16' function='0'/>
  4. </source>
  5. </interface>

方案五 网卡多队列

centos 7开始支持virtio网卡多队列,可以大大提高虚拟机网络性能,配置方法如下:

虚拟机的xml网卡配置

  1. <interface type='network'>
  2. <source network='default'/>        <model type='virtio'/>         <driver name='vhost' queues='N'/>    </interface>

N 1 - 8 最多支持8个队列

在虚拟机上执行以下命令开启多队列网卡

  1. #ethtool -L eth0 combined M

N 1 - 8 最多支持8个队列

在虚拟机上执行以下命令开启多队列网卡

  1. #ethtool -L eth0 combined M

KVM网络优化方案个人认为以硬件为主,硬件上万兆+SRIOV的方案会越来越普及,但是在线迁移的问题有待解决。

本文出自:http://xiaoli110.blog.51cto.com/1724/1558984

virtio,macvtap,sriov的更多相关文章

  1. [转] Firewall and network filtering in libvirt

    Firewall and network filtering in libvirt There are three pieces of libvirt functionality which do n ...

  2. Neutron中的网络I/O虚拟化

    为了提升网络I/O性能.虚拟化的网络I/O模型也在不断的演化: 1,全虚拟化网卡(emulation).如VMware中的E1000用来仿真intel 82545千兆网卡,它的功能更完备,如相比一些半 ...

  3. dpdk对虚拟化的支持调研

    目录: 虚拟化 dpdk的实现研究 virtio vhost SR-IOV 热迁移相关 研究拓展 本文记录近期对dpdk在虚拟化和云计算领域应用的研究成果,内容梳理如下. 虚拟化 虚拟化,抽象来说,就 ...

  4. OpenStack 虚拟机热迁移流程图

    目录 文章目录 目录 源计算节点与目的计算节点之间的交互流程 Nova 和 Neutron 之间的交互流程 源计算节点与目的计算节点之间的交互流程 热迁移主要包括三个阶段: pre_live_migr ...

  5. KVM 介绍(4):I/O 设备直接分配和 SR-IOV [KVM PCI/PCIe Pass-Through SR-IOV]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  6. macvtap与vhost-net技术

    MacVlan的功能是给同一个物理网卡配置多个MAC地址,可以在软件上配置多个以太网口,属于物理层的功能.MacVTap是用来替代TUN/TAP和Bridge内核模块的.MacTap是基于MacVla ...

  7. KVM(四) I/O 设备直接分配和 SR-IOV

    (4):I/O 设备直接分配和 SR-IOV 本文将分析 PCI/PCIe 设备直接分配(Pass-through)和 SR-IOV, 以及三种 I/O 虚拟化方式的比较. 1. PCI/PCI-E ...

  8. macvtap使用教程

    kubernetes一键安装 macvtap是虚拟机网络虚拟化常用的一种技术,当然容器也可以用. MACVTAP 的实现基于传统的 MACVLAN. 和 TAP 设备一样,每一个 MACVTAP 设备 ...

  9. SR-IOV

    SR-IOV 来源 http://blog.csdn.net/liushen0916/article/details/52423507 摘要: 介绍SR-IOV 的概念.使用场景.VMware 和 K ...

随机推荐

  1. mysql_查的小理解

    show create table employee; 对这个语句的小理解: 顿悟呀,之前一直不太理解这条语句,现在忽然觉得明朗起来.他就是展示创建这个表格时的SQL语句.执行上述代码之后结果如下: ...

  2. 学习yii2.0——依赖注入

    依赖注入 依赖注入是一种设计模式,可以搜索“php依赖注入”,这里不阐述了. yii框架的依赖注入 Yii 通过 yii\di\Container 类提供 DI 容器特性. 它支持如下几种类型的依赖注 ...

  3. Golang 字符串操作--使用strings、strconv包

    strings包 package main import ( "fmt" "strings" ) func main() { //func Count(s, s ...

  4. 学习PHPExcel

    关于PHPExcel使用方法,可以参考慕课网的教程,链接在此 PHPExcel的github地址:https://github.com/PHPOffice/PHPExcel 下载之后,将文件夹中的Cl ...

  5. [转帖]SAP一句话入门:Sales and Distribution

    SAP一句话入门:Sales and Distribution http://blog.vsharing.com/MilesForce/A616565.html SD是Sales and Distri ...

  6. 校园电商项目4——SSM各项配置

    步骤一:数据库连接文件 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/school_o2o?useUni ...

  7. 剑指Offer(9)

    题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解法: 要考虑到底数为0,指数为负数的情况,这道题主要考的是对边界值的思考. p ...

  8. 微信小程序自定义组件

    要做自定义组件,我们先定一个小目标,比如说我们在小程序中实现一下 WEUI 中的弹窗组件,基本效果图如下. Step1 我们初始化一个小程序(本示例基础版本库为 1.7 ),删掉里面的示例代码,并新建 ...

  9. redis 的简单命令

    以下实例讲解了如何启动 redis 客户端: 启动 redis 客户端,打开终端并输入命令 redis-cli.该命令会连接本地的 redis 服务. $redis-cli redis > re ...

  10. CDH 6.0.1 集群搭建 「Process」

    这次搭建我使用的机器 os 是 Centos7.4 RH 系的下面以流的方式纪录搭建过程以及注意事项 Step1: 配置域名相关,因为只有三台机器组集群,所以直接使用了 hosts 的方法: 修改主机 ...