On 2016年11月22日 18:09, Kevin Wolf wrote:
Am 22.11.2016 um 04:45 hat wyang geschrieben:
On 2016年11月21日 19:34, Kevin Wolf wrote:
Am 21.11.2016 um 02:24 hat Yang Wei geschrieben:
In order to preserve sparse disk image, detect_zeroes
should also be enabled when bdrv_get_block_status_above()
returns BDRV_BLOCK_DATA

Signed-off-by: Yang Wei <w90p...@gmail.com>
Just preserving sparseness is exactly why bdrv_get_block_status_above()
is checked, and this happens always.
I have a sparse qcow2 image(virtual size: 20G disk size: 12G),
# qemu-img info 20G.img
image: 20G.img
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 12G
cluster_size: 65536
Format specific information:
     compat: 1.1
     lazy refcounts: false
     refcount bits: 16
     corrupt: false

and  I tried to qemu-img map --output json xxxx.img, as you can see,
the field of data always is true.
Did you use metadata preallocation? If so, you explicitly requested all
clusters to be allocated.

Yes, I created the image with metadata preallocation. I see. its why qcow2_get_cluster_type always return QCOW2_CLUSTER_NORMAL.


detect_zeroes does not preserve sparseness, but detect zeroes in parts
of the source image that are not sparse, and make them sparse in the
target image. This means that it has higher overhead (because all
sectors need to be processed before copying them) and doesn't result in
an exact copy. There may be cases where this is wanted, but in the
common case, it's probably not the right mode of operation.
To be frank, customers are more concerned about sparseness than overhead.
All generalisations are wrong.

We could be talking about the majority of users (the QEMU project
doesn't have customers),

The majority of users.:-) forgive my word.
  but even then I doubt you're right, especially
when using preallocation which is a tool for giving up sparseness in
favour of improved performance of the first write to a cluster.

This patch is able to handle this case. In fact I only hope to use preallocation to improve performance rather than become a sparseness image while live migrating. it would waste a large mount of disk space, as most of our VM's data disk(/dev/vdb) is larger than 1TB. As you said, We can use blockdev-mirror and manually enable detect-zeros on new qemu verison(>2.6), but for less than 2.6, we also need to do it in drive-mirror.


If you really want to detect zeroes, create the target block driver node
manually (with detect-zeroes=on) and use the blockdev-mirror QMP command
to mirror to it.
the target block is created by **bdrv_img_create** and opened by
**bdrv_open** inside qmp_drive_mirror, it also mean than we only
enable detect-zeroes while
its opened, i don't find qmp cmd to only enable it, if I understand
correctly.
That's why I said you use blockdev-mirror instead drive-mirror.
Got it, unfortunately my qemu version does not contain this command. in order to use it, I also need to modify my libvirt. its not temporarily available to do this. I would consider the my next release
to do it.:-)

Kevin



Reply via email to