qemu live migration 优化 2(post-copy and x-multifd)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yadehuiyin/article/details/81382060

今天来讨论讨论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可以到源服务器上把这些内存信息取出,并传输到目的服务器上,让虚拟机继续运行。具体流程可以参考下图:

Postcopyflow.png

虚拟机对于内存的读写压力并不会影响到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有空闲负载的时候,使用这个方法做热迁移还是不错的。

 

展开阅读全文

没有更多推荐了,返回首页