[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v1 03/13] qcow2: do not COW the empty areas
From: |
Denis V. Lunev |
Subject: |
Re: [Qemu-devel] [PATCH v1 03/13] qcow2: do not COW the empty areas |
Date: |
Tue, 23 May 2017 12:15:20 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 |
On 05/22/2017 10:24 PM, Eric Blake wrote:
> On 05/19/2017 04:34 AM, Anton Nefedov wrote:
>> If COW area of the newly allocated cluster is zeroes, there is no reason
>> to write zero sectors in perform_cow() again now as whole clusters are
>> zeroed out in single chunks by handle_alloc_space().
> But that's only true if you can guarantee that handle_alloc_space()
> succeeded at ensuring the cluster reads as zeroes. If you silently
> ignore errors (which is what patch 1/13 does), you risk assuming that
> the cluster reads as zeroes when in reality it does not, and then you
> have corrupted data.
>
> The idea of avoiding a COW of areas that read as zero at the source when
> the destination also already reads as zeroes makes sense, but I'm not
> convinced that this patch is safe as written.
we will recheck error path. OK.
>> Introduce QCowL2Meta field "reduced", since the existing fields
>> (offset and nb_bytes) still has to keep other write requests from
>> simultaneous writing in the area
>>
>> iotest 060:
>> write to the discarded cluster does not trigger COW anymore.
>> so, break on write_aio event instead, will work for the test
>> (but write won't fail anymore, so update reference output)
>>
>> iotest 066:
>> cluster-alignment areas that were not really COWed are now detected
>> as zeroes, hence the initial write has to be exactly the same size for
>> the maps to match
>>
>> performance tests: ===
>>
>> qemu-io,
>> results in seconds to complete (less is better)
>> random write 4k to empty image, no backing
>> HDD
>> 64k cluster
>> 128M over 128M image: 160 -> 160 ( x1 )
>> 128M over 2G image: 86 -> 84 ( x1 )
>> 128M over 8G image: 40 -> 29 ( x1.4 )
>> 1M cluster
>> 32M over 8G image: 58 -> 23 ( x2.5 )
>>
>> SSD
>> 64k cluster
>> 2G over 2G image: 71 -> 38 ( x1.9 )
>> 512M over 8G image: 85 -> 8 ( x10.6 )
>> 1M cluster
>> 128M over 32G image: 314 -> 2 ( x157 )
> At any rate, the benchmark numbers show that there is merit to pursuing
> the idea of reducing I/O when partial cluster writes can avoid writing
> COW'd zeroes on either side of the data.
>
yes! This is exactly the point and also with this approach we would
allow sequential non-aligned to cluster writes, which is also very good.
Den
- Re: [Qemu-devel] [PATCH v1 01/13] qcow2: alloc space for COW in one chunk, (continued)
[Qemu-devel] [PATCH v1 02/13] qcow2: is_zero_sectors(): return true if area is outside of backing file, Anton Nefedov, 2017/05/19
[Qemu-devel] [PATCH v1 03/13] qcow2: do not COW the empty areas, Anton Nefedov, 2017/05/19
[Qemu-devel] [PATCH v1 05/13] qcow2: set inactive flag, Anton Nefedov, 2017/05/19
[Qemu-devel] [PATCH v1 04/13] qcow2: preallocation at image expand, Anton Nefedov, 2017/05/19
[Qemu-devel] [PATCH v1 06/13] qcow2: truncate preallocated space, Anton Nefedov, 2017/05/19
[Qemu-devel] [PATCH v1 08/13] qcow2: handle_prealloc(): find out if area zeroed by earlier preallocation, Anton Nefedov, 2017/05/19
[Qemu-devel] [PATCH v1 09/13] qcow2: fix misleading comment about L2 linking, Anton Nefedov, 2017/05/19
[Qemu-devel] [PATCH v1 07/13] qcow2: check space leak at the end of the image, Anton Nefedov, 2017/05/19