From 5731140eaf4aaf2526a8bfdbfe250195842e79eb Mon Sep 17 00:00:00 2001 From: RageLtMan Date: Sat, 18 Mar 2017 00:51:36 -0400 Subject: [PATCH] Disable write merging on ZVOLs The current ZVOL implementation does not explicitly set merge options on ZVOL device queues, which results in the default merge behavior. Explicitly set QUEUE_FLAG_NOMERGES on ZVOL queues allowing the ZIO pipeline to do its work. Initial benchmarks (tiotest with no O_DIRECT) show random write performance going up almost 3X on 8K ZVOLs, even after significant rewrites of the logical space allocation. Reviewed-by: Richard Yao Reviewed-by: Chunwei Chen Reviewed-by: Brian Behlendorf Signed-off-by: RageLtMan Issue #5902 --- module/zfs/zvol.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index 7590ed316034..d0f7b9912b31 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -1468,6 +1468,9 @@ zvol_alloc(dev_t dev, const char *name) blk_queue_make_request(zv->zv_queue, zvol_request); blk_queue_set_write_cache(zv->zv_queue, B_TRUE, B_TRUE); + /* Disable write merging in favor of the ZIO pipeline. */ + queue_flag_set(QUEUE_FLAG_NOMERGES, zv->zv_queue); + zv->zv_disk = alloc_disk(ZVOL_MINORS); if (zv->zv_disk == NULL) goto out_queue;