Samba – the correct option for Samba’s “strict allocate” when serving a zfs volume

sambazfs

What is the correct option for Samba's "strict allocate" when serving a zfs volume?

The documentation says:

This is a boolean that controls the handling of disk space allocation
in the server. When this is set to yes the server will change from
UNIX behaviour of not committing real disk storage blocks when a file
is extended to the Windows behaviour of actually forcing the disk
system to allocate real storage blocks when a file is created or
extended to be a given size. In UNIX terminology this means that Samba
will stop creating sparse files.

This option is really designed for file systems that support fast
allocation of large numbers of blocks such as extent-based file
systems. On file systems that don't support extents (most notably
ext3) this can make Samba slower. When you work with large files over

100MB on file systems without extents you may even run into problems with clients running into timeouts.

When you have an extent based filesystem it's likely that we can make
use of unwritten extents which allows Samba to allocate even large
amounts of space very fast and you will not see any timeout problems
caused by strict allocate. With strict allocate in use you will also
get much better out of quota messages in case you use quotas. Another
advantage of activating this setting is that it will help to reduce
file fragmentation.

To give you an idea on which filesystems this setting might currently
be a good option for you: XFS, ext4, btrfs, ocfs2 on Linux and JFS2 on
AIX support unwritten extents. On Filesystems that do not support it,
preallocation is probably an expensive operation where you will see
reduced performance and risk to let clients run into timeouts when
creating large files. Examples are ext3, ZFS, HFS+ and most others, so
be aware if you activate this setting on those filesystems.

Default: strict allocate = no

So, if I have strict allocate = yes, Samba will not do pre-allocation, which is has no performance advantage on ZFS?

Best Answer

With strict allocate = yes, Samba will pre-allocate space. Since ZFS doesn't have extent-based allocation, the manpage says this is slower than strict_allocate = no.

You might think that if you tell the fs to allocate the entire space for your huge file in advance, there is a higher chance of that space being contiguous than if you allocate it piece by piece; however, I'm not sure this would be the case with zfs, which strives to make all data writes sequential. It certainly won't be the case if you have compression enabled, because the preallocated space will be empty and will compress to a single block, so you gain nothing by enabling strict_allocate.

FWIW, I tried to use fallocate -x to create a 10GB file on a compressed ZFS instance and it took 2 minutes, which is probably too long for a CIFS client. strace output shows that the allocation is done using several million pwrite64() calls. The actual fallocate() call is not supported:

fallocate(3, 0, 0, 10000000000) = -1 EOPNOTSUPP (Operation not supported)

This is with a fairly recent zfsonlinux git master.

Based on the above I'd say it would be useless and highly disruptive to enable strict_allocate on a compressed filesystem; for uncompressed ones with dedup disabled, it's probably only highly disruptive but not necessarily useless.