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设备直接分配和 SR-IOV
- (5)libvirt 介绍
- (6)Nova 通过 libvirt 管理 QEMU/KVM 虚机
- (7)快照 (snapshot)
- (8)迁移 (migration)
本文将分析 PCI/PCIe 设备直接分配(Pass-through)和 SR-IOV, 以及三种 I/O 虚拟化方式的比较。
1. PCI/PCI-E 设备直接分配给虚机 (PCI Pass-through)
设备直接分配 (Device assignment)也称为 Device Pass-Through。
先简单看看PCI 和 PCI-E 的区别(AMD CPU):
(简单点看,PCI 卡的性能没有 PCI-E 高,因为 PCI-E 是直接连在 IOMMU 上,而 PCI 卡是连在一个 IO Hub 上。)
主要的 PCI 设备类型:
- Network cards (wired or wireless)
- SCSI adapters
- Bus controllers: USB, PCMCIA, I2C, FireWire, IDE
- Graphics and video cards
- Sound cards
1.1 PCI/PCIe Pass-through 原理
硬盘直接分配:
- 一般 SATA 或者 SAS 等类型的硬盘的控制器都是直接接入到 PCI 或者 PCI-E 总线的,所以也可以将硬盘作为普通的PCI设备直接分配个客户机。需要注意的是,当分配硬盘时,实际上将其控制器作为一个整体分配到客户机中,因此需要在硬件平台上至少有另两个或者多个SATA或者 SAS控制器。
1.2 在 RedHat Linux 6 上使用 virt-manger 分配一个光纤卡给虚机
准备工作:
(1)在 BIOS 中打开 Intel VT-d
(2)在 Linux 内核中启用 PCI Pass-through
添加 intel_iommu=on 到 /boot/grub/grub.conf 文件中。(在我的 RedHat Linux 6上,该文件是 /boot/grub.conf)
(3)重启系统,使得配置生效
实际分配:
(1)使用 lspci -nn 命令找到待分配的 PCI 设备。这里以一个 FC 卡为例:
使用 lspci 命令得到的 PCI 数字的含义,以后使用 libvirt API 分配设备时会用到:
(2)使用 virsh nodedev-list 命令找到该设备的 PCI 编号
(3)将设备从主机上解除
(4)使用 virt-manager 将设备直接分配给一个启动了的虚拟机
(5)添加好了后的效果
(6)在虚机中查看该PCI设备
(7)不再使用的话,需要在 virt-manager 中首先将该设备移除,然后在主机上重新挂载该设备
1.3 在 RedHat Linux 6 上使用 qemu-kvm 分配一个光纤卡给虚机
除了步骤(4),其他步骤同上面。
1.4 设备直接分配让客户机的优势和不足
- 好处:在执行 I/O 操作时大量减少甚至避免 VM-Exit 陷入到 Hypervisor 中,极大地提高了性能,可以达到几乎和原生系统一样的性能。VT-d 克服了 virtio 兼容性不好和 CPU 使用频率较高的问题。
- 不足:(1)一台服务器主板上的空间比较有限,因此允许添加的 PCI 和 PCI-E 设备是有限的。大量使用 VT-d 独立分配设备给客户机,让硬件设备数量增加,这会增加硬件投资成本。(2)对于使用 VT-d 直接分配了设备的客户机,其动态迁移功能将受限,不过也可以使用热插拔或者libvirt 工具等方式来缓解这个问题。
- 不足的解决方案:(1)在一台物理宿主机上,仅少数 I/O 如网络性能要求较高的客户机使用 VT-d直接分配设备,其他的使用纯模拟或者 virtio 已达到多个客户机共享同一个设备的目的 (2)对于网络I/O的解决办法,可以选择 SR-IOV 是一个网卡产生多个独立的虚拟网卡,将每个虚拟网卡分配个一个客户机使用。
2. SR-IOV 设备分配
2.1 原理
- 物理功能(Physical Functions,PF):这是完整的带有 SR-IOV 能力的PCIe 设备。PF 能像普通 PCI 设备那样被发现、管理和配置。
- 虚拟功能(Virtual Functions,VF):简单的 PCIe 功能,它只能处理I/O。每个 VF 都是从 PF 中分离出来的。每个物理硬件都有一个 VF 数目的限制。一个 PF,能被虚拟成多个 VF 用于分配给多个虚拟机。
光纤卡 SR-IOV 的例子:
2.2 SR-IOV 的条件
- 需要 CPU 支持 Intel VT-x 和 VT-D (或者 AMD 的 SVM 和 IOMMU)
- 需要有支持 SR-IOV 规范的设备:目前这种设备较多,比如Intel的很多中高端网卡等。
- 需要 QEMU/KAM 的支持。
- Intel® 82576NS Gigabit Ethernet Controller ( igb 驱动)
- Intel® 82576EB Gigabit Ethernet Controller ( igb 驱动)
- Intel® 82599ES 10 Gigabit Ethernet Controller ( ixgbe 驱动)
- Intel® 82599EB 10 Gigabit Ethernet Controller ( ixgbe 驱动)
2.3 分配 SR-IOV 设备的步骤
手头没有支持SR-IOV的设备。这是 RedHat 上 SR-IOV 的配置步骤: Using SR-IOV。
简单来说,SR-IOV 分配步骤和设备直接分配相比基本类似,除了要使 PF 虚拟化成多个 VF 以外。
2.4 优势和不足
优势 | 不足 |
|
|
3. 各种设备虚拟化方式的比较
3.1 架构上的比较(以网卡为例)
3.2 性能上的比较 (以网卡为例)
纯模拟网卡和物理网卡的比较:
(来源:Evaluating and Optimizing I/O Virtualization in Kernel-based Virtual Machine (KVM), Binbin Zhang, Xiaolin Wang, Rongfeng Lai, Liang Yang, Zhenlin Wang,Yingwei Luo, Xiaoming Li)
(测试环境:两台物理服务器 HostA 和 HostB,都使用GB以太网。HostA 使用 82566DC 网卡,HostB 使用 82567LM-2 网卡,一台虚机运行在 HostB 上,使用 KVM-76.)
结论:
- 纯模拟网卡的性能只有物理网卡的四成到六成
- 纯模拟网卡的 UDP 性能比 TCP 性能高 50% 到 100%
- 在虚拟网卡上使用 NAPI,不但不会提高性能,反而会是性能下降
- e1000 的性能比 rt18139 的性能高不少(为什么 RedHat Linux KVM 上默认的网卡是 rt18139 呢?)
Virtio 和 vhost_net 的吞吐量比较:
- 来源:CANONICAL, KVM Performance Optimization, Paul Sim,Cloud Consultant, paul.sim@canonical.com
- 结论: vhost_net 比 virtio 的 UDP 和 TCP 性能高 20% 左右。
RedHat Linux 6 上 virtio,vhost_net,SR-IOV 和物理设备网络延迟的比较:
(来源:RedHat 官网)
RedHat Linux 6 上 virtio 和 vhost_net 所消耗的主机CPU资源的比较:
(来源同上)
使用 virtio 的 KVM 与物理机的 TCP 吞吐量对比:
(数据来源:RedHat 官网)
物理机与使用 SR-IOV 的 KVM 的网络性能对比:
(来源:同上)
物理机与使用 Pass-through 的KVM 的 TCP 性能对比:
(资料来源:Open Source Virtualization: KVM and Linux, Chris Wright, Principal Software Engineer, Red Hat,September 4, 2009)
3.3 Virtio 和 Pass-Through 的详细比较
(来源:Reconnaissance of Virtio: What’s new and how it’s all connected? by Mario Smarduch)
4. 综合结论
KVM 依赖的Intel/AMD 处理器的各种虚拟化扩展:
处理器 | CPU 虚拟化 | 内存虚拟化 | PCI Pass-through |
Intel | VT-x | VPID,EPT | VT-d |
AMD | AMD-V | ASID,NPT | IOMMU |
I/O 虚拟化方案的选择:
- I/O设备尽量使用准虚拟化(virtio 和 vhost_net)
- 如果需要实时迁移,不能使用 SR-IOV
- 对更高I/O要求又不需要实时迁移的,可以使用 SR-IOV
- 每种方案都有优势和不足,在特定环境下其性能有可能反而下降,因此在生产环境中使用各种虚拟化方式前需要经过完整测试
其它参考资料:
- RedHat Linux 6 官方文档
- KVM 官方文档
- KVM 虚拟化技术实战与解析 任永杰、单海涛 著
- KVM 虚拟化技术在 AMD 平台上的实现
KVM 介绍(4):I/O 设备直接分配和 SR-IOV [KVM PCI/PCIe Pass-Through SR-IOV]相关推荐
- KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]
KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain] 学习 KVM 的系列文章: (1)介绍和安装 (2)CP ...
- linux禁用及启用pcie设备,KVM 介绍(4):I/O设备直接分配和 SRIOV [KVM PCI/PCIe PassThrough SRIOV]...
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- KVM之I/O PCI/PCI-E设备直接分配和SR-IOV
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接 ...
- KVM中I/O设备直接分配和SR-IOV(十六)
学习 KVM 的系列文章: 本文将分析 PCI/PCIe 设备直接分配(Pass-through)和 SR-IOV, 以及三种 I/O 虚拟化方式的比较. 1. PCI/PCI-E 设备直接分配给虚机 ...
- 【KVM系列04】KVM的I/O 设备直接分配和SR-IOV
第四章 I/O 设备直接分配和 SR-IOV 1. PCI/PCI-E 设备直接分配给虚机 (PCI Pass-through) 1.1 PCI/PCIe Pass-through 原理 1.2 在 ...
- 世民谈云计算:KVM 介绍
http://www.cnblogs.com/sammyliu/p/4543110.html KVM 介绍(1):简介及安装 学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 ...
- KVM 介绍(7):使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 (Nova Instances Snapshot Libvirt)...
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- 虚拟化技术:KVM介绍及试用
KVM介绍及试用 服务器虚拟化是云计算最核心的技术,而KVM是当前最主流的开源的服务器虚拟化技术.从Linux2.6.20起,KVM作为内核的一个模块 集成到Linux主要发行版本中.从技术架构(代码 ...
- KVM介绍 虚拟化简史
KVM介绍 为什么需要CPU虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机 硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件. Ring ...
最新文章
- 计算机与生物学交叉学科,美国本科开设了哪些交叉学科?
- 基于 Rancher 的企业 CI/CD 环境搭建
- Ubuntu显示隐藏文件和文件夹
- smartupload 路径不存在_洞悉复杂金融场景,覆盖完备测试路径
- (轉貼) ThinkPad鍵盤設計原理和哲學 (NB) (ThinkPad)
- 《TOMCAT权威指南》摘抄
- centos 删除crontab_Centos 7 安装crontab及cron常用命令
- eclipse在Windows7 64 位下出现Unhandled event loop exception No more handles
- Unity -- .NET下的原生Ioc框架
- java jxl读取xlsx_Java添加、读取Excel公式
- 7. 文件和数据格式化
- 1146 mysql_MySQL错误处理--1146错误
- php为网页更改颜色,php如何设置网页颜色?
- 计算机二级考试没过能重考吗,计算机二级能重复考吗
- 成人大专计算机统考的操作详解,成人大专计算机统考选择题汇总
- 解读高端PCB板的设计工艺!
- 超详细基于Qt平台实现C/C++调用Matlab函数全流程
- 天下3最新服务器列表,天下3_网络游戏专区_腾讯游戏频道
- SCIP 1.3 总结
- Linux 指令系统
热门文章
- 特斯拉2021全年交付近百万辆,同比暴涨87%,马斯克:了不起!
- 他们翻遍用AI检测新冠的论文,一篇临床可用的也没有?!
- 提前“剧透”能提高自监督学习性能吗?华为诺亚实验室说:不一定!
- “中文版GPT-3”来了:会算术、可续写红楼梦,用64张V100训练了3周
- CNCC技术论坛 | 面向人工智能芯片的编程语言和编译器
- 用无人车硬件玩GTA 5,这个12岁孩子的外挂有点硬核
- 免费数学神器有了手机版,再复杂的公式,拍照就能转成LaTeX
- 三种方式搭建yum源
- mysql update操作
- C++中一些类和数据结构的大小的总结