eta: ETA bandwidth was off by 1.024
authorJens Axboe <axboe@kernel.dk>
Fri, 11 May 2012 18:33:02 +0000 (20:33 +0200)
committerJens Axboe <axboe@kernel.dk>
Fri, 11 May 2012 18:33:02 +0000 (20:33 +0200)
Same fix as 033bbb51 essentially. Since mtime is a 1000th of a second,
for the usual option of having 1024 be the KB base, we end up being
off by 1.024 if we don't multiply by 1000 before dividing by the
runtime (and then dividing by 1024 to get to next power-of-2).

Signed-off-by: Jens Axboe <axboe@kernel.dk>
client.c
eta.c
server.c
server.h
stat.h

index 0ce7a6ebf3692166f381afb12ff632e1bc16244c..7c9910961e7dee6685cd473b5d2193c0cd8a0391 100644 (file)
--- a/client.c
+++ b/client.c
@@ -725,6 +725,7 @@ static void convert_jobs_eta(struct jobs_eta *je)
 
        je->elapsed_sec         = le64_to_cpu(je->elapsed_sec);
        je->eta_sec             = le64_to_cpu(je->eta_sec);
 
        je->elapsed_sec         = le64_to_cpu(je->elapsed_sec);
        je->eta_sec             = le64_to_cpu(je->eta_sec);
+       je->is_pow2             = le32_to_cpu(je->is_pow2);
 }
 
 static void sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je)
 }
 
 static void sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je)
diff --git a/eta.c b/eta.c
index 4679a21a1192b0c36f2df0b5016580537cb1f0b8..911459501d342c004f95d8a696cd2e08e0e3f8bc 100644 (file)
--- a/eta.c
+++ b/eta.c
@@ -216,8 +216,14 @@ static int thread_eta(struct thread_data *td)
 static void calc_rate(unsigned long mtime, unsigned long long *io_bytes,
                      unsigned long long *prev_io_bytes, unsigned int *rate)
 {
 static void calc_rate(unsigned long mtime, unsigned long long *io_bytes,
                      unsigned long long *prev_io_bytes, unsigned int *rate)
 {
-       rate[0] = (io_bytes[0] - prev_io_bytes[0]) / mtime;
-       rate[1] = (io_bytes[1] - prev_io_bytes[1]) / mtime;
+       int i;
+
+       for (i = 0; i <= DDIR_WRITE; i++) {
+               unsigned long long diff;
+
+               diff = io_bytes[i] - prev_io_bytes[i];
+               rate[i] = ((1000 * diff) / mtime) / 1024;
+       }
        prev_io_bytes[0] = io_bytes[0];
        prev_io_bytes[1] = io_bytes[1];
 }
        prev_io_bytes[0] = io_bytes[0];
        prev_io_bytes[1] = io_bytes[1];
 }
@@ -248,7 +254,6 @@ int calc_thread_status(struct jobs_eta *je, int force)
        static unsigned long long disp_io_bytes[2];
        static unsigned long long disp_io_iops[2];
        static struct timeval rate_prev_time, disp_prev_time;
        static unsigned long long disp_io_bytes[2];
        static unsigned long long disp_io_iops[2];
        static struct timeval rate_prev_time, disp_prev_time;
-       int i2p = 0;
 
        if (!force) {
                if (temp_stall_ts || terse_output || eta_print == FIO_ETA_NEVER)
 
        if (!force) {
                if (temp_stall_ts || terse_output || eta_print == FIO_ETA_NEVER)
@@ -272,6 +277,8 @@ int calc_thread_status(struct jobs_eta *je, int force)
        io_iops[0] = io_iops[1] = 0;
        bw_avg_time = ULONG_MAX;
        for_each_td(td, i) {
        io_iops[0] = io_iops[1] = 0;
        bw_avg_time = ULONG_MAX;
        for_each_td(td, i) {
+               if (is_power_of_2(td->o.kb_base))
+                       je->is_pow2 = 1;
                if (td->o.bw_avg_time < bw_avg_time)
                        bw_avg_time = td->o.bw_avg_time;
                if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING
                if (td->o.bw_avg_time < bw_avg_time)
                        bw_avg_time = td->o.bw_avg_time;
                if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING
@@ -311,8 +318,6 @@ int calc_thread_status(struct jobs_eta *je, int force)
                je->eta_sec = 0;
 
        for_each_td(td, i) {
                je->eta_sec = 0;
 
        for_each_td(td, i) {
-               if (!i2p && is_power_of_2(td->o.kb_base))
-                       i2p = 1;
                if (exitall_on_terminate) {
                        if (eta_secs[i] < je->eta_sec)
                                je->eta_sec = eta_secs[i];
                if (exitall_on_terminate) {
                        if (eta_secs[i] < je->eta_sec)
                                je->eta_sec = eta_secs[i];
@@ -363,7 +368,6 @@ void display_thread_status(struct jobs_eta *je)
        char output[REAL_MAX_JOBS + 512], *p = output;
        char eta_str[128];
        double perc = 0.0;
        char output[REAL_MAX_JOBS + 512], *p = output;
        char eta_str[128];
        double perc = 0.0;
-       int i2p = 0;
 
        if (je->eta_sec != INT_MAX && je->elapsed_sec) {
                perc = (double) je->elapsed_sec / (double) (je->elapsed_sec + je->eta_sec);
 
        if (je->eta_sec != INT_MAX && je->elapsed_sec) {
                perc = (double) je->elapsed_sec / (double) (je->elapsed_sec + je->eta_sec);
@@ -374,8 +378,8 @@ void display_thread_status(struct jobs_eta *je)
        if (je->m_rate || je->t_rate) {
                char *tr, *mr;
 
        if (je->m_rate || je->t_rate) {
                char *tr, *mr;
 
-               mr = num2str(je->m_rate, 4, 0, i2p);
-               tr = num2str(je->t_rate, 4, 0, i2p);
+               mr = num2str(je->m_rate, 4, 0, je->is_pow2);
+               tr = num2str(je->t_rate, 4, 0, je->is_pow2);
                p += sprintf(p, ", CR=%s/%s KB/s", tr, mr);
                free(tr);
                free(mr);
                p += sprintf(p, ", CR=%s/%s KB/s", tr, mr);
                free(tr);
                free(mr);
@@ -396,8 +400,8 @@ void display_thread_status(struct jobs_eta *je)
                        sprintf(perc_str, "%3.1f%% done", perc);
                }
 
                        sprintf(perc_str, "%3.1f%% done", perc);
                }
 
-               rate_str[0] = num2str(je->rate[0], 5, 10, i2p);
-               rate_str[1] = num2str(je->rate[1], 5, 10, i2p);
+               rate_str[0] = num2str(je->rate[0], 5, 1024, je->is_pow2);
+               rate_str[1] = num2str(je->rate[1], 5, 1024, je->is_pow2);
 
                iops_str[0] = num2str(je->iops[0], 4, 1, 0);
                iops_str[1] = num2str(je->iops[1], 4, 1, 0);
 
                iops_str[0] = num2str(je->iops[0], 4, 1, 0);
                iops_str[1] = num2str(je->iops[1], 4, 1, 0);
index 169f50ad2a190386258deea14a0009c6ef975227..72def7e003ee938a1c41f3d4a7e31d14b4ce3ce3 100644 (file)
--- a/server.c
+++ b/server.c
@@ -451,6 +451,7 @@ static int handle_send_eta_cmd(struct fio_net_cmd *cmd)
 
        je->elapsed_sec         = cpu_to_le64(je->elapsed_sec);
        je->eta_sec             = cpu_to_le64(je->eta_sec);
 
        je->elapsed_sec         = cpu_to_le64(je->elapsed_sec);
        je->eta_sec             = cpu_to_le64(je->eta_sec);
+       je->is_pow2             = cpu_to_le32(je->is_pow2);
 
        fio_net_send_cmd(server_fd, FIO_NET_CMD_ETA, je, size, cmd->tag);
        free(je);
 
        fio_net_send_cmd(server_fd, FIO_NET_CMD_ETA, je, size, cmd->tag);
        free(je);
index 494a40a9499a21c8f0aeee49f7cb0ed43243e89c..6d5a83d505234eeabd8656d0da452c32dab2f0d1 100644 (file)
--- a/server.h
+++ b/server.h
@@ -36,7 +36,7 @@ struct fio_net_int_cmd {
 };
 
 enum {
 };
 
 enum {
-       FIO_SERVER_VER          = 7,
+       FIO_SERVER_VER          = 8,
 
        FIO_SERVER_MAX_PDU      = 1024,
 
 
        FIO_SERVER_MAX_PDU      = 1024,
 
diff --git a/stat.h b/stat.h
index be27c72c1990ac65fc18dc411b93b16ee2ed0d65..c15f26ea290b27bc04287b4e531bfd1e990b7276 100644 (file)
--- a/stat.h
+++ b/stat.h
@@ -180,6 +180,7 @@ struct jobs_eta {
        uint32_t iops[2];
        uint64_t elapsed_sec;
        uint64_t eta_sec;
        uint32_t iops[2];
        uint64_t elapsed_sec;
        uint64_t eta_sec;
+       uint32_t is_pow2;
 
        /*
         * Network 'copy' of run_str[]
 
        /*
         * Network 'copy' of run_str[]