Default to zfs_dmu_offset_next_sync=1

Strict hole reporting was previously disabled by default as a
performance optimization.  However, this has lead to confusion
over the expected behavior and a variety of workarounds being
adopted by consumers of ZFS.  Change the default behavior to
always report holes and force the TXG sync.

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #12746
This commit is contained in:
Brian Behlendorf 2021-11-30 10:38:09 -08:00 committed by GitHub
parent 5dc6fc2b73
commit 05b3eb6d23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 8 deletions

View File

@ -1591,12 +1591,12 @@ Allow no-operation writes.
The occurrence of nopwrites will further depend on other pool properties The occurrence of nopwrites will further depend on other pool properties
.Pq i.a. the checksumming and compression algorithms . .Pq i.a. the checksumming and compression algorithms .
. .
.It Sy zfs_dmu_offset_next_sync Ns = Ns Sy 0 Ns | Ns 1 Pq int .It Sy zfs_dmu_offset_next_sync Ns = Ns Sy 1 Ns | Ns 0 Pq int
Enable forcing TXG sync to find holes. Enable forcing TXG sync to find holes.
When enabled forces ZFS to act like prior versions when When enabled forces ZFS to sync data when
.Sy SEEK_HOLE No or Sy SEEK_DATA .Sy SEEK_HOLE No or Sy SEEK_DATA
flags are used, which, when a dnode is dirty, flags are used allowing holes in a file to be accurately reported.
causes TXGs to be synced so that this data can be found. When disabled holes will not be reported in recently dirtied files.
. .
.It Sy zfs_pd_bytes_max Ns = Ns Sy 52428800 Ns B Po 50MB Pc Pq int .It Sy zfs_pd_bytes_max Ns = Ns Sy 52428800 Ns B Po 50MB Pc Pq int
The number of bytes which should be prefetched during a pool traversal, like The number of bytes which should be prefetched during a pool traversal, like

View File

@ -73,9 +73,13 @@ int zfs_nopwrite_enabled = 1;
unsigned long zfs_per_txg_dirty_frees_percent = 5; unsigned long zfs_per_txg_dirty_frees_percent = 5;
/* /*
* Enable/disable forcing txg sync when dirty in dmu_offset_next. * Enable/disable forcing txg sync when dirty checking for holes with lseek().
* By default this is enabled to ensure accurate hole reporting, it can result
* in a significant performance penalty for lseek(SEEK_HOLE) heavy workloads.
* Disabling this option will result in holes never being reported in dirty
* files which is always safe.
*/ */
int zfs_dmu_offset_next_sync = 0; int zfs_dmu_offset_next_sync = 1;
/* /*
* Limit the amount we can prefetch with one call to this amount. This * Limit the amount we can prefetch with one call to this amount. This
@ -2107,8 +2111,8 @@ restart:
* If the zfs_dmu_offset_next_sync module option is enabled * If the zfs_dmu_offset_next_sync module option is enabled
* then strict hole reporting has been requested. Dirty * then strict hole reporting has been requested. Dirty
* dnodes must be synced to disk to accurately report all * dnodes must be synced to disk to accurately report all
* holes. When disabled (the default) dirty dnodes are * holes. When disabled dirty dnodes are reported to not
* reported to not have any holes which is always safe. * have any holes which is always safe.
* *
* When called by zfs_holey_common() the zp->z_rangelock * When called by zfs_holey_common() the zp->z_rangelock
* is held to prevent zfs_write() and mmap writeback from * is held to prevent zfs_write() and mmap writeback from