On 12/19/18 1:29 PM, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > During phases 2-5, xfs_scrub should estimate the level of > parallelization possible on the data device to determine the number of > threads spawned to scrub filesystem metadata, not just blindly using the > number of CPUs. This avoids flooding non-rotational storage with random > reads, which totally destroys performance and makes scrub runtimes > higher. typo in the changelog? __disk_heads() /does/ throw all cpus at nonrotational, should the above presumably say "rotational storage?" Otherwise, Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > --- > scrub/phase1.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > > diff --git a/scrub/phase1.c b/scrub/phase1.c > index 2113014b..6b472147 100644 > --- a/scrub/phase1.c > +++ b/scrub/phase1.c > @@ -109,13 +109,6 @@ _("Must be root to run scrub.")); > return false; > } > > - ctx->nr_io_threads = nproc; > - if (verbose) { > - fprintf(stdout, _("%s: using %d threads to scrub.\n"), > - ctx->mntpoint, scrub_nproc(ctx)); > - fflush(stdout); > - } > - > if (!platform_test_xfs_fd(ctx->mnt_fd)) { > str_info(ctx, ctx->mntpoint, > _("Does not appear to be an XFS filesystem!")); > @@ -193,6 +186,13 @@ _("Unable to find realtime device path.")); > return false; > } > > + ctx->nr_io_threads = disk_heads(ctx->datadev); > + if (verbose) { > + fprintf(stdout, _("%s: using %d threads to scrub.\n"), > + ctx->mntpoint, scrub_nproc(ctx)); > + fflush(stdout); > + } > + > if (ctx->fsinfo.fs_log) { > ctx->logdev = disk_open(ctx->fsinfo.fs_log); > if (error) { >