MFV r264668:
4754 io issued to near-full luns even after setting noalloc threshold 4755 mg_alloc_failures is no longer needed illumos/illumos@b6240e830b MFC after: 2 weeks
This commit is contained in:
parent
aff2f85dda
commit
b281166740
@ -41,7 +41,7 @@ SYSCTL_NODE(_vfs_zfs, OID_AUTO, metaslab, CTLFLAG_RW, 0, "ZFS metaslab");
|
||||
* avoid having to load lots of space_maps in a given txg. There are,
|
||||
* however, some cases where we want to avoid "fast" ganging and instead
|
||||
* we want to do an exhaustive search of all metaslabs on this device.
|
||||
* Currently we don't allow any gang, zil, or dump device related allocations
|
||||
* Currently we don't allow any gang, slog, or dump device related allocations
|
||||
* to "fast" gang.
|
||||
*/
|
||||
#define CAN_FASTGANG(flags) \
|
||||
@ -73,18 +73,6 @@ SYSCTL_INT(_vfs_zfs, OID_AUTO, condense_pct, CTLFLAG_RWTUN,
|
||||
"Condense on-disk spacemap when it is more than this many percents"
|
||||
" of in-memory counterpart");
|
||||
|
||||
/*
|
||||
* This value defines the number of allowed allocation failures per vdev.
|
||||
* If a device reaches this threshold in a given txg then we consider skipping
|
||||
* allocations on that device. The value of zfs_mg_alloc_failures is computed
|
||||
* in zio_init() unless it has been overridden in /etc/system.
|
||||
*/
|
||||
int zfs_mg_alloc_failures = 0;
|
||||
TUNABLE_INT("vfs.zfs.mg_alloc_failures", &zfs_mg_alloc_failures);
|
||||
SYSCTL_INT(_vfs_zfs, OID_AUTO, mg_alloc_failures, CTLFLAG_RWTUN,
|
||||
&zfs_mg_alloc_failures, 0,
|
||||
"Number of allowed allocation failures per vdev");
|
||||
|
||||
/*
|
||||
* The zfs_mg_noalloc_threshold defines which metaslab groups should
|
||||
* be eligible for allocation. The value is defined as a percentage of
|
||||
@ -1707,10 +1695,7 @@ metaslab_sync_done(metaslab_t *msp, uint64_t txg)
|
||||
void
|
||||
metaslab_sync_reassess(metaslab_group_t *mg)
|
||||
{
|
||||
int64_t failures = mg->mg_alloc_failures;
|
||||
|
||||
metaslab_group_alloc_update(mg);
|
||||
atomic_add_64(&mg->mg_alloc_failures, -failures);
|
||||
|
||||
/*
|
||||
* Preload the next potential metaslabs
|
||||
@ -1737,7 +1722,7 @@ metaslab_distance(metaslab_t *msp, dva_t *dva)
|
||||
|
||||
static uint64_t
|
||||
metaslab_group_alloc(metaslab_group_t *mg, uint64_t psize, uint64_t asize,
|
||||
uint64_t txg, uint64_t min_distance, dva_t *dva, int d, int flags)
|
||||
uint64_t txg, uint64_t min_distance, dva_t *dva, int d)
|
||||
{
|
||||
spa_t *spa = mg->mg_vd->vdev_spa;
|
||||
metaslab_t *msp = NULL;
|
||||
@ -1764,10 +1749,9 @@ metaslab_group_alloc(metaslab_group_t *mg, uint64_t psize, uint64_t asize,
|
||||
spa_dbgmsg(spa, "%s: failed to meet weight "
|
||||
"requirement: vdev %llu, txg %llu, mg %p, "
|
||||
"msp %p, psize %llu, asize %llu, "
|
||||
"failures %llu, weight %llu",
|
||||
spa_name(spa), mg->mg_vd->vdev_id, txg,
|
||||
mg, msp, psize, asize,
|
||||
mg->mg_alloc_failures, msp->ms_weight);
|
||||
"weight %llu", spa_name(spa),
|
||||
mg->mg_vd->vdev_id, txg,
|
||||
mg, msp, psize, asize, msp->ms_weight);
|
||||
mutex_exit(&mg->mg_lock);
|
||||
return (-1ULL);
|
||||
}
|
||||
@ -1799,27 +1783,6 @@ metaslab_group_alloc(metaslab_group_t *mg, uint64_t psize, uint64_t asize,
|
||||
|
||||
mutex_enter(&msp->ms_lock);
|
||||
|
||||
/*
|
||||
* If we've already reached the allowable number of failed
|
||||
* allocation attempts on this metaslab group then we
|
||||
* consider skipping it. We skip it only if we're allowed
|
||||
* to "fast" gang, the physical size is larger than
|
||||
* a gang block, and we're attempting to allocate from
|
||||
* the primary metaslab.
|
||||
*/
|
||||
if (mg->mg_alloc_failures > zfs_mg_alloc_failures &&
|
||||
CAN_FASTGANG(flags) && psize > SPA_GANGBLOCKSIZE &&
|
||||
activation_weight == METASLAB_WEIGHT_PRIMARY) {
|
||||
spa_dbgmsg(spa, "%s: skipping metaslab group: "
|
||||
"vdev %llu, txg %llu, mg %p, msp[%llu] %p, "
|
||||
"psize %llu, asize %llu, failures %llu",
|
||||
spa_name(spa), mg->mg_vd->vdev_id, txg, mg,
|
||||
msp->ms_id, msp, psize, asize,
|
||||
mg->mg_alloc_failures);
|
||||
mutex_exit(&msp->ms_lock);
|
||||
return (-1ULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Ensure that the metaslab we have selected is still
|
||||
* capable of handling our request. It's possible that
|
||||
@ -1859,8 +1822,6 @@ metaslab_group_alloc(metaslab_group_t *mg, uint64_t psize, uint64_t asize,
|
||||
if ((offset = metaslab_block_alloc(msp, asize)) != -1ULL)
|
||||
break;
|
||||
|
||||
atomic_inc_64(&mg->mg_alloc_failures);
|
||||
|
||||
metaslab_passivate(msp, metaslab_block_maxsize(msp));
|
||||
mutex_exit(&msp->ms_lock);
|
||||
}
|
||||
@ -2015,7 +1976,7 @@ top:
|
||||
ASSERT(P2PHASE(asize, 1ULL << vd->vdev_ashift) == 0);
|
||||
|
||||
offset = metaslab_group_alloc(mg, psize, asize, txg, distance,
|
||||
dva, d, flags);
|
||||
dva, d);
|
||||
if (offset != -1ULL) {
|
||||
/*
|
||||
* If we've just selected this metaslab group,
|
||||
|
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2013 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _SYS_METASLAB_IMPL_H
|
||||
@ -58,7 +58,6 @@ struct metaslab_group {
|
||||
kmutex_t mg_lock;
|
||||
avl_tree_t mg_metaslab_tree;
|
||||
uint64_t mg_aliquot;
|
||||
uint64_t mg_alloc_failures;
|
||||
boolean_t mg_allocatable; /* can we allocate? */
|
||||
uint64_t mg_free_capacity; /* percentage free */
|
||||
int64_t mg_bias;
|
||||
|
@ -90,7 +90,6 @@ kmem_cache_t *zio_data_buf_cache[SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT];
|
||||
#ifdef _KERNEL
|
||||
extern vmem_t *zio_alloc_arena;
|
||||
#endif
|
||||
extern int zfs_mg_alloc_failures;
|
||||
|
||||
/*
|
||||
* The following actions directly effect the spa's sync-to-convergence logic.
|
||||
@ -206,15 +205,6 @@ zio_init(void)
|
||||
}
|
||||
out:
|
||||
|
||||
/*
|
||||
* The zio write taskqs have 1 thread per cpu, allow 1/2 of the taskqs
|
||||
* to fail 3 times per txg or 8 failures, whichever is greater.
|
||||
*/
|
||||
if (zfs_mg_alloc_failures == 0)
|
||||
zfs_mg_alloc_failures = MAX((3 * max_ncpus / 2), 8);
|
||||
else if (zfs_mg_alloc_failures < 8)
|
||||
zfs_mg_alloc_failures = 8;
|
||||
|
||||
zio_inject_init();
|
||||
|
||||
zio_trim_ksp = kstat_create("zfs", 0, "zio_trim", "misc",
|
||||
|
Loading…
x
Reference in New Issue
Block a user