Skip to content

Commit ff3d909

Browse files
damien-lemoalcmaiolino
authored andcommitted
xfs: improve default maximum number of open zones
For regular block devices using the zoned allocator, the default maximum number of open zones is set to 1/4 of the number of realtime groups. For a large capacity device, this leads to a very large limit. E.g. with a 26 TB HDD: mount /dev/sdb /mnt ... XFS (sdb): 95836 zones of 65536 blocks size (23959 max open) In turn such large limit on the number of open zones can lead, depending on the workload, on a very large number of concurrent write streams which devices generally do not handle well, leading to poor performance. Introduce the default limit XFS_DEFAULT_MAX_OPEN_ZONES, defined as 128 to match the hardware limit of most SMR HDDs available today, and use this limit to set mp->m_max_open_zones in xfs_calc_open_zones() instead of calling xfs_max_open_zones(), when the user did not specify a limit with the max_open_zones mount option. For the 26 TB HDD example, we now get: mount /dev/sdb /mnt ... XFS (sdb): 95836 zones of 65536 blocks (128 max open zones) This change does not prevent the user from specifying a lareger number for the open zones limit. E.g. mount -o max_open_zones=4096 /dev/sdb /mnt ... XFS (sdb): 95836 zones of 65536 blocks (4096 max open zones) Finally, since xfs_calc_open_zones() checks and caps the mp->m_max_open_zones limit against the value calculated by xfs_max_open_zones() for any type of device, this new default limit does not increase m_max_open_zones for small capacity devices. Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
1 parent 8e1cfa5 commit ff3d909

2 files changed

Lines changed: 8 additions & 1 deletion

File tree

fs/xfs/libxfs/xfs_zones.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ struct xfs_rtgroup;
2929
#define XFS_OPEN_GC_ZONES 1U
3030
#define XFS_MIN_OPEN_ZONES (XFS_OPEN_GC_ZONES + 1U)
3131

32+
/*
33+
* For zoned devices that do not have a limit on the number of open zones, and
34+
* for regular devices using the zoned allocator, use the most common SMR disks
35+
* limit (128) as the default limit on the number of open zones.
36+
*/
37+
#define XFS_DEFAULT_MAX_OPEN_ZONES 128
38+
3239
bool xfs_zone_validate(struct blk_zone *zone, struct xfs_rtgroup *rtg,
3340
xfs_rgblock_t *write_pointer);
3441

fs/xfs/xfs_zone_alloc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,7 @@ xfs_calc_open_zones(
11311131
if (bdev_open_zones)
11321132
mp->m_max_open_zones = bdev_open_zones;
11331133
else
1134-
mp->m_max_open_zones = xfs_max_open_zones(mp);
1134+
mp->m_max_open_zones = XFS_DEFAULT_MAX_OPEN_ZONES;
11351135
}
11361136

11371137
if (mp->m_max_open_zones < XFS_MIN_OPEN_ZONES) {

0 commit comments

Comments
 (0)