https://www.intel.com/content/dam/www/public/us/en/documents/technology-briefs/sr-iov-nfv-tech-brief.pdf

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

虚拟机–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
2
3
4
5
6
7
<interface type='bridge'>
     <mac address=''/>
     <source bridge='br0'/>
     <model type='virtio'/>
<driver name="vhost"/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
   </interface>

如果不使用vhost_net,则为

1
<driver name="qemu"/>

macvtap 虚拟机xml配置

1
2
3
4
5
6
<interface type='direct'>
      <mac address='00:16:3e:d5:d6:77'/>
      <source dev='lo' mode='bridge'/>
      <model type='e1000'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </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
2
04:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
04:00.1 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)

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

1
2
3
4
5
6
7
8
9
+- pci_0000_00_07_0
|   |
|   +- pci_0000_04_00_0
|   |   |
|   |   +- net_p1p1_00_1b_21_88_69_dc
|   |  
|   +- pci_0000_04_00_1
|       |
|       +- 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<device>
<name>pci_0000_04_00_0</name>
<parent>pci_0000_00_07_0</parent>
<driver>
   <name>e1000e</name>
</driver>
<capability type='pci'>
   <domain>0</domain>
   <bus>4</bus>
   <slot>0</slot>
   <function>0</function>
   <product id='0x105e'>82571EB Gigabit Ethernet Controller</product>
   <vendor id='0x8086'>Intel Corporation</vendor>
</capability>
</device>

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

1
2
3
4
5
<hostdev mode='subsystem' type='pci' managed='yes'>
     <source>
       <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
     </source>
</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 功能的设备可以利用以下优点:
性能-从虚拟机环境直接访问硬件。
成本降低-节省的资本和运营开销包括:
节能
减少了适配器数量
简化了布线
减少了交换机端口
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# lspci | grep 82576    
0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)    
0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)    
0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)    
0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# virsh nodedev-list | grep 0b    
pci_0000_0b_00_0    
pci_0000_0b_00_1    
pci_0000_0b_10_0    
pci_0000_0b_10_1    
pci_0000_0b_10_2    
pci_0000_0b_10_3    
pci_0000_0b_10_4    
pci_0000_0b_10_5    
pci_0000_0b_10_6    
pci_0000_0b_11_7    
pci_0000_0b_11_1    
pci_0000_0b_11_2    
pci_0000_0b_11_3    
pci_0000_0b_11_4    
pci_0000_0b_11_5

虚拟机网卡xml文件

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

方案五 网卡多队列

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

虚拟机的xml网卡配置

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

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

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

1
#ethtool -L eth0 combined M

M 1 – N M小于等于N

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

KVM虚拟化网络优化技术总结的更多相关文章

  1. KVM虚拟化技术

    KVM虚拟化技术 Qemu-kvm kvm virt-manager VNC Qemu-kvm创建和管理虚拟机 一.KVM简介 KVM(名称来自英语:Kernel-basedVirtual Machi ...

  2. [转] KVM虚拟化技术生态环境介绍

    KVM虚拟化技术生态环境介绍 http://xanpeng.github.io/wiki/virt/kvm-virtulization-echosystem-intro.html kvm和qemu/q ...

  3. linux运维、架构之路-KVM虚拟化技术

    一.云计算概述 云计算:是一种资源使用和交付模式 虚拟化:一种具体的技术,用来将物理机虚拟成为多个相互独立的虚拟机.云计算不等于虚拟化,云计算是使用了虚拟化的技术做支撑 二.KVM配置使用 1.系统环 ...

  4. KVM 虚拟化技术

    1.1 前言 1.1.1 什么是虚拟化? 在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU.内存.磁盘空间.网络适配器 ...

  5. KVM虚拟化技术实战全过程

    今天准备开始.................... centos安装-kvm 教程: http://www.linuxidc.com/Linux/2017-01/140007.htm http:// ...

  6. kvm 虚拟化技术 1.1 安装

    1.·VMware开启虚拟化设置 2.安装一些虚拟化的必备插件 yum install -y qemu-kvm qemu-kvm-tools libvirt virt-manager virt-ins ...

  7. [原] KVM 虚拟化原理探究(4)— 内存虚拟化

    KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...

  8. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  9. KVM 虚拟化基本搭建

    KVM虚拟化技术 KVM是基于x86架构上Linux操作系统的全虚拟化解决方案 ,在Centos6.3系统中,kvm已经被集成到内核中,相当于使用内核来做虚拟机管理程序.由于KVM本身就工作于内核环境 ...

随机推荐

  1. Linux Shell 文件描述符 及 stdin stdout stderr 重定向

    Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...

  2. 【转】用Linux命令行获取本机外网IP地址

    $ curl ifconfig.me $ curl icanhazip.com $ curl ident.me $ curl ipecho.net/plain $ curl whatismyip.ak ...

  3. 主备(keepalived+nginx)

    实验环境 系统: centos 6.9 mini 机器名   ip                                   虚拟ip kn1     192.168.126.10 kn2  ...

  4. Titanic数据分析

    一.材料准备 https://www.kaggle.com/c/titanic-gettingStarted/ 二.提出问题 生存率和哪些因素有关(性别,年龄,是否有伴侣,票价,舱位等级,包间,出发地 ...

  5. Go笔记-垃圾回收集和SetFinalizer

    [垃圾回收]     1- Go的开发者也不用写代码来释放程序中不再使用的变量和结构占用内存,Go中有独立的进程,垃圾回收器(GC),处理这些事情.它会搜索不再使用的变量然后释放它们.     2- ...

  6. BZOJ 4318: OSU! [DP 概率]

    传送门 题意:变成了告诉每个操作的成功概率,并且得分是三次方 一样....分别维护$x,\ x^2,\ x^3$的期望就行了 注意$x^3$是我们最终求的得分,即使失败得分也要累加上之前的 #incl ...

  7. Uva 11077 Find the Permutations [置换群 DP]

    题意: 给定$n$和$k$,问有多少排列交换$k$次能变成升序 $n \le 21$ $uva$貌似挂掉了$vjudge$上一直排队 从某个排列到$1,2,...,n$和从$1,2,...,n$到某个 ...

  8. Orleans入门例子

    Orleans入门例子 这是Orleans系列文章中的一篇.首篇文章在此  一.铺垫. 虽然是个入门例子,还是需要一些铺垫. Orleans的最小完全体,应该分为2个部分.一个是Orleans客户端, ...

  9. 学习docker on windows (1): 为什么要使用docker

    为什么要用Docker? 如果我们想使用某种pc软件, 那么在互联网上查找并安装软件的流程大致如下图: 那么这就有几个问题要弄清楚: 从哪里获得软件 App Store Linux的包管理 从某些网站 ...

  10. ubuntu 开发板ping通虚拟机挂载nfs服务器

    先.nfs服务配置1.设置开发板ip ,同一网段2.开发板上操作:ifconfig eth0 192.168.1.203.测试是否能够ping通:ping 192.168.1.194.测试开发板ip是 ...