51学通信论坛2017新版

标题: 确保KVM迁移完成的技术分析 [打印本页]

作者: admin    时间: 2017-11-15 21:51
标题: 确保KVM迁移完成的技术分析
原文地址:
https://www.berrange.com/posts/2016/05/12/analysis-of-techniques-for-ensuring-migration-completion-with-kvm/
正文
实时在线迁移是QEMU / KVM(以及其他虚拟化平台)长期支持的特性,但是,默认情况下它不能很好地处理内存写密集型的虚拟机(在线迁移)。要模拟一个默认配置不能完成迁移的高负荷的虚拟机非常容易。例如,一个持续不断的向1GB的内存区域中写入每个字节的虚拟机就不可能通过1Gb/s的NIC(网卡)成功迁移。即便使用10Gb/s的NIC(网卡),一个稍大的客户机就可以足够快的污染内存从而造成迁移后不可接受的大量停机时间。因此,多年来,QEMU一些可选功能已经开发以帮助完成迁移。
如果你不想读关于迁移功能和测试工具的背景信息,可以直接跳到文章底部的数据表,后面跟的是分析结果。
可用的技术

衡量技术影响
了解各种技术是有益的能最大限度的提高迁移成功率,但很难预测在现实世界中当面对不同的工作负载表现如何。尤其是,事实上是否真的能够在最坏的工作负载情况下以及什么样水平的虚拟机负载的性能影响下确保完成。这是OpenStack Nova项目目前难以得到明确的答案的一个问题,以期提高Nova的libvirt迁移的管理。为了尝试并在这方面提供一些指导,我花了几个星期致力于涉及到上面概述的各种不同的迁移技术主题中的测试QEMU虚拟机性能的框架工作。
OpenStack的目标是使迁移成为一个对于云管理员来说可以完全“撒手不管”的操作。他们应该能够请求一个迁移,然后忘记它,直到它完成,而不必乖乖坐在那儿应用调整参数。另一个目标是,Nova API不必暴露任何虚拟机管理程序的具体概念如后拷贝,自动收敛,压缩,等等。必要时Nova自身决定使用哪种QEMU迁移特性并且只“做正确的事”来确保完成。无论选择什么方法必须能够应付任何类型的客户机的负载情况,因为云管理员将不能查看实际运行在客户机上的任何应用程序。有了这个想法,当测试QEMU迁移特性的性能时就要去看当面对最坏的情况下他们的行为。因此要写这样一个压力程序,它可以分配大量内存,然后每个VCPU产生一个线程从/dev/random获取字节簇永远循环xor'ing到内存的每个字节。这确保了客户机读取和写入到内存工作都很繁重,同时创建对压缩不友好的内存页。该压力程序被静态链接为初始化程序编译进ramdisk,以使Linux启动那一瞬间即运行该压力负荷。为了衡量客户机的性能,每1GB的内存改动,程序会输出关于更新这个GB花费的时间长度和绝对时间戳的细节。这些记录从客户机的串口控制台捕获,后来与主机侧关于迁移发生了什么形成关联。
接下来是时候创建一个工具来控制主机的QEMU和管理迁移过程,激活所需的功能。定义一个测试方案,它编码的细节是迁移的什么功能将被测试以及设置(激活后拷贝之前迭代次数,带宽限制,最大停机时间值,压缩线程数等)。硬件配置定义了扩展运行测试的虚拟机的硬件特性(vCPU数量,内存大小,主机NUMA内存和CPU绑定,大页面的使用,内存锁定,等)。测试/迁移/guestperf.py工具提供了在任何可能的配置调用测试机制。例如,为测试后拷贝迁移,3次迭代后切换到后拷贝,给定1Gbs带宽具有4个vCPU和8GB内存的客户机上可以运行
$ tests/migration/guestperf.py --cpus 4 --mem 8 --post-copy--post-copy-iters 3 --bandwidth 125 --dst-host myotherhost --transport tcp--output postcopy.json
Myotherhost.json文件包含测试结果的完整报告。包括测试方案和硬件配置的所有细节,在每次迭代起始时的迁移状态记录,每秒一次主机处理器的使用量记录,以及客户机压力测试输出。伴随测试/迁移/guestperf-plot.py工具可以使用该数据文件生成交互式HTML图表说明结果。
$ tests/migration/guestperf-plot.py --split-guest-cpu --qemu-cpu--vcpu-cpu --migration-iters --output postcopy.html postcopy.json
然而,为了协助进行运行间比较,也定义了可通过测试/迁移/guestperf-batch.py工具运行的一组标准化的测试方案,在这种情况下,仅要求提供所需的硬件配置
$ tests/migration/guestperf-batch.py --cpus 4 --mem 8 --dst-hostmyotherhost --transport tcp --output myotherhost-4cpu-8gb
这将运行所有的标准定义的测试方案并在myotherhost-4cpu-8gb目录下保存很多数据文件。同样的guestperf-plot.py工具可用于同时创建结合多个数据集的图表便于比较。
QEMU 2.6 的性能结果
用上面写的工具,我打算运行一些针对QEMU Git主代码库的测试,这同刚刚发布的QEMU 2.6代码一样有效。主机对采用戴尔PowerEdge R420服务器具有8 CPU,24GB RAM,在2个NUMA节点传播。主网卡是Broadcom Gigabit,但它被Mellanox 10-Gig-E RDMA能力的网卡增强了,为迁移数据的传输而挑选。为了测试我决定为两个不同的硬件配置收集数据,一个小的单处理器的客户机(1个vCPU和1 GBRAM )和一个中等大小的多处理器的客户机(4个vCPU和RAM 8 GB)。指定内存和CPU绑定,如此客户机都局限于单个NUMA节点避免交叉NUMA节点的内存访问影响性能测量的准确性。主机和客户机都运行RHEL-7 3.10.0-0369.el7.x86_64内核。
为了解不同网络传输的延迟特性的影响,两者的硬件配置组合扩展到了针对4种不同的网络配置–本地UNIX传输,本地TCP传输,远程10Gbs的TCP传输和远程运输10Gbs的RMDA传输。
全套结果与后续的表格相关联。每一行中的第一个链接都给出了一个在该行中的每个方案的一个客户处理器的性能比较。该行中的其他单元格为特定方案提供了完整的主机和客户机的性能细节
UNIX socket, 1 vCPU, 1 GB RAM
使用UNIX套接字迁移到本地主机,客户机配置为1 vCPU,1 GB RAM
ScenarioTunable
Pause unlimited BW0 iters1 iters5 iters20 iters
Pause 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Post-copy unlimited BW0 iters1 iters5 iters20 iters
Post-copy 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Auto-converge unlimited BW5% CPU step10% CPU step20% CPU step
Auto-converge 10% CPU step100 mbs300 mbs1 gbs10 gbsunlimited
MT compression unlimited BW1 thread2 threads4 threads
XBZRLE compression unlimited BW5% cache10% cache20% cache50% cache

UNIX socket, 4 vCPU, 8 GB RAM
使用UNIX套接字迁移到本地主机,客户机配置为4 vCPU,8 GB RAM
ScenarioTunable
Pause unlimited BW0 iters1 iters5 iters20 iters
Pause 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Post-copy unlimited BW0 iters1 iters5 iters20 iters
Post-copy 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Auto-converge unlimited BW5% CPU step10% CPU step20% CPU step
Auto-converge 10% CPU step100 mbs300 mbs1 gbs10 gbsunlimited
MT compression unlimited BW1 thread2 threads4 threads
XBZRLE compression unlimited BW5% cache10% cache20% cache50% cache

TCP socket local, 1 vCPU, 1 GB RAM
使用TCP套接字迁移到本地主机,客户机配置为1 vCPU,1GB RAM
ScenarioTunable
Pause unlimited BW0 iters1 iters5 iters20 iters
Pause 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Post-copy unlimited BW0 iters1 iters5 iters20 iters
Post-copy 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Auto-converge unlimited BW5% CPU step10% CPU step20% CPU step
Auto-converge 10% CPU step100 mbs300 mbs1 gbs10 gbsunlimited
MT compression unlimited BW1 thread2 threads4 threads
XBZRLE compression unlimited BW5% cache10% cache20% cache50% cache

TCP socket local, 4 vCPU, 8 GB RAM
使用TCP套接字迁移到本地主机,客户机配置为4 vCPU,8 GB RAM
ScenarioTunable
Pause unlimited BW0 iters1 iters5 iters20 iters
Pause 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Post-copy unlimited BW0 iters1 iters5 iters20 iters
Post-copy 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Auto-converge unlimited BW5% CPU step10% CPU step20% CPU step
Auto-converge 10% CPU step100 mbs300 mbs1 gbs10 gbsunlimited
MT compression unlimited BW1 thread2 threads4 threads
XBZRLE compression unlimited BW5% cache10% cache20% cache50% cache

TCP socket remote, 1 vCPU, 1 GB RAM
使用TCP套接字迁移到本地主机,客户机配置为1 vCPU,1 GB RAM
ScenarioTunable
Pause unlimited BW0 iters1 iters5 iters20 iters
Pause 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Post-copy unlimited BW0 iters1 iters5 iters20 iters
Post-copy 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Auto-converge unlimited BW5% CPU step10% CPU step20% CPU step
Auto-converge 10% CPU step100 mbs300 mbs1 gbs10 gbsunlimited
MT compression unlimited BW1 thread2 threads4 threads
XBZRLE compression unlimited BW5% cache10% cache20% cache50% cache

TCP socket remote, 4 vCPU, 8 GB RAM
使用TCP套接字迁移到远程主机,客户机配置为4 vCPU,8 GB RAM
ScenarioTunable
Pause unlimited BW0 iters1 iters5 iters20 iters
Pause 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Post-copy unlimited BW0 iters1 iters5 iters20 iters
Post-copy 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Auto-converge unlimited BW5% CPU step10% CPU step20% CPU step
Auto-converge 10% CPU step100 mbs300 mbs1 gbs10 gbsunlimited
MT compression unlimited BW1 thread2 threads4 threads
XBZRLE compression unlimited BW5% cache10% cache20% cache50% cache

RDMA socket, 1 vCPU, 1 GB RAM
使用RDMA套接字迁移到远程主机,客户机配置为1 vCPU,1 GB RAM
ScenarioTunable
Pause unlimited BW0 iters1 iters5 iters20 iters
Pause 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Post-copy unlimited BW0 iters1 iters5 iters20 iters
Post-copy 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Auto-converge unlimited BW5% CPU step10% CPU step20% CPU step
Auto-converge 10% CPU step100 mbs300 mbs1 gbs10 gbsunlimited
MT compression unlimited BW1 thread2 threads4 threads
XBZRLE compression unlimited BW5% cache10% cache20% cache50% cache

RDMA socket, 4 vCPU, 8 GB RAM
使用RDMA套接字迁移到远程主机,客户机配置为4 vCPU,8 GB RAM
ScenarioTunable
Pause unlimited BW0 iters1 iters5 iters20 iters
Pause 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Post-copy unlimited BW0 iters1 iters5 iters20 iters
Post-copy 5 iters100 mbs300 mbs1 gbs10 gbsunlimited
Auto-converge unlimited BW5% CPU step10% CPU step20% CPU step
Auto-converge 10% CPU step100 mbs300 mbs1 gbs10 gbsunlimited
MT compression unlimited BW1 thread2 threads4 threads
XBZRLE compression unlimited BW5% cache10% cache20% cache50% cache

结果分析
上面的图表提供了完整的原始结果,欢迎你得出自己的结论。试验控制也张贴在QEMU开发邮件列表并有望被合并到Git,所以任何人都可以重复试验或运行测试比较其他方案。下面是我的解释以及由此展现的有趣的点。

综合测试的所有不同功能,显然后拷贝是赢家。它每次都能够保证完成迁移,无论客户机的内存大小与对客户机的性能最小的持久影响。虽然它确实在从前拷贝到后拷贝阶段切换时有一个显着的尖峰影响客户机的性能,这种影响是短暂的,只有几秒钟。下一个最好的结果是自动收敛,在大多数情况下成功完成迁移。通过与后拷贝比较,最坏的情况下影响客户机的CPU性能的幅度大小相同,但它持续了很长一段时间,几分钟长。此外,更高带宽限制的场景下,自动收敛无法足够快地削减客户机CPU以避免碰到整个5分钟的超时,而后拷贝总能成功除了在最有限的带宽情况下(100M–没策略能)。后拷贝的另一个好处是,只有对页面故障负责的操作系统线程被延迟了,如果客户操作系统上的其他线程的RAM已经在主机上,他们将继续以正常速度运行。使用自动收敛,所有客户机的CPU和线程都被削减,不论他们是否该对脏页负责。IOW后拷贝具有有目标的性能损失,而自动收敛是无差别的。最后,正如前面提到的,后拷贝确实有故障的情况,如果到源主机的网络连接丢失时间太久造成TCP连接超时会导致在后拷贝模式下失去VM。这种风险可以通过网络层冗余减轻,而且风险只存在客户机运行在后拷贝模式下短期时间,这在10Gbs的链接中只有短短的几秒钟。
预计压缩功能在给定的客户机的工作量下会相当糟糕,但影响远比预期要更糟,特别是MT压缩。假定主要要求是压缩主机CPU时间(MT压缩)或主机RAM(XBZRLE压缩),它们都不是可用的普适特性。他们应该只被使用在工作负载是压缩友好的,主机有CPU和/或RAM资源分配,并且后拷贝和自动收敛都不可用的情况下。为了使这些功能的使用在一个自动化的通用方式更加实用,QEMU将被增强允许管理应用在迁移中可以直接控制打开或关闭他们。这将允许应用程序尝试使用压缩,监控其效率,然后如果它是有害的就关闭压缩,而不是不得不放弃整个迁移并重新启动迁移。
对RDMA研究范围需要有进一步的测试,因为用于测试的硬件上限10Gbs。新的RDMA硬件应该是能够达到更高的速度,40Gbs,甚至100Gbs,这可能会对迁移能力有一个相对积极的影响。但是至少在任何不高于10Gbs的速度,似乎不值得使用RDMA,应用应该是将使用TCP与后拷贝联合起来。
在网络I/O方面,不管什么样的客户机工作负载,QEMU一般能够充分占满带宽直至完成。很容易创造永远不会完成的负载,并且减少可用带宽,只会增加迁移的机会。有个想法很诱人,如果你有2个客户机,它会采取相同的总时间,无论你是否一个接一个地迁移他们,或平行地迁移他们。但这并不是必然的,因为平行迁移带宽将在他们之间共享,这增加了两个客户机都将永远不会完成的几率。所以,作为一般规则,序列化给定主机上的所有迁移操作似乎是明智的,除非有多个网卡可用。
总之,如果可行,使用后拷贝,否则使用自动收敛。别惹压缩,除非负载已知为非常压缩友好的。别惹RDMA除非它支持超过10Gbs,否则坚持普通的TCP。

声明:本文转载自网络。版权归原作者所有,如有侵权请联系删除。




欢迎光临 51学通信论坛2017新版 (http://bbs.51xuetongxin.com/) Powered by Discuz! X3