• SR-IOV


    SR-IOV

    来源 http://blog.csdn.net/liushen0916/article/details/52423507

    摘要: 介绍SR-IOV 的概念、使用场景、VMware 和 KVM 中的配置方法。

    第一部分:

    生产业务中,我们在虚拟化平台中遇到了部分虚拟机在业务高峰的时候,出现高延迟的情况。排查问题的时候,确认了两种情况,1是Hypervisor 的延迟是正常的, 2是GuestOS 内部的延迟也是正常的。所以判断应该是Hypervisor和GuestOS 之间的通信出现了问题。这时候想到了SR-IOV,想看看SR-IOV 能不能提供低延迟提供给对延迟敏感的业务。

    写这篇文章之前,正好看到Red Hat 发布了 Red Hat Virtualization V4版,官方文档中,专门有一篇《Hardware considerations for implementing SR-IOV with Red Hat 
    Virtualization》。文章很短,主要介绍Red Hat Virtualization 中使用SR-IOV的前提条件:

    • CPU 必须支持IOMMU(比如英特尔的 VT-d 或者AMD的 AMD-Vi,Power8 处理器默认支持IOMMU)
    • 固件Firmware 必须支持IOMMU
    • CPU 根桥必须支持 ACS 或者ACS等价特性
    • PCIe 设备必须支持ACS 或者ACS等价特性
    • 建议根桥和PCIe 设备中间的所有PCIe 交换设备都支持ACS,如果某个PCIe交换设备不支持ACS,其后的所有PCIe设备只能共享某个IOMMU 组,所以只能分配给1台虚机。

    这里写图片描述

    Red Hat 虚拟化平台V4 先介绍到这里。

    第二部分:

    现在介绍一下IO 虚拟化。IO 虚拟化目前主要也是分为3种, 第一是全虚拟化,通过VMM来模拟IO设备实现,VMM截获GuestOS的IO请求,通过软件模拟真实的硬件。VMM必须处理所有虚机的IO请求,然后将所有的IO情况序列化为可以被底层硬件处理的单一IO流。好处是GuestOS不需要考虑硬件设备的情况。问题是效率相对较低。例如 qemu。

    第二种是IO半虚拟化技术。通过前端和后端模拟实现虚拟化。GuestOS中的半虚拟化驱动为前端,VMM 提供的与GuestOS 通讯的驱动程序为后端。前端驱动将GuestOS的请求通过与VMM之间的特殊通信机制发生给VMM后端需求,后端驱动处理完IO请求之后再发送给物理驱动。全虚拟化为了完成一次操作要涉及到多个寄存器的操作,使得VMM要截获每个寄存器访问并进行相应的模拟,就会导致多次上下文切换。这种方式能很大程度的减少上下文切换的频率,提供更大的优化空间。例如 virtio 。

    这里写图片描述 
    软件的共享IO虚拟化技术

    第三种是硬件辅助的IO虚拟化。主要包括 英特尔VT-d, AMD的IOMMU(AMD-Vi) 和PCI-SIG 的IOV 。 前两种属于Directed I/O。物理设备直接分配给虚拟机使用,通过硬件芯片完成GPA到MA 的翻译。IOV 通过在硬件设备中增加一个PCIe 设备,用于呈现一个PF或多个VF,从而可以将每个VF单独分配给不同的虚机使用。

    这里写图片描述 
    Intel VT-d

    这里写图片描述

    SR-IOV

    下面花一些篇幅介绍 SR-IOV。 
    SR-IOV 是PCI-SIG的一个IOV的规范,目的是提供一种标准规范,通过为虚拟机提供独立的内存空间,中断,DMA流,来绕过VMM实现数据移动。SR-IOV 架构被设计用于将单个设备通过支持多个VF,并减少硬件的开销。

    SR-IOV 引入了两种类型:

    PF: 包含完整的PCIe 功能,包括SR-IOV的扩张能力,该功能用于SR-IOV的配置和管理。

    FV: 包含轻量级的PCIe 功能。包含数据移动所需要的最小的必要的资源。

    这里写图片描述

    注:部分图片源自 《PCI-SIG SR-IOV Primer》

    第三部分: 
    接下来介绍Intel 网卡在VMware 环境 实现 SR-IOV 需要的条件和配置方法。 
    硬件需求: 
    兼容ESXi版本; 
    支持IOMMU,并且在BIOS中已开启; 
    支持VT-d 和 SR-IOV 规范; 
    在BIOS中开启SR-IOV;

    软件需求: 
    ESXi 5.1 及以上版本; 
    Red Hat Enterprise Linux 6.x 及以上版本; 
    Windows Server 2008 R2 with SP2 及以上版本; 
    VF 驱动必须兼容,并且支持 GuestOS 。

    大概配置步骤:

    1、进入到ESXi 5.1/5.5的命令行界面,然后执行如下命令:
    esxcli system module parameters set -m ixgbe -p "max_vfs=8"
    备注:上文中的ixgbe表示的是SR-IOV设备的Module Name,max_vfs表示Virtual Functions数量;

    2、如果是双口卡或者两张卡在同一个模块上,则可以执行如下命令:
    esxcli system module parameters set -m ixgbe -p "max_vfs=8,8"

    3、完成之后,就可以重启主机生效,依然可以用如下命令查看状态:esxcli network sriovnic

    4、最后,就可以按照为虚拟机添加passthrough的方式去settings里为虚拟机添加相关的PCI设备了。

    具体配置方法: 
    1) 创建VF 
    开启SSH, 登录ESXi , 使用以下命令创建VF

    esxcli system module parameters set  -m ixgbe -p=max_vfs=20,20,0,0
    esxcli system module parameters list --module=ixgbe  | grep max_vfs

    这里写图片描述

    esxcfg-module -g ixgb

    这里写图片描述

    配置完成之后,重启ESXi,参看以及创建的VF

    lspci | grep -i intel | grep -i 'ethernet|network'

    这里写图片描述
    这里写图片描述

    补充一下,这一步可以通过Host Profile 尽快批量配置。

    2)将VF分配给虚机 
    编辑虚机,添加PCI设备 
    这里写图片描述 
    这里写图片描述 
    选择VF,确定。 
    这里写图片描述 
    完成VF的分配。

    3)GuestOS 安装VF 驱动。 
    Windos 需要单独去下载VF驱动, CentOS 6.x 自带了igbx 的驱动。 
    这里写图片描述
    这里写图片描述

    这里写图片描述

    第四部分:

    前面介绍了SR-IOV 在Red Hat Virtualization 的条件。下面简单介绍一下配置方法:

    1) 创建VF 
    首先通过lscpi 验证物理网卡,通过重新加载内核模块参数,来创建VF:

    modprobe -r igb
    modprobe igb max_vfs=7

    或者在rc.local 中配置:

    echo 2 > /sys/class/net/enp14s0f0/device/sriov_numvfs

    查看创建的VF

     lscpi | grep 82587
     virsh nodedev-list | grep 0b

    这里写图片描述 
    这里写图片描述

    2) 将VF分配给虚机

    virsh nodedev-dumpxml pci_0000_0b_00_0 >> /tmp/new-i nterface. xml
    virsh attach-device MyGuest /tmp/new-i nterface. xml --live --config

    后面的步骤相同,不再赘述。SR-IOV 今天就介绍到这里。如果大家有兴趣,推荐阅读以下内容: 
    《IBM Power Systems SR-IOV Technical Overview and Introduction》 
    《How to Configure Intel Ethernet Converged Network Adapter-Enabled VF on VMware ESXi 5.1》 
    《Implementing SR-IOV on HPE ProLiant Servers with VMware vSphere 5.1》 
    《Red_Hat_Enterprise_Linux-7-Virtualization_Deployment_and_Administration_Guide-en-US》

  • 相关阅读:
    【python】raise_for_status()抛出requests.HTTPError错误
    【python】python打包生成的exe文件运行时提示缺少模块
    单点登录原理与简单实现
    Java并发之AQS详解
    Java更新
    各种java面经资源
    HashMap与HashTable的区别
    Http 与Https
    SpringMVC运行原理
    Spring
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/8481237.html
Copyright © 2020-2023  润新知