From: Wang Shilong Date: Thu, 8 Aug 2019 16:49:24 +0000 (-0400) Subject: LU-12043 llite: don't miss every first stride page X-Git-Tag: 2.12.58~57 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=29d8eb5ee7dff422294c9ee3d0f34f1370cec800 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 --- 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);