2013/12/5 Daniel P. Berrange <berrange(a)redhat.com>
On Thu, Dec 05, 2013 at 06:35:12PM +0800, Chunyan Liu wrote:
> Btrfs has terrible performance when hosting VM images, even more when
the guest
> in those VM are also using btrfs as file system. One way to mitigate
this bad
> performance is to turn off COW attributes on VM files (since having copy
on
> write for this kind of data is not useful).
>
> According to 'chattr' manpage, NOCOW could be set to new or empty file
only on
> btrfs, so this patch tries to add a --nocow option to vol-create
functions and
> vol-clone function, so that users could have a chance to set NOCOW to a
new
> volume if that happens to create on a btrfs like file system.
What effect / impact does setting this flag have from a functional
POV ?
It implies nodatasum as well. But COW may still happen if a snapshot is
taken.
Following is quoted from:
https://btrfs.wiki.kernel.org/index.php/FAQ
Can copy-on-write be turned off for data blocks?
Yes, there are several ways how to do that.
Disable it by mounting with nodatacow. This implies nodatasum as well. COW
may
still happen if a snapshot is taken. However COW will still be maintained
for
existing files, because the COW status can be modified only for empty or
newly
created files.
For an empty file, add the NOCOW file attribute (use chattr utility with
+C),
or you create a new file in a directory with the NOCOW attribute set (then
the
new file will inherit this attribute). Now copy the original data into the
pre-created file, delete original and rename back.
Why would we not just unconditonally enable it on btrfs so
it was fast "out of the box" ?
COW is default feature of Btrfs. There are many advantages with COW
mechanism.
Other uses may want the COW advantages at the same time we set NOCOW to a
VM
image.
But in pool-create and vol-create case, it seems the whole pool is used
to hold VM images, so maybe we could just disable COW in pool side. Then
all
vol created in it will be NOCOW. That means, in pool-start phase, if
checking
fs format is 'btrfs', add '-o nodatacow' option to 'mount'
command. That
still need some
change in libvirt code. How do you think about this way?
Thanks,
Chunyan