Hi,

the virtual machine images files I create and use are mostly sparse,
so that not too much space on a filesystem with snapshots and on
filesystems that are receive targets is used.
But I noticed that with just starting up and shutting down a virtual
machine, the difference between 2 nightly snapshots as generated by
send -p is huge. It turns out that the cause is the noholes flag of
the filesystem. I have set this flag to have a bit less metadata
hopefully, but it turns out to have a very negative side effect.

The sparse part of a file that is changed between 2 snapshots is added
to the difference between the 2 snapshots when doing send -p, in full
'no-sparse' size (as zeros I think, as the data compresses extremely
well).
So in case of a 50G VM that has roughly 8G of actual written
filesystem data (a new OS install), I saw 40G of generated btrfs
sendstream data by just a start/stop of the VM.

I think this behavior is not correct: Sparse is read as zeros normally
AFAIK, so if the file locations that are sparse are the same for a
snapshotted file and its parent, there should not be a difference.

The following sequence shows the problem; if the btrfstune command is
skipped, streamsize is as expected.


uname -r
btrfs --version
truncate -s 5G /holetest.img
losetup /dev/loop0 /holetest.img
mkfs.btrfs /dev/loop0

btrfstune -n /dev/loop0

btrfs-show-super /dev/loop0 | grep incompat_flags
mount /dev/loop0 /mnt
btrfs sub create /mnt/vol1
truncate -s 4G /mnt/vol1/test1
btrfs sub snap -r /mnt/vol1 /mnt/vol1.ro0
dd if=/dev/urandom of=/mnt/vol1/test1 bs=1M count=1 conv=notrunc
sync
btrfs sub snap -r /mnt/vol1 /mnt/vol1.ro1
dd if=/dev/urandom of=/mnt/vol1/test1 bs=1M count=1 conv=notrunc
sync
btrfs sub snap -r /mnt/vol1 /mnt/vol1.ro2
btrfs send -p /mnt/vol1.ro1 /mnt/vol1.ro2 > /sendsize.btrfs
ls -al /sendsize.btrfs
umount /mnt
losetup -d /dev/loop0
rm /holetest.img /sendsize.btrfs


=> output

# uname -r
4.7.0-rc4-kade
# btrfs --version
btrfs-progs v4.6.1
# truncate -s 5G /holetest.img
# losetup /dev/loop0 /holetest.img
# mkfs.btrfs /dev/loop0
btrfs-progs v4.5.3+20160516
See http://btrfs.wiki.kernel.org for more information.

Performing full device TRIM (5.00GiB) ...
Label:              (null)
UUID:               338e948c-ee8c-4b9f-926e-b6f8fe140ae6
Node size:          16384
Sector size:        4096
Filesystem size:    5.00GiB
Block group profiles:
 Data:             single            8.00MiB
 Metadata:         DUP             264.00MiB
 System:           DUP              12.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  1
Devices:
  ID        SIZE  PATH
   1     5.00GiB  /dev/loop0

#
# btrfstune -n /dev/loop0
#
# btrfs-show-super /dev/loop0 | grep incompat_flags
incompat_flags          0x341
# mount /dev/loop0 /mnt
# btrfs sub create /mnt/vol1
Create subvolume '/mnt/vol1'
# truncate -s 4G /mnt/vol1/test1
# btrfs sub snap -r /mnt/vol1 /mnt/vol1.ro0
Create a readonly snapshot of '/mnt/vol1' in '/mnt/vol1.ro0'
# dd if=/dev/urandom of=/mnt/vol1/test1 bs=1M count=1 conv=notrunc
1+0 records in
1+0 records out
1048576 bytes (1,0 MB, 1,0 MiB) copied, 0,0779673 s, 13,4 MB/s
# sync
# btrfs sub snap -r /mnt/vol1 /mnt/vol1.ro1
Create a readonly snapshot of '/mnt/vol1' in '/mnt/vol1.ro1'
# dd if=/dev/urandom of=/mnt/vol1/test1 bs=1M count=1 conv=notrunc
1+0 records in
1+0 records out
1048576 bytes (1,0 MB, 1,0 MiB) copied, 0,0634306 s, 16,5 MB/s
# sync
# btrfs sub snap -r /mnt/vol1 /mnt/vol1.ro2
Create a readonly snapshot of '/mnt/vol1' in '/mnt/vol1.ro2'
# btrfs send -p /mnt/vol1.ro1 /mnt/vol1.ro2 > /sendsize.btrfs
At subvol /mnt/vol1.ro2
# ls -al /sendsize.btrfs
-rw-r--r-- 1 root root 4298025877 jun 25 00:26 /sendsize.btrfs
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to