Add poisson rate selection to FD_RATE output
[fio.git] / backend.c
index 0a42da3ec440673d741da6ce56e235e997caf1b6..b329fa31f62dc929a5bb7c5796b27a2dd03d1cd2 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -35,6 +35,7 @@
 #include <sys/wait.h>
 #include <sys/ipc.h>
 #include <sys/mman.h>
+#include <math.h>
 
 #include "fio.h"
 #ifndef FIO_NO_HAVE_SHM_H
@@ -775,17 +776,30 @@ static int io_complete_bytes_exceeded(struct thread_data *td)
  */
 static long long usec_for_io(struct thread_data *td, enum fio_ddir ddir)
 {
-       uint64_t secs, remainder, bps, bytes;
+       uint64_t secs, remainder, bps, bytes, iops;
 
        assert(!(td->flags & TD_F_CHILD));
        bytes = td->rate_io_issue_bytes[ddir];
        bps = td->rate_bps[ddir];
-       if (bps) {
+
+       if (td->o.poisson_rate) {
+               uint64_t val;
+               iops = bps / td->o.bs[ddir];
+               val = (int64_t) (1000000 / iops) *
+                               -logf(__rand_0_1(&td->poisson_state));
+               if (val) {
+                       dprint(FD_RATE, "poisson rate iops=%llu\n",
+                                       (unsigned long long) 1000000 / val);
+               }
+               td->last_usec += val;
+               return td->last_usec;
+       } else if (bps) {
                secs = bytes / bps;
                remainder = bytes % bps;
                return remainder * 1000000 / bps + secs * 1000000;
-       } else
-               return 0;
+       }
+
+       return 0;
 }
 
 /*