On Thu, Apr 6, 2017 at 10:02 PM, Stefan Hajnoczi <stefa...@redhat.com> wrote: > On Wed, Apr 05, 2017 at 05:27:58PM +0800, jemmy858...@gmail.com wrote: >> From: Lidong Chen <lidongc...@tencent.com> >> >> when migration with high speed, mig_save_device_bulk invoke >> bdrv_is_allocated too frequently, and cause vnc reponse slowly. >> this patch limit the time used for bdrv_is_allocated. > > bdrv_is_allocated() is supposed to yield back to the event loop if it > needs to block. If your VNC session is experiencing jitter then it's > probably because a system call in the bdrv_is_allocated() code path is > synchronous when it should be asynchronous. > > You could try to identify the system call using strace -f -T. In the > output you'll see the duration of each system call. I guess there is a > file I/O system call that is taking noticable amounts of time.
yes, i find the reason where bdrv_is_allocated needs to block. the mainly reason is caused by qemu_co_mutex_lock invoked by qcow2_co_get_block_status. qemu_co_mutex_lock(&s->lock); ret = qcow2_get_cluster_offset(bs, sector_num << 9, &bytes, &cluster_offset); qemu_co_mutex_unlock(&s->lock); other reason is caused by l2_load invoked by qcow2_get_cluster_offset. /* load the l2 table in memory */ ret = l2_load(bs, l2_offset, &l2_table); if (ret < 0) { return ret; } > > A proper solution is to refactor the synchronous code to make it > asynchronous. This might require invoking the system call from a > thread pool worker. > yes, i agree with you, but this is a big change. I will try to find how to optimize this code, maybe need a long time. this patch is not a perfect solution, but can alleviate the problem. > Stefan