-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Detect a slow raidz child during reads #16900
base: master
Are you sure you want to change the base?
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -104,12 +104,19 @@ Comma separated list of children of this vdev | |
The number of children belonging to this vdev | ||
.It Sy read_errors , write_errors , checksum_errors , initialize_errors , trim_errors | ||
The number of errors of each type encountered by this vdev | ||
.It Sy sit_out_reads | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would rename it to just |
||
True when a slow disk outlier was detected and the vdev is currently in a sit | ||
out state. | ||
While sitting out, the vdev will not participate in normal reads, instead its | ||
data will be reconstructed as needed from parity. | ||
.It Sy slow_ios | ||
The number of slow I/Os encountered by this vdev, | ||
These represent I/O operations that didn't complete in | ||
.Sy zio_slow_io_ms | ||
milliseconds | ||
.Pq Sy 30000 No by default . | ||
Can also be incremented when a vdev was determined to be a raidz leaf latency | ||
outlier. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure I understand what you mean by this. Who would be incrementing There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. how about this...
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||
.It Sy null_ops , read_ops , write_ops , free_ops , claim_ops , trim_ops | ||
The number of I/O operations of each type performed by this vdev | ||
.It Xo | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1993,6 +1993,29 @@ vdev_draid_io_start_read(zio_t *zio, raidz_row_t *rr) | |
rc->rc_force_repair = 1; | ||
rc->rc_allow_repair = 1; | ||
} | ||
} else if (vdev_sit_out_reads(cvd, zio->io_flags)) { | ||
rr->rr_outlier_cnt++; | ||
rc->rc_latency_outlier = 1; | ||
} | ||
} | ||
|
||
/* | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To skip vdevs which are sitting out during a resilver we need to modify this check slightly. Each resilvering drive will add one to Can you also add versions of /*
* When the row contains a latency outlier and sufficient parity
* exists to reconstruct the column data, then skip reading the
* known slow child vdev as a performance optimization.
*/
if (rr->rr_outlier_cnt > 0) {
int available_parity = rr->rr_firstdatacol - rr->rr_missingparity;
int required_parity = rr->rr_missingdata + 1;
if (available_parity >= required_parity) {
for (int c = rr->rr_cols - 1;
c >= rr->rr_firstdatacol; c--) {
raidz_col_t *rc = &rr->rr_col[c];
if (rc->rc_error == 0 &&
rc->rc_latency_outlier) {
rr->rr_missingdata++;
rc->rc_error = SET_ERROR(EAGAIN);
rc->rc_skipped = 1;
break;
}
}
}
} |
||
* When the row contains a latency outlier and sufficient parity | ||
* exists to reconstruct the column data, then skip reading the | ||
* known slow child vdev as a performance optimization. | ||
*/ | ||
if (rr->rr_outlier_cnt > 0 && rr->rr_missingdata == 0 && | ||
(rr->rr_firstdatacol - rr->rr_missingparity) > 0) { | ||
|
||
for (int c = rr->rr_cols - 1; c >= rr->rr_firstdatacol; c--) { | ||
raidz_col_t *rc = &rr->rr_col[c]; | ||
|
||
if (rc->rc_latency_outlier) { | ||
rr->rr_missingdata++; | ||
rc->rc_error = SET_ERROR(EAGAIN); | ||
rc->rc_skipped = 1; | ||
break; | ||
} | ||
} | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All references to 'raidz' should be renamed to 'raid', since this works with dRAID (and to match the
raid_read_sit_out_secs
name in the commit message)There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It was originally, I asked Don to rename it "raidz" in this #16900 (comment) so it's consistent with some other existing names. Perhaps the best thing to do would be rename it
read_sit_out_secs
. Then we could also generically apply it to mirrors if someday support is added for that.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Or even,
sit_out_secs
to be consistent with the other renames.