mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 18:59:33 +03:00
Adjust prefetch parameters.
- Reduce maximum prefetch distance for 32bit platforms to 8MB as it was previously. Those systems didn't grow much probably, so better stay conservative there. - Retire array_rd_sz tunable, blocking prefetch for large requests. We should not penalize applications trying to be more efficient. The speculative prefetcher by itself has reasonable distance limits, and 1MB is not much at all these days. Reviewed-by: Allan Jude <allan@klarasystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #15072
This commit is contained in:
parent
8a6fde8213
commit
81be809a25
@ -36,8 +36,6 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern uint64_t zfetch_array_rd_sz;
|
|
||||||
|
|
||||||
struct dnode; /* so we can reference dnode */
|
struct dnode; /* so we can reference dnode */
|
||||||
|
|
||||||
typedef struct zfetch {
|
typedef struct zfetch {
|
||||||
|
@ -519,9 +519,6 @@ However, this is limited by
|
|||||||
Maximum micro ZAP size.
|
Maximum micro ZAP size.
|
||||||
A micro ZAP is upgraded to a fat ZAP, once it grows beyond the specified size.
|
A micro ZAP is upgraded to a fat ZAP, once it grows beyond the specified size.
|
||||||
.
|
.
|
||||||
.It Sy zfetch_array_rd_sz Ns = Ns Sy 1048576 Ns B Po 1 MiB Pc Pq u64
|
|
||||||
If prefetching is enabled, disable prefetching for reads larger than this size.
|
|
||||||
.
|
|
||||||
.It Sy zfetch_min_distance Ns = Ns Sy 4194304 Ns B Po 4 MiB Pc Pq uint
|
.It Sy zfetch_min_distance Ns = Ns Sy 4194304 Ns B Po 4 MiB Pc Pq uint
|
||||||
Min bytes to prefetch per stream.
|
Min bytes to prefetch per stream.
|
||||||
Prefetch distance starts from the demand access size and quickly grows to
|
Prefetch distance starts from the demand access size and quickly grows to
|
||||||
|
@ -89,7 +89,11 @@ static int zfs_dmu_offset_next_sync = 1;
|
|||||||
* helps to limit the amount of memory that can be used by prefetching.
|
* helps to limit the amount of memory that can be used by prefetching.
|
||||||
* Larger objects should be prefetched a bit at a time.
|
* Larger objects should be prefetched a bit at a time.
|
||||||
*/
|
*/
|
||||||
|
#ifdef _ILP32
|
||||||
|
uint_t dmu_prefetch_max = 8 * 1024 * 1024;
|
||||||
|
#else
|
||||||
uint_t dmu_prefetch_max = 8 * SPA_MAXBLOCKSIZE;
|
uint_t dmu_prefetch_max = 8 * SPA_MAXBLOCKSIZE;
|
||||||
|
#endif
|
||||||
|
|
||||||
const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
|
const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
|
||||||
{DMU_BSWAP_UINT8, TRUE, FALSE, FALSE, "unallocated" },
|
{DMU_BSWAP_UINT8, TRUE, FALSE, FALSE, "unallocated" },
|
||||||
@ -552,8 +556,7 @@ dmu_buf_hold_array_by_dnode(dnode_t *dn, uint64_t offset, uint64_t length,
|
|||||||
zio = zio_root(dn->dn_objset->os_spa, NULL, NULL,
|
zio = zio_root(dn->dn_objset->os_spa, NULL, NULL,
|
||||||
ZIO_FLAG_CANFAIL);
|
ZIO_FLAG_CANFAIL);
|
||||||
blkid = dbuf_whichblock(dn, 0, offset);
|
blkid = dbuf_whichblock(dn, 0, offset);
|
||||||
if ((flags & DMU_READ_NO_PREFETCH) == 0 &&
|
if ((flags & DMU_READ_NO_PREFETCH) == 0) {
|
||||||
length <= zfetch_array_rd_sz) {
|
|
||||||
/*
|
/*
|
||||||
* Prepare the zfetch before initiating the demand reads, so
|
* Prepare the zfetch before initiating the demand reads, so
|
||||||
* that if multiple threads block on same indirect block, we
|
* that if multiple threads block on same indirect block, we
|
||||||
|
@ -52,14 +52,19 @@ static unsigned int zfetch_max_streams = 8;
|
|||||||
static unsigned int zfetch_min_sec_reap = 1;
|
static unsigned int zfetch_min_sec_reap = 1;
|
||||||
/* max time before stream delete */
|
/* max time before stream delete */
|
||||||
static unsigned int zfetch_max_sec_reap = 2;
|
static unsigned int zfetch_max_sec_reap = 2;
|
||||||
|
#ifdef _ILP32
|
||||||
|
/* min bytes to prefetch per stream (default 2MB) */
|
||||||
|
static unsigned int zfetch_min_distance = 2 * 1024 * 1024;
|
||||||
|
/* max bytes to prefetch per stream (default 8MB) */
|
||||||
|
unsigned int zfetch_max_distance = 8 * 1024 * 1024;
|
||||||
|
#else
|
||||||
/* min bytes to prefetch per stream (default 4MB) */
|
/* min bytes to prefetch per stream (default 4MB) */
|
||||||
static unsigned int zfetch_min_distance = 4 * 1024 * 1024;
|
static unsigned int zfetch_min_distance = 4 * 1024 * 1024;
|
||||||
/* max bytes to prefetch per stream (default 64MB) */
|
/* max bytes to prefetch per stream (default 64MB) */
|
||||||
unsigned int zfetch_max_distance = 64 * 1024 * 1024;
|
unsigned int zfetch_max_distance = 64 * 1024 * 1024;
|
||||||
|
#endif
|
||||||
/* max bytes to prefetch indirects for per stream (default 64MB) */
|
/* max bytes to prefetch indirects for per stream (default 64MB) */
|
||||||
unsigned int zfetch_max_idistance = 64 * 1024 * 1024;
|
unsigned int zfetch_max_idistance = 64 * 1024 * 1024;
|
||||||
/* max number of bytes in an array_read in which we allow prefetching (1MB) */
|
|
||||||
uint64_t zfetch_array_rd_sz = 1024 * 1024;
|
|
||||||
|
|
||||||
typedef struct zfetch_stats {
|
typedef struct zfetch_stats {
|
||||||
kstat_named_t zfetchstat_hits;
|
kstat_named_t zfetchstat_hits;
|
||||||
@ -580,6 +585,3 @@ ZFS_MODULE_PARAM(zfs_prefetch, zfetch_, max_distance, UINT, ZMOD_RW,
|
|||||||
|
|
||||||
ZFS_MODULE_PARAM(zfs_prefetch, zfetch_, max_idistance, UINT, ZMOD_RW,
|
ZFS_MODULE_PARAM(zfs_prefetch, zfetch_, max_idistance, UINT, ZMOD_RW,
|
||||||
"Max bytes to prefetch indirects for per stream");
|
"Max bytes to prefetch indirects for per stream");
|
||||||
|
|
||||||
ZFS_MODULE_PARAM(zfs_prefetch, zfetch_, array_rd_sz, U64, ZMOD_RW,
|
|
||||||
"Number of bytes in a array_read");
|
|
||||||
|
Loading…
Reference in New Issue
Block a user