Disable LBA weighting on files and SSDs
The LBA weighting makes sense on rotational media where the outer tracks have twice the bandwidth of the inner tracks. However, it is detrimental on nonrotational media such as solid state disks, where the only effect is to ensure that metaslabs enter the best-fit allocation behavior sooner, which is detrimental to performance. It also makes no sense on files where the underlying filesystem can arrange things however it wants. Signed-off-by: Richard Yao <ryao@gentoo.org> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #3712
This commit is contained in:
parent
cafbd2aca3
commit
fb40095f5f
|
@ -151,6 +151,7 @@ struct vdev {
|
||||||
vdev_stat_t vdev_stat; /* virtual device statistics */
|
vdev_stat_t vdev_stat; /* virtual device statistics */
|
||||||
boolean_t vdev_expanding; /* expand the vdev? */
|
boolean_t vdev_expanding; /* expand the vdev? */
|
||||||
boolean_t vdev_reopening; /* reopen in progress? */
|
boolean_t vdev_reopening; /* reopen in progress? */
|
||||||
|
boolean_t vdev_nonrot; /* true if solid state */
|
||||||
int vdev_open_error; /* error on last open */
|
int vdev_open_error; /* error on last open */
|
||||||
kthread_t *vdev_open_thread; /* thread opening children */
|
kthread_t *vdev_open_thread; /* thread opening children */
|
||||||
uint64_t vdev_crtxg; /* txg when top-level was added */
|
uint64_t vdev_crtxg; /* txg when top-level was added */
|
||||||
|
|
|
@ -1518,7 +1518,7 @@ metaslab_weight(metaslab_t *msp)
|
||||||
* In effect, this means that we'll select the metaslab with the most
|
* In effect, this means that we'll select the metaslab with the most
|
||||||
* free bandwidth rather than simply the one with the most free space.
|
* free bandwidth rather than simply the one with the most free space.
|
||||||
*/
|
*/
|
||||||
if (metaslab_lba_weighting_enabled) {
|
if (!vd->vdev_nonrot && metaslab_lba_weighting_enabled) {
|
||||||
weight = 2 * weight - (msp->ms_id * weight) / vd->vdev_ms_count;
|
weight = 2 * weight - (msp->ms_id * weight) / vd->vdev_ms_count;
|
||||||
ASSERT(weight >= space && weight <= 2 * space);
|
ASSERT(weight >= space && weight <= 2 * space);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1108,6 +1108,7 @@ vdev_open_child(void *arg)
|
||||||
vd->vdev_open_thread = curthread;
|
vd->vdev_open_thread = curthread;
|
||||||
vd->vdev_open_error = vdev_open(vd);
|
vd->vdev_open_error = vdev_open(vd);
|
||||||
vd->vdev_open_thread = NULL;
|
vd->vdev_open_thread = NULL;
|
||||||
|
vd->vdev_parent->vdev_nonrot &= vd->vdev_nonrot;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean_t
|
static boolean_t
|
||||||
|
@ -1134,15 +1135,19 @@ vdev_open_children(vdev_t *vd)
|
||||||
int children = vd->vdev_children;
|
int children = vd->vdev_children;
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
|
vd->vdev_nonrot = B_TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* in order to handle pools on top of zvols, do the opens
|
* in order to handle pools on top of zvols, do the opens
|
||||||
* in a single thread so that the same thread holds the
|
* in a single thread so that the same thread holds the
|
||||||
* spa_namespace_lock
|
* spa_namespace_lock
|
||||||
*/
|
*/
|
||||||
if (vdev_uses_zvols(vd)) {
|
if (vdev_uses_zvols(vd)) {
|
||||||
for (c = 0; c < children; c++)
|
for (c = 0; c < children; c++) {
|
||||||
vd->vdev_child[c]->vdev_open_error =
|
vd->vdev_child[c]->vdev_open_error =
|
||||||
vdev_open(vd->vdev_child[c]);
|
vdev_open(vd->vdev_child[c]);
|
||||||
|
vd->vdev_nonrot &= vd->vdev_child[c]->vdev_nonrot;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tq = taskq_create("vdev_open", children, minclsyspri,
|
tq = taskq_create("vdev_open", children, minclsyspri,
|
||||||
|
@ -1153,6 +1158,9 @@ vdev_open_children(vdev_t *vd)
|
||||||
TQ_SLEEP) != 0);
|
TQ_SLEEP) != 0);
|
||||||
|
|
||||||
taskq_destroy(tq);
|
taskq_destroy(tq);
|
||||||
|
|
||||||
|
for (c = 0; c < children; c++)
|
||||||
|
vd->vdev_nonrot &= vd->vdev_child[c]->vdev_nonrot;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -301,6 +301,9 @@ skip_open:
|
||||||
/* Clear the nowritecache bit, causes vdev_reopen() to try again. */
|
/* Clear the nowritecache bit, causes vdev_reopen() to try again. */
|
||||||
v->vdev_nowritecache = B_FALSE;
|
v->vdev_nowritecache = B_FALSE;
|
||||||
|
|
||||||
|
/* Inform the ZIO pipeline that we are non-rotational */
|
||||||
|
v->vdev_nonrot = blk_queue_nonrot(bdev_get_queue(vd->vd_bdev));
|
||||||
|
|
||||||
/* Physical volume size in bytes */
|
/* Physical volume size in bytes */
|
||||||
*psize = bdev_capacity(vd->vd_bdev);
|
*psize = bdev_capacity(vd->vd_bdev);
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,9 @@ vdev_file_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
|
||||||
vattr_t vattr;
|
vattr_t vattr;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
/* Rotational optimizations only make sense on block devices */
|
||||||
|
vd->vdev_nonrot = B_TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We must have a pathname, and it must be absolute.
|
* We must have a pathname, and it must be absolute.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue