diff options
author | Tim Chase <[email protected]> | 2016-10-10 17:19:14 -0500 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-02-03 10:24:26 -0800 |
commit | 4c83fa9b8762260d766e579cca3da4475fa950ac (patch) | |
tree | bb5082dc7e6feac618043a50bae63d2047d1d7e3 | |
parent | cbf87138741d1e3641170de1b01744051805adbb (diff) |
Write issue taskq shouldn't be dynamic
This is as much an upstream compatibility as it's a bit of a performance
gain.
The illumos taskq implemention doesn't allow a TASKQ_THREADS_CPU_PCT type
to be dynamic and in fact enforces as much with an ASSERT.
As to performance, if this taskq is dynamic, it can cause excessive
contention on tq_lock as the threads are created and destroyed because it
can see bursts of many thousands of tasks in a short time, particularly
in heavy high-concurrency zvol write workloads.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Tim Chase <[email protected]>
Closes #5236
-rw-r--r-- | module/zfs/spa.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/module/zfs/spa.c b/module/zfs/spa.c index a220ae393..9c9d5a542 100644 --- a/module/zfs/spa.c +++ b/module/zfs/spa.c @@ -845,7 +845,7 @@ spa_taskqs_init(spa_t *spa, zio_type_t t, zio_taskq_type_t q) uint_t count = ztip->zti_count; spa_taskqs_t *tqs = &spa->spa_zio_taskq[t][q]; char name[32]; - uint_t i, flags = TASKQ_DYNAMIC; + uint_t i, flags = 0; boolean_t batch = B_FALSE; if (mode == ZTI_MODE_NULL) { @@ -863,6 +863,7 @@ spa_taskqs_init(spa_t *spa, zio_type_t t, zio_taskq_type_t q) case ZTI_MODE_FIXED: ASSERT3U(value, >=, 1); value = MAX(value, 1); + flags |= TASKQ_DYNAMIC; break; case ZTI_MODE_BATCH: |