From d33931a83a33db4034186dfda6dcdd294ace2c75 Mon Sep 17 00:00:00 2001 From: Tim Chase Date: Mon, 10 Oct 2016 17:19:14 -0500 Subject: [PATCH] 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 Signed-off-by: Tim Chase Closes #5236 --- module/zfs/spa.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/zfs/spa.c b/module/zfs/spa.c index 0a480d3ec..bd1134e8f 100644 --- a/module/zfs/spa.c +++ b/module/zfs/spa.c @@ -862,7 +862,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) { @@ -880,6 +880,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: