btrfs is currently optimized for normal applications that do open("foo", O_RDWR). With this mode, integrity semantics are quite loose in POSIX.
Because VMs emulate physical hardware with strong integrity semantics, they usually do either open("foo", O_DIRECT) or open("foo", O_SYNC).
btrfs sucks for O_SYNC. It's not just VMs, databases also tend to make heavy use of O_SYNC.
Given where BTRFS is right now development wise, it's not at all surprising O_SYNC hasn't been optimized yet.
btrfs is currently optimized for normal applications that do open("foo", O_RDWR). With this mode, integrity semantics are quite loose in POSIX.
Because VMs emulate physical hardware with strong integrity semantics, they usually do either open("foo", O_DIRECT) or open("foo", O_SYNC).
btrfs sucks for O_SYNC. It's not just VMs, databases also tend to make heavy use of O_SYNC.