From bc17f1047a83cc8c4065e0ef84333a0d9b9d73aa Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Fri, 11 Jul 2014 14:35:58 -0400 Subject: Enable Linux read-ahead for a single page on ZVOLs Linux has read-ahead logic designed to accelerate sequential workloads. ZFS has its own read-ahead logic called zprefetch that operates on both ZVOLs and datasets. Having two prefetchers active at the same time can cause overprefetching, which unnecessarily reduces IOPS performance on CoW filesystems like ZFS. Testing shows that entirely disabling the Linux prefetch results in a significant performance penalty for reads while commensurate benefits are seen in random writes. It appears that read-ahead benefits are inversely proportional to random write benefits, and so a single page of Linux-layer read-ahead appears to offer the middle ground for both workloads. Reviewed-by: Chunwei Chen Reviewed-by: Brian Behlendorf Signed-off-by: Richard Yao Issue #5902 --- module/zfs/zvol.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'module/zfs') diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index d0f7b9912..fef1d299a 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); + /* Limit read-ahead to a single page to prevent over-prefetching. */ + blk_queue_set_read_ahead(zv->zv_queue, 1); + /* Disable write merging in favor of the ZIO pipeline. */ queue_flag_set(QUEUE_FLAG_NOMERGES, zv->zv_queue); -- cgit v1.2.3