Whamcloud - gitweb
LU-12043 llite: don't miss every first stride page 16/35216/6
authorWang Shilong <wshilong@ddn.com>
Thu, 8 Aug 2019 16:49:24 +0000 (12:49 -0400)
committerOleg Drokin <green@whamcloud.com>
Wed, 21 Aug 2019 04:58:23 +0000 (04:58 +0000)
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>
lustre/llite/rw.c

index 27442a4..cda05f6 100644 (file)
@@ -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);