backend: tweaks to missed rate thinktime
authorJens Axboe <axboe@kernel.dk>
Tue, 19 Dec 2017 17:17:41 +0000 (10:17 -0700)
committerJens Axboe <axboe@kernel.dk>
Tue, 19 Dec 2017 17:17:41 +0000 (10:17 -0700)
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>
backend.c

index e248117f20624846dbfac614abe7204ca3259807..b4a09acae5ab0e2ccc2515a5b1251342f1dc34d9 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -899,12 +899,14 @@ static void handle_thinktime(struct thread_data *td, enum fio_ddir ddir)
         */
        if (total && td->rate_bps[ddir] && td->o.rate_ign_think) {
                uint64_t missed = (td->rate_bps[ddir] * total) / 1000000ULL;
         */
        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;
 
                uint64_t over;
 
-               if (total >= 1000000)
-                       over = td->o.min_bs[ddir];
+               if (usperop <= total)
+                       over = bs;
                else
                else
-                       over = (td->o.min_bs[ddir] * total) / 1000000ULL;
+                       over = (usperop - total) / usperop * -bs;
 
                td->rate_io_issue_bytes[ddir] += (missed - over);
        }
 
                td->rate_io_issue_bytes[ddir] += (missed - over);
        }