2013/11/12 Fam Zheng <f...@redhat.com> > On 2013年11月07日 16:08, Chunyan Liu wrote: > >> Set NOCOW flag to newly created images to solve performance issues on >> btrfs. >> >> 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). >> >> Signed-off-by: Chunyan Liu <cy...@suse.com> >> --- >> qemu-img.c | 15 +++++++++++++++ >> 1 files changed, 15 insertions(+), 0 deletions(-) >> >> diff --git a/qemu-img.c b/qemu-img.c >> index bf3fb4f..d43e8f1 100644 >> --- a/qemu-img.c >> +++ b/qemu-img.c >> @@ -34,11 +34,17 @@ >> #include <getopt.h> >> #include <stdio.h> >> #include <stdarg.h> >> +#include <linux/fs.h> >> +#include <sys/ioctl.h> >> > > This should be in #ifdef to not break build on Windows. > > > #ifdef _WIN32 >> #include <windows.h> >> #endif >> >> +#ifndef FS_NOCOW_FL >> +#define FS_NOCOW_FL 0x00800000 /* Do not cow file */ >> +#endif >> + >> typedef struct img_cmd_t { >> const char *name; >> int (*handler)(int argc, char **argv); >> @@ -340,6 +346,7 @@ static int img_create(int argc, char **argv) >> char *options = NULL; >> Error *local_err = NULL; >> bool quiet = false; >> + int fd, attr; >> >> for(;;) { >> c = getopt(argc, argv, "F:b:f:he6o:q"); >> @@ -417,6 +424,14 @@ static int img_create(int argc, char **argv) >> return 1; >> } >> >> + /* set NOCOW by default to solve performance issue on btrfs */ >> + fd = qemu_open(filename, O_RDONLY|O_NONBLOCK); >> + if (fd >= 0) { >> + attr = FS_NOCOW_FL; >> + ioctl(fd, FS_IOC_SETFLAGS, &attr); >> + qemu_close(fd); >> + } >> + >> return 0; >> } >> >> >> "man chattr" says: > ... For btrfs, the 'C' flag should be set on new or empty files. If it is > set on a file which already has data blocks, it is undefined when the > blocks assigned to the file will be fully stable... > > But you are setting the attr after image creation, so what's the > difference here? just want to make sure this does what's expected. >
I expected such question. Following the man page, I should add changes in each related block driver's drv_create, that seems too much changes. Just to make the change as little as possible, I asked in #btrfs irc about the reason why must empty and if it affects in our case. Maybe I misunderstand the reply, but now I check btrfs/ioctl.c, I should say I made a mistake here. If the file size is not 0, the COW flag won't be removed. Sorry! Still need to change in block driver's drv_create function. I'll revise. Thanks for correction. > Thanks, > Fam > >