fix ramp_in
authorSigned-off-by Steven Pratt <slpratt@austin.ibm.com>
Tue, 14 Dec 2010 07:31:36 +0000 (08:31 +0100)
committerJens Axboe <jaxboe@fusionio.com>
Tue, 14 Dec 2010 07:31:36 +0000 (08:31 +0100)
There are a couple of problems with the relatively new ramp_in feature
of fio.  First, the estimated time to completion did not correctly take
it into account and bounces around.  Second and more importantly, the
runtime was including ramp in time in throughput calculations even
though the IO done during that time was ignored, thus making throughput
metrics incorrect. This patch fixes both.

Signed-off-by Steven Pratt <slpratt@austin.ibm.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
eta.c
fio.c
fio.h
stat.c

diff --git a/eta.c b/eta.c
index 608e0dd4cfa59a130c35bf39d0e3918618aca893..ba6a3989366f37b025c42b5a4569e91ab707febe 100644 (file)
--- a/eta.c
+++ b/eta.c
@@ -161,12 +161,13 @@ static int thread_eta(struct thread_data *td)
                 * if given, otherwise assume it'll run at the specified rate.
                 */
                if (td->o.timeout) {
-                       t_eta = td->o.timeout + td->o.start_delay;
+                       t_eta = td->o.timeout + td->o.start_delay +
+                                       td->o.ramp_time;
 
                        if (in_ramp_time(td)) {
                                unsigned long ramp_left;
 
-                               ramp_left = mtime_since_now(&td->start);
+                               ramp_left = mtime_since_now(&td->epoch);
                                ramp_left = (ramp_left + 999) / 1000;
                                if (ramp_left <= t_eta)
                                        t_eta -= ramp_left;
diff --git a/fio.c b/fio.c
index 91bf6b613cac30403ff9c7ec96865a2b56051103..8dff813cc20bab39d7b1ac13d1ca0c80d611440a 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -989,6 +989,8 @@ void reset_all_stats(struct thread_data *td)
        }
        
        fio_gettime(&tv, NULL);
+       td->ts.runtime[0] = 0;
+       td->ts.runtime[1] = 0;
        memcpy(&td->epoch, &tv, sizeof(tv));
        memcpy(&td->start, &tv, sizeof(tv));
 }
@@ -1027,7 +1029,7 @@ static int exec_string(const char *string)
  */
 static void *thread_main(void *data)
 {
-       unsigned long long runtime[2], elapsed;
+       unsigned long long elapsed;
        struct thread_data *td = data;
        pthread_condattr_t attr;
        int clear_state;
@@ -1145,7 +1147,6 @@ static void *thread_main(void *data)
        fio_gettime(&td->epoch, NULL);
        getrusage(RUSAGE_SELF, &td->ts.ru_start);
 
-       runtime[0] = runtime[1] = 0;
        clear_state = 0;
        while (keep_running(td)) {
                fio_gettime(&td->start, NULL);
@@ -1170,11 +1171,11 @@ static void *thread_main(void *data)
 
                if (td_read(td) && td->io_bytes[DDIR_READ]) {
                        elapsed = utime_since_now(&td->start);
-                       runtime[DDIR_READ] += elapsed;
+                       td->ts.runtime[DDIR_READ] += elapsed;
                }
                if (td_write(td) && td->io_bytes[DDIR_WRITE]) {
                        elapsed = utime_since_now(&td->start);
-                       runtime[DDIR_WRITE] += elapsed;
+                       td->ts.runtime[DDIR_WRITE] += elapsed;
                }
 
                if (td->error || td->terminate)
@@ -1191,15 +1192,15 @@ static void *thread_main(void *data)
 
                do_verify(td);
 
-               runtime[DDIR_READ] += utime_since_now(&td->start);
+               td->ts.runtime[DDIR_READ] += utime_since_now(&td->start);
 
                if (td->error || td->terminate)
                        break;
        }
 
        update_rusage_stat(td);
-       td->ts.runtime[0] = (runtime[0] + 999) / 1000;
-       td->ts.runtime[1] = (runtime[1] + 999) / 1000;
+       td->ts.runtime[0] = (td->ts.runtime[0] + 999) / 1000;
+       td->ts.runtime[1] = (td->ts.runtime[1] + 999) / 1000;
        td->ts.total_run_time = mtime_since_now(&td->epoch);
        td->ts.io_bytes[0] = td->io_bytes[0];
        td->ts.io_bytes[1] = td->io_bytes[1];
diff --git a/fio.h b/fio.h
index 4ed8cb1b0480c2e717848564fd2167a82dd29809..c04ad8b2e37ce8dada1e97f7652174b2009f819c 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -126,7 +126,7 @@ struct thread_stat {
        unsigned long total_complete;
 
        unsigned long long io_bytes[2];
-       unsigned long runtime[2];
+       unsigned long long runtime[2];
        unsigned long total_run_time;
 
        /*
diff --git a/stat.c b/stat.c
index b5ff0101b7b0feca625721bc10b351a48825a271..a596388a41c5b00f820fb2f79f69436dfecd9aa2 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -172,7 +172,7 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
        iops = (1000 * ts->total_io_u[ddir]) / runt;
        iops_p = num2str(iops, 6, 1, 0);
 
-       log_info("  %s: io=%sB, bw=%sB/s, iops=%s, runt=%6lumsec\n",
+       log_info("  %s: io=%sB, bw=%sB/s, iops=%s, runt=%6llumsec\n",
                                        ddir_str[ddir], io_p, bw_p, iops_p,
                                        ts->runtime[ddir]);
 
@@ -380,7 +380,7 @@ static void show_ddir_status_terse(struct thread_stat *ts,
        if (ts->runtime[ddir])
                bw = ts->io_bytes[ddir] / ts->runtime[ddir];
 
-       log_info(";%llu;%llu;%lu", ts->io_bytes[ddir] >> 10, bw,
+       log_info(";%llu;%llu;%llu", ts->io_bytes[ddir] >> 10, bw,
                                                        ts->runtime[ddir]);
 
        if (calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev))