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 <wshilong@ddn.com>
Reviewed-on: https://review.whamcloud.com/35216
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Li Xi <lixi@ddn.com>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
ria->ria_reserved--;
count++;
}
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,
LASSERTF(page_idx >= ria->ria_stoff,
"Invalid page_idx %lu rs %lu re %lu ro %lu "
"rl %lu rp %lu\n", page_idx,
ria->ria_length, ria->ria_pages);
offset = page_idx - ria->ria_stoff;
offset = offset % (ria->ria_length);
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);
cl_read_ahead_release(env, &ra);