Message ID | 20230816181433.13289-1-djeffery@redhat.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | [v2] md: raid0: account for split bio in iostat accounting | expand |
On Wed, Aug 16, 2023 at 11:14 AM David Jeffery <djeffery@redhat.com> wrote: > > When a bio is split by md raid0, the newly created bio will not be tracked > by md for I/O accounting. Only the portion of I/O still assigned to the > original bio which was reduced by the split will be accounted for. This > results in md iostat data sometimes showing I/O values far below the actual > amount of data being sent through md. > > md_account_bio() needs to be called for all bio generated by the bio split. > > A simple example of the issue was generated using a raid0 device on partitions > to the same device. Since all raid0 I/O then goes to one device, it makes it > easy to see a gap between the md device and its sd storage. Reading an lvm > device on top of the md device, the iostat output (some 0 columns and extra > devices removed to make the data more compact) was: > > Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read > md2 0.00 0.00 0.00 0.00 0 > sde 0.00 0.00 0.00 0.00 0 > md2 1364.00 411496.00 0.00 0.00 411496 > sde 1734.00 646144.00 0.00 0.00 646144 > md2 1699.00 510680.00 0.00 0.00 510680 > sde 2155.00 802784.00 0.00 0.00 802784 > md2 803.00 241480.00 0.00 0.00 241480 > sde 1016.00 377888.00 0.00 0.00 377888 > md2 0.00 0.00 0.00 0.00 0 > sde 0.00 0.00 0.00 0.00 0 > > I/O was generated doing large direct I/O reads (12M) with dd to a linear > lvm volume on top of the 4 leg raid0 device. > > The md2 reads were showing as roughly 2/3 of the reads to the sde device > containing all of md2's raid partitions. The sum of reads to sde was > 1826816 kB, which was the expected amount as it was the amount read by > dd. With the patch, the total reads from md will match the reads from > sde and be consistent with the amount of I/O generated. > > Fixes: 10764815ff47 ("md: add io accounting for raid0 and raid5") > Signed-off-by: David Jeffery <djeffery@redhat.com> > Tested-by: Laurence Oberman <loberman@redhat.com> > Reviewed-by: Laurence Oberman <loberman@redhat.com> > Reviewed-by: Yu Kuai <yukuai3@huawei.com> Applied to md-next. Thanks! Song > --- > > Patch v2: ported to apply on top of md-next > > drivers/md/raid0.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c > index abbd77977f98..c50a7abda744 100644 > --- a/drivers/md/raid0.c > +++ b/drivers/md/raid0.c > @@ -553,8 +553,7 @@ static void raid0_map_submit_bio(struct mddev *mddev, struct bio *bio) > sector_t bio_sector = bio->bi_iter.bi_sector; > sector_t sector = bio_sector; > > - if (bio->bi_pool != &mddev->bio_set) > - md_account_bio(mddev, &bio); > + md_account_bio(mddev, &bio); > > zone = find_zone(mddev->private, §or); > switch (conf->layout) { > -- > 2.41.0 >
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index abbd77977f98..c50a7abda744 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -553,8 +553,7 @@ static void raid0_map_submit_bio(struct mddev *mddev, struct bio *bio) sector_t bio_sector = bio->bi_iter.bi_sector; sector_t sector = bio_sector; - if (bio->bi_pool != &mddev->bio_set) - md_account_bio(mddev, &bio); + md_account_bio(mddev, &bio); zone = find_zone(mddev->private, §or); switch (conf->layout) {