From: Isaku Yamahata <yamahata@valinux.co.jp> To: kvm@vger.kernel.org, qemu-devel@nongnu.org Cc: yamahata@valinux.co.jp, t.hirofuchi@aist.go.jp, satoshi.itoh@aist.go.jp Subject: [PATCH 00/21][RFC] postcopy live migration Date: Thu, 29 Dec 2011 10:25:39 +0900 [thread overview] Message-ID: <cover.1325055139.git.yamahata@valinux.co.jp> (raw) Intro ===== This patch series implements postcopy live migration.[1] As discussed at KVM forum 2011, dedicated character device is used for distributed shared memory between migration source and destination. Now we can discuss/benchmark/compare with precopy. I believe there are much rooms for improvement. [1] http://wiki.qemu.org/Features/PostCopyLiveMigration Usage ===== You need load umem character device on the host before starting migration. Postcopy can be used for tcg and kvm accelarator. The implementation depend on only linux umem character device. But the driver dependent code is split into a file. I tested only host page size == guest page size case, but the implementation allows host page size != guest page size case. The following options are added with this patch series. - incoming part command line options -postcopy [-postcopy-flags <flags>] where flags is for changing behavior for benchmark/debugging Currently the following flags are available 0: default 1: enable touching page request example: qemu -postcopy -incoming tcp:0:4444 -monitor stdio -machine accel=kvm - outging part options for migrate command migrate [-p [-n]] URI -p: indicate postcopy migration -n: disable background transferring pages: This is for benchmark/debugging example: migrate -p -n tcp:<dest ip address>:4444 TODO ==== - benchmark/evaluation. Especially how async page fault affects the result. - improve/optimization At the moment at least what I'm aware of is - touching pages in incoming qemu process by fd handler seems suboptimal. creating dedicated thread? - making incoming socket non-blocking - outgoing handler seems suboptimal causing latency. - catch up memory API change - consider on FUSE/CUSE possibility - and more... basic postcopy work flow ======================== qemu on the destination | V open(/dev/umem) | V UMEM_DEV_CREATE_UMEM | V Here we have two file descriptors to umem device and shmem file | | umemd | daemon on the destination | V create pipe to communicate fork()---------------------------------------, | | V | close(socket) V close(shmem) mmap(shmem file) | | V V mmap(umem device) for guest RAM close(shmem file) | | close(umem device) | | | V | wait for ready from daemon <----pipe-----send ready message | | | Here the daemon takes over send ok------------pipe---------------> the owner of the socket | to the source V | entering post copy stage | start guest execution | | | V V access guest RAM UMEM_GET_PAGE_REQUEST | | V V page fault ------------------------------>page offset is returned block | V pull page from the source write the page contents to the shmem. | V unblock <-----------------------------UMEM_MARK_PAGE_CACHED the fault handler returns the page page fault is resolved | | pages can be sent | backgroundly | | | V | UMEM_MARK_PAGE_CACHED | | V V The specified pages<-----pipe------------request to touch pages are made present by | touching guest RAM. | | | V V reply-------------pipe-------------> release the cached page | madvise(MADV_REMOVE) | | V V all the pages are pulled from the source | | V V the vma becomes anonymous<----------------UMEM_MAKE_VMA_ANONYMOUS (note: I'm not sure if this can be implemented or not) | | V V migration completes exit() Isaku Yamahata (21): arch_init: export sort_ram_list() and ram_save_block() arch_init: export RAM_SAVE_xxx flags for postcopy arch_init/ram_save: introduce constant for ram save version = 4 arch_init: refactor host_from_stream_offset() arch_init/ram_save_live: factor out RAM_SAVE_FLAG_MEM_SIZE case arch_init: refactor ram_save_block() arch_init/ram_save_live: factor out ram_save_limit arch_init/ram_load: refactor ram_load exec.c: factor out qemu_get_ram_ptr() exec.c: export last_ram_offset() savevm: export qemu_peek_buffer, qemu_peek_byte, qemu_file_skip savevm: qemu_pending_size() to return pending buffered size savevm, buffered_file: introduce method to drain buffer of buffered file migration: export migrate_fd_completed() and migrate_fd_cleanup() migration: factor out parameters into MigrationParams umem.h: import Linux umem.h update-linux-headers.sh: teach umem.h to update-linux-headers.sh configure: add CONFIG_POSTCOPY option postcopy: introduce -postcopy and -postcopy-flags option postcopy outgoing: add -p and -n option to migrate command postcopy: implement postcopy livemigration Makefile.target | 4 + arch_init.c | 260 ++++--- arch_init.h | 20 + block-migration.c | 8 +- buffered_file.c | 20 +- buffered_file.h | 1 + configure | 12 + cpu-all.h | 9 + exec-obsolete.h | 1 + exec.c | 75 +- hmp-commands.hx | 12 +- hw/hw.h | 7 +- linux-headers/linux/umem.h | 83 ++ migration-exec.c | 8 + migration-fd.c | 30 + migration-postcopy-stub.c | 77 ++ migration-postcopy.c | 1891 +++++++++++++++++++++++++++++++++++++++ migration-tcp.c | 37 +- migration-unix.c | 32 +- migration.c | 53 +- migration.h | 49 +- qemu-common.h | 2 + qemu-options.hx | 25 + qmp-commands.hx | 10 +- savevm.c | 31 +- scripts/update-linux-headers.sh | 2 +- sysemu.h | 4 +- umem.c | 379 ++++++++ umem.h | 105 +++ vl.c | 20 +- 30 files changed, 3086 insertions(+), 181 deletions(-) create mode 100644 linux-headers/linux/umem.h create mode 100644 migration-postcopy-stub.c create mode 100644 migration-postcopy.c create mode 100644 umem.c create mode 100644 umem.h
WARNING: multiple messages have this Message-ID (diff)
From: Isaku Yamahata <yamahata@valinux.co.jp> To: kvm@vger.kernel.org, qemu-devel@nongnu.org Cc: yamahata@valinux.co.jp, t.hirofuchi@aist.go.jp, satoshi.itoh@aist.go.jp Subject: [Qemu-devel] [PATCH 00/21][RFC] postcopy live migration Date: Thu, 29 Dec 2011 10:25:39 +0900 [thread overview] Message-ID: <cover.1325055139.git.yamahata@valinux.co.jp> (raw) Intro ===== This patch series implements postcopy live migration.[1] As discussed at KVM forum 2011, dedicated character device is used for distributed shared memory between migration source and destination. Now we can discuss/benchmark/compare with precopy. I believe there are much rooms for improvement. [1] http://wiki.qemu.org/Features/PostCopyLiveMigration Usage ===== You need load umem character device on the host before starting migration. Postcopy can be used for tcg and kvm accelarator. The implementation depend on only linux umem character device. But the driver dependent code is split into a file. I tested only host page size == guest page size case, but the implementation allows host page size != guest page size case. The following options are added with this patch series. - incoming part command line options -postcopy [-postcopy-flags <flags>] where flags is for changing behavior for benchmark/debugging Currently the following flags are available 0: default 1: enable touching page request example: qemu -postcopy -incoming tcp:0:4444 -monitor stdio -machine accel=kvm - outging part options for migrate command migrate [-p [-n]] URI -p: indicate postcopy migration -n: disable background transferring pages: This is for benchmark/debugging example: migrate -p -n tcp:<dest ip address>:4444 TODO ==== - benchmark/evaluation. Especially how async page fault affects the result. - improve/optimization At the moment at least what I'm aware of is - touching pages in incoming qemu process by fd handler seems suboptimal. creating dedicated thread? - making incoming socket non-blocking - outgoing handler seems suboptimal causing latency. - catch up memory API change - consider on FUSE/CUSE possibility - and more... basic postcopy work flow ======================== qemu on the destination | V open(/dev/umem) | V UMEM_DEV_CREATE_UMEM | V Here we have two file descriptors to umem device and shmem file | | umemd | daemon on the destination | V create pipe to communicate fork()---------------------------------------, | | V | close(socket) V close(shmem) mmap(shmem file) | | V V mmap(umem device) for guest RAM close(shmem file) | | close(umem device) | | | V | wait for ready from daemon <----pipe-----send ready message | | | Here the daemon takes over send ok------------pipe---------------> the owner of the socket | to the source V | entering post copy stage | start guest execution | | | V V access guest RAM UMEM_GET_PAGE_REQUEST | | V V page fault ------------------------------>page offset is returned block | V pull page from the source write the page contents to the shmem. | V unblock <-----------------------------UMEM_MARK_PAGE_CACHED the fault handler returns the page page fault is resolved | | pages can be sent | backgroundly | | | V | UMEM_MARK_PAGE_CACHED | | V V The specified pages<-----pipe------------request to touch pages are made present by | touching guest RAM. | | | V V reply-------------pipe-------------> release the cached page | madvise(MADV_REMOVE) | | V V all the pages are pulled from the source | | V V the vma becomes anonymous<----------------UMEM_MAKE_VMA_ANONYMOUS (note: I'm not sure if this can be implemented or not) | | V V migration completes exit() Isaku Yamahata (21): arch_init: export sort_ram_list() and ram_save_block() arch_init: export RAM_SAVE_xxx flags for postcopy arch_init/ram_save: introduce constant for ram save version = 4 arch_init: refactor host_from_stream_offset() arch_init/ram_save_live: factor out RAM_SAVE_FLAG_MEM_SIZE case arch_init: refactor ram_save_block() arch_init/ram_save_live: factor out ram_save_limit arch_init/ram_load: refactor ram_load exec.c: factor out qemu_get_ram_ptr() exec.c: export last_ram_offset() savevm: export qemu_peek_buffer, qemu_peek_byte, qemu_file_skip savevm: qemu_pending_size() to return pending buffered size savevm, buffered_file: introduce method to drain buffer of buffered file migration: export migrate_fd_completed() and migrate_fd_cleanup() migration: factor out parameters into MigrationParams umem.h: import Linux umem.h update-linux-headers.sh: teach umem.h to update-linux-headers.sh configure: add CONFIG_POSTCOPY option postcopy: introduce -postcopy and -postcopy-flags option postcopy outgoing: add -p and -n option to migrate command postcopy: implement postcopy livemigration Makefile.target | 4 + arch_init.c | 260 ++++--- arch_init.h | 20 + block-migration.c | 8 +- buffered_file.c | 20 +- buffered_file.h | 1 + configure | 12 + cpu-all.h | 9 + exec-obsolete.h | 1 + exec.c | 75 +- hmp-commands.hx | 12 +- hw/hw.h | 7 +- linux-headers/linux/umem.h | 83 ++ migration-exec.c | 8 + migration-fd.c | 30 + migration-postcopy-stub.c | 77 ++ migration-postcopy.c | 1891 +++++++++++++++++++++++++++++++++++++++ migration-tcp.c | 37 +- migration-unix.c | 32 +- migration.c | 53 +- migration.h | 49 +- qemu-common.h | 2 + qemu-options.hx | 25 + qmp-commands.hx | 10 +- savevm.c | 31 +- scripts/update-linux-headers.sh | 2 +- sysemu.h | 4 +- umem.c | 379 ++++++++ umem.h | 105 +++ vl.c | 20 +- 30 files changed, 3086 insertions(+), 181 deletions(-) create mode 100644 linux-headers/linux/umem.h create mode 100644 migration-postcopy-stub.c create mode 100644 migration-postcopy.c create mode 100644 umem.c create mode 100644 umem.h
next reply other threads:[~2011-12-29 1:26 UTC|newest] Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-12-29 1:25 Isaku Yamahata [this message] 2011-12-29 1:25 ` [Qemu-devel] [PATCH 00/21][RFC] postcopy live migration Isaku Yamahata 2011-12-29 1:25 ` [PATCH 01/21] arch_init: export sort_ram_list() and ram_save_block() Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 02/21] arch_init: export RAM_SAVE_xxx flags for postcopy Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 03/21] arch_init/ram_save: introduce constant for ram save version = 4 Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 04/21] arch_init: refactor host_from_stream_offset() Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 05/21] arch_init/ram_save_live: factor out RAM_SAVE_FLAG_MEM_SIZE case Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 06/21] arch_init: refactor ram_save_block() Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 07/21] arch_init/ram_save_live: factor out ram_save_limit Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 08/21] arch_init/ram_load: refactor ram_load Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 09/21] exec.c: factor out qemu_get_ram_ptr() Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 10/21] exec.c: export last_ram_offset() Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 11/21] savevm: export qemu_peek_buffer, qemu_peek_byte, qemu_file_skip Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 12/21] savevm: qemu_pending_size() to return pending buffered size Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 13/21] savevm, buffered_file: introduce method to drain buffer of buffered file Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 14/21] migration: export migrate_fd_completed() and migrate_fd_cleanup() Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 15/21] migration: factor out parameters into MigrationParams Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 16/21] umem.h: import Linux umem.h Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 17/21] update-linux-headers.sh: teach umem.h to update-linux-headers.sh Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 18/21] configure: add CONFIG_POSTCOPY option Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 19/21] postcopy: introduce -postcopy and -postcopy-flags option Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:25 ` [PATCH 20/21] postcopy outgoing: add -p and -n option to migrate command Isaku Yamahata 2011-12-29 1:25 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 1:26 ` [PATCH 21/21] postcopy: implement postcopy livemigration Isaku Yamahata 2011-12-29 1:26 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 15:51 ` Orit Wasserman 2011-12-29 15:51 ` Orit Wasserman 2012-01-04 3:34 ` Isaku Yamahata 2012-01-04 3:34 ` [Qemu-devel] " Isaku Yamahata 2011-12-29 16:06 ` Avi Kivity 2011-12-29 16:06 ` [Qemu-devel] " Avi Kivity 2012-01-04 3:29 ` Isaku Yamahata 2012-01-04 3:29 ` [Qemu-devel] " Isaku Yamahata 2012-01-12 14:15 ` Avi Kivity 2012-01-12 14:15 ` [Qemu-devel] " Avi Kivity 2011-12-29 22:39 ` [PATCH 00/21][RFC] postcopy live migration Anthony Liguori 2011-12-29 22:39 ` [Qemu-devel] " Anthony Liguori 2012-01-01 9:43 ` Orit Wasserman 2012-01-01 9:43 ` [Qemu-devel] " Orit Wasserman 2012-01-01 16:27 ` Stefan Hajnoczi 2012-01-01 16:27 ` Stefan Hajnoczi 2012-01-02 9:28 ` Dor Laor 2012-01-02 9:28 ` Dor Laor 2012-01-02 17:22 ` Stefan Hajnoczi 2012-01-02 17:22 ` [Qemu-devel] " Stefan Hajnoczi 2012-01-01 9:52 ` Dor Laor 2012-01-01 9:52 ` [Qemu-devel] " Dor Laor 2012-01-04 1:30 ` Takuya Yoshikawa 2012-01-04 1:30 ` [Qemu-devel] " Takuya Yoshikawa 2012-01-04 3:48 ` Michael Roth 2012-01-04 3:48 ` [Qemu-devel] " Michael Roth 2012-01-04 3:51 ` Isaku Yamahata 2012-01-04 3:51 ` Isaku Yamahata [not found] ` <BLU0-SMTP161AC380D472854F48E33A5BC9A0@phx.gbl> 2012-01-11 2:45 ` 回??: " Isaku Yamahata 2012-01-11 2:45 ` [Qemu-devel] " Isaku Yamahata 2012-01-12 8:29 ` thfbjyddx 2012-01-12 8:29 ` [Qemu-devel] " thfbjyddx 2012-01-12 8:54 ` 回??: [PATCH 00/21][RFC] postcopy live?migration Isaku Yamahata 2012-01-12 8:54 ` [Qemu-devel] " Isaku Yamahata 2012-01-12 13:26 ` thfbjyddx 2012-01-12 13:26 ` [Qemu-devel] " thfbjyddx 2012-01-16 6:51 ` Isaku Yamahata 2012-01-16 6:51 ` [Qemu-devel] " Isaku Yamahata 2012-01-16 10:17 ` Isaku Yamahata 2012-01-16 10:17 ` [Qemu-devel] " Isaku Yamahata 2012-03-12 8:36 ` thfbjyddx 2012-03-12 8:36 ` [Qemu-devel] " thfbjyddx 2012-03-13 3:21 ` Isaku Yamahata 2012-03-13 3:21 ` [Qemu-devel] " Isaku Yamahata
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=cover.1325055139.git.yamahata@valinux.co.jp \ --to=yamahata@valinux.co.jp \ --cc=kvm@vger.kernel.org \ --cc=qemu-devel@nongnu.org \ --cc=satoshi.itoh@aist.go.jp \ --cc=t.hirofuchi@aist.go.jp \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.