今天来讨论讨论post-copy和x-multifd
Postcopy
postcopy 也是现在热门的动态迁移方法,对比起pre-copy,postcopy迁移的速度更快,几乎能达到迁移的源机(source)和目的机(distination)无缝衔接。尤其对于有大量的内存读写操作的虚拟机,迁移带宽又有限,postcopy是热迁移更为有效的方法。
我们先来说说postcopy的原理,从中我们可以看到postcopy的优劣势。
简单来说postcopy就是先把虚拟机现有的CPU state, registers and, optionally, non-pageable memory(内存中不会进行交换或者移动的内存)等信息传输到目的服务器,不管dirty page,并迅速把虚拟机在目的服务器启动起来。同时,源服务器也会动态的把剩余的memory推送到目的服务器上。但是当虚拟机运行调用到还没传输过来的memory时,会触发page-fault. (https://en.wikipedia.org/wiki/Live_migration#Post-copy_memory_migration)
postcopy 基于 linux 'userfaultfd' kernel 机制处理这些page-fault的。userfaultfd可以让目的机,在用户空间(userspace)通过文件描述符fd获得page fault的信息(http://xiaogr.com/?p=96)。简单的说就是当虚拟机在目的服务器上调用到这些还未传输完成的内存时,userfaultfd可以到源服务器上把这些内存信息取出,并传输到目的服务器上,让虚拟机继续运行。具体流程可以参考下图:

虚拟机对于内存的读写压力并不会影响到postcopy是否成功,但是虚拟机迁移完成后,如果对于内存读写压力大的话,会频繁调用userfaultfd,这会对服务器带宽带来压力,也会造成虚拟机性能下降。
下面是对postcopy的简单测试。
源服务器
migrate_set_capability postcopy-ram on
migrate_set_capability postcopy-blocktime on
migrate -d tcp:192.168.4.161:4444
migrate_start_postcopy
目的服务器
migrate_set_capability postcopy-ram on
migrate_set_capability postcopy-blocktime on
postcopy-blocktime打开后可以看到postcopy上传后续ram需要的时间,如下图:
#########################################################################################
10g | postcopy on | postcopy-blocktime on | multifd off
-----------------------------------------------------------------------------------------
Source:
Migration status: completed
total time: 7386 milliseconds
downtime: 13 milliseconds
setup: 5 milliseconds
transferred ram: 6496539 kbytes
throughput: 7210.48 mbps
remaining ram: 0 kbytes
total ram: 5374400 kbytes
duplicate: 43804 pages
skipped: 0 pages
normal: 101490 pages
normal bytes: 6495360 kbytes
dirty sync count: 4
page size: 64 kbytes
multifd bytes: 0 kbytes
postcopy request count: 2630
Distination:
Migration status: completed
total time: 0 milliseconds
postcopy blocktime: 202
postcopy vcpu blocktime: 202
x-multifd
官网上对于x-multifd介绍很简单:Use more than one fd for migration。使用多个fd进行迁移。
下面是对于x-multifd的配置
migrate_set_capability x-multifd on
migrate_set_parameter x-multifd-channels 4
migrate_set_parameter x-multifd-page-count 20
x-multifd-channels:在迁移时,使用多少个channels进行并行传输,也是用于迁移的sockets的数量,默认为2.
x-multifd-page-count:会将多少张pages一并发给一个thread,默认值为16.
实际使用以后发现对于无论postcopy还是precopy的效率提升都非常明显。尤其是能提高对于带宽的利用。下面是一组对比结果
| default | x-multifd | |
| total time(msec): | 5980 | 3903(34.7%↓) |
| downtime(msec): | 501 | 287(42.7%↓) |
| transfered ram(kB): | 7665257 | 6505620 (15.1%↓) |
| throughput(mbps): | 10513.10 | 13689.96 (30.2%↑) |
| total ram(kB): | 5374400 | 5374400 |
| multifd bytes(kB): | 6505235 |
当提高multifd-channels和multifd-page-count后,throughput能够上升到17703mbps,total time下降到2168ms。对于cpu有空闲负载的时候,使用这个方法做热迁移还是不错的。
本文探讨QEMU live migration的优化技术,包括postcopy和x-multifd。postcopy提供更快的迁移速度,尤其适合内存读写操作频繁的场景,利用userfaultfd处理page-fault。x-multifd通过多通道并行传输提升迁移效率,显著提高带宽利用率。
1633

被折叠的 条评论
为什么被折叠?



