From 29d8eb5ee7dff422294c9ee3d0f34f1370cec800 Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Thu, 8 Aug 2019 12:49:24 -0400 Subject: [PATCH] LU-12043 llite: don't miss every first stride page Whenever we need skip some pages for stride io read, we will calculate next start page index, however, this page index is skipped every time, because loop start from index + 1 Testing command: iozone -w -c -i 5 -t1 -j 2 -s 100m -r 1m -F data Without patch: 587384.69 kB/sec read write pages per rpc rpcs % cum % | rpcs % cum % 1: 16 19 19 | 0 0 0 2: 0 0 19 | 0 0 0 4: 0 0 19 | 0 0 0 8: 0 0 19 | 0 0 0 16: 0 0 19 | 0 0 0 32: 0 0 19 | 0 0 0 64: 0 0 19 | 0 0 0 128: 0 0 19 | 0 0 0 256: 0 0 19 | 0 0 0 512: 22 26 46 | 0 0 0 1024: 44 53 100 | 0 0 0 With patch: 744635.56 kB/sec read write pages per rpc rpcs % cum % | rpcs % cum % 1: 0 0 0 | 0 0 0 2: 0 0 0 | 0 0 0 4: 0 0 0 | 0 0 0 8: 0 0 0 | 0 0 0 16: 0 0 0 | 0 0 0 32: 0 0 0 | 0 0 0 64: 0 0 0 | 0 0 0 128: 0 0 0 | 0 0 0 256: 0 0 0 | 0 0 0 512: 8 13 13 | 0 0 0 1024: 50 86 100 | 0 0 0 We get better performances ~27% up here, and all 1 page RPC disappear. Change-Id: I126674cbe15197f0abdff256fdde3fc0c49c6898 Signed-off-by: Wang Shilong Reviewed-on: https://review.whamcloud.com/35216 Tested-by: jenkins Reviewed-by: Li Xi Reviewed-by: Patrick Farrell Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/llite/rw.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index 27442a4..cda05f6 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -398,14 +398,16 @@ ll_read_ahead_pages(const struct lu_env *env, struct cl_io *io, ria->ria_reserved--; count++; } - } else if (stride_ria) { - /* If it is not in the read-ahead window, and it is - * read-ahead mode, then check whether it should skip - * the stride gap */ - pgoff_t offset; - /* FIXME: This assertion only is valid when it is for - * forward read-ahead, it will be fixed when backward - * read-ahead is implemented */ + } else if (stride_ria) { + /* If it is not in the read-ahead window, and it is + * read-ahead mode, then check whether it should skip + * the stride gap. + */ + pgoff_t offset; + /* NOTE: This assertion only is valid when it is for + * forward read-ahead, must adjust if backward + * readahead is implemented. + */ LASSERTF(page_idx >= ria->ria_stoff, "Invalid page_idx %lu rs %lu re %lu ro %lu " "rl %lu rp %lu\n", page_idx, @@ -413,14 +415,15 @@ ll_read_ahead_pages(const struct lu_env *env, struct cl_io *io, ria->ria_length, ria->ria_pages); offset = page_idx - ria->ria_stoff; offset = offset % (ria->ria_length); - if (offset > ria->ria_pages) { - page_idx += ria->ria_length - offset; - CDEBUG(D_READA, "i %lu skip %lu \n", page_idx, - ria->ria_length - offset); - continue; - } - } - } + if (offset >= ria->ria_pages) { + page_idx += ria->ria_length - offset - 1; + CDEBUG(D_READA, + "Stride: jump %lu pages to %lu\n", + ria->ria_length - offset, page_idx); + continue; + } + } + } cl_read_ahead_release(env, &ra); -- 1.8.3.1