shimrot says:
"May I suggest a tweak to the backend.c::handle_thinktime calculation of
"over"? That is, adjust based on the rate per byte similar to what
you've done. That is, if thinktime is greater than one op worth of
bytes, then subtract one op worth of bytes. But, if think time is
greater than one ops worth, instead add the missing the number of bytes
a full op would have exceeded the think time."
See: https://github.com/axboe/fio/issues/497#issuecomment-
352816955
Signed-off-by: Jens Axboe <axboe@kernel.dk>
*/
if (total && td->rate_bps[ddir] && td->o.rate_ign_think) {
uint64_t missed = (td->rate_bps[ddir] * total) / 1000000ULL;
+ uint64_t bs = td->o.min_bs[ddir];
+ uint64_t usperop = bs * 1000000ULL / td->rate_bps[ddir];
uint64_t over;
- if (total >= 1000000)
- over = td->o.min_bs[ddir];
+ if (usperop <= total)
+ over = bs;
else
- over = (td->o.min_bs[ddir] * total) / 1000000ULL;
+ over = (usperop - total) / usperop * -bs;
td->rate_io_issue_bytes[ddir] += (missed - over);
}