Hi all! I know, I have several series waiting for a resend, but I had to switch to another task spawned from our customer's bug.
Original problem: we use O_DIRECT for all vm images in our product, it's the policy. The only exclusion is backup target qcow2 image for compressed backup, because compressed backup is extremely slow with O_DIRECT (due to unaligned writes). Customer complains that backup produces a lot of pagecache. So we can either implement some internal cache or use fadvise somehow. Backup has several async workes, which writes simultaneously, so in both ways we have to track host cluster filling (before dropping the cache corresponding to the cluster). So, if we have to track anyway, let's try to implement the cache. Idea is simple: cache small unaligned write and flush the cluster when filled. Performance result is very good (results in a table is time of compressed backup of 1000M disk filled with ones in seconds): --------------- ----------- ----------- backup(old) backup(new) ssd:hdd(direct) 3e+02 4.4 -99% ssd:hdd(cached) 5.7 5.4 -5% --------------- ----------- ----------- So, we have benefit even for cached mode! And the fastest thing is O_DIRECT with new implemented cache. So, I suggest to enable the new cache by default (which is done by the series). Command to generate performance comparison table: ./scripts/simplebench/bench-backup.py --compressed --target-cache both --dir ssd:/ssd --dir hdd:/work --test ssd:hdd --env old:/work/src/qemu/master/build/qemu-system-x86_64 new:/work/src/qemu/up/qcow2-compressed-write-cache/build/qemu-system-x86_6 Vladimir Sementsov-Ogievskiy (7): qemu/queue: add some useful QLIST_ and QTAILQ_ macros block/qcow2: introduce cache for compressed writes block/qcow2: use compressed write cache simplebench: bench_one(): add slow_limit argument simplebench: bench_one(): support count=1 simplebench/bench-backup: add --compressed option simplebench/bench-backup: add target-cache argument qapi/block-core.json | 8 +- block/qcow2.h | 33 ++ include/qemu/queue.h | 14 + block/qcow2-compressed-write-cache.c | 770 +++++++++++++++++++++++++ block/qcow2-refcount.c | 13 + block/qcow2.c | 87 ++- block/meson.build | 1 + scripts/simplebench/bench-backup.py | 74 ++- scripts/simplebench/bench_block_job.py | 33 +- scripts/simplebench/simplebench.py | 34 +- 10 files changed, 1039 insertions(+), 28 deletions(-) create mode 100644 block/qcow2-compressed-write-cache.c -- 2.29.2