Message ID | 20190114111744.113188-1-anton.nefedov@virtuozzo.com (mailing list archive) |
---|---|
Headers | show |
Series | qcow2: cluster space preallocation | expand |
On 14/1/2019 2:18 PM, Anton Nefedov wrote: > This pull request is to start to improve a few performance points of > qcow2 format: > > 1. non cluster-aligned write requests (to unallocated clusters) explicitly > pad data with zeroes if there is no backing data. > Resulting increase in ops number and potential cluster fragmentation > (on the host file) is already solved by: > ee22a9d qcow2: Merge the writing of the COW regions with the guest data > However, in case of zero COW regions, that can be avoided at all > but the whole clusters are preallocated and zeroed in a single > efficient write_zeroes() operation > > 2. moreover, efficient write_zeroes() operation can be used to preallocate > space megabytes (*configurable number) ahead which gives noticeable > improvement on some storage types (e.g. distributed storage) > where the space allocation operation might be expensive) > (Not included in this patchset since v6). > > 3. this will also allow to enable simultaneous writes to the same unallocated > cluster after the space has been allocated & zeroed but before > the first data is written and the cluster is linked to L2. > (Not included in this patchset). > > Efficient write_zeroes usually implies that the blocks are not actually > written to but only reserved and marked as zeroed by the storage. > In this patchset, file-posix driver is marked as supporting this operation > if it supports (/configured to support) fallocate() operation. > > Existing bdrv_write_zeroes() falls back to writing zero buffers if > write_zeroes is not supported by the driver. > A new flag (BDRV_REQ_ALLOCATE) is introduced to avoid that but return ENOTSUP. > Such allocate requests are also implemented to possibly overlap with the > other requests. No wait is performed but an error returned in such case as well. > So the operation should be considered advisory and a fallback scenario still > handled by the caller (in this case, qcow2 driver). > > simple perf test: > > qemu-img create -f qcow2 test.img 4G && \ > qemu-img bench -c $((1024*1024)) -f qcow2 -n -s 4k -t none -w test.img > > test results (seconds): > > +-----------+-------+------+-------+------+------+ > | file | before | after | gain | > +-----------+-------+------+-------+------+------+ > | ssd | 61.153 | 36.313 | 41% | > | hdd | 112.676 | 122.056 | -8% | > +-----------+--------------+--------------+------+ > ping