X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=stat.c;h=6418cf1f6c15ff4cbffbac5d6964399f64e33615;hp=44edd1e97b35fca609b7969c2e8340842d49f927;hb=39f22027248f658ade599e89c2fe6afae02ac9d7;hpb=7c9b1bce094d58c374b086bbb780c08265623ea4 diff --git a/stat.c b/stat.c index 44edd1e9..6418cf1f 100644 --- a/stat.c +++ b/stat.c @@ -10,49 +10,6 @@ #include "fio.h" #include "diskutil.h" -/* - * Cheesy number->string conversion, complete with carry rounding error. - */ -static char *num2str(unsigned long num, int maxlen, int base, int pow2) -{ - char postfix[] = { ' ', 'K', 'M', 'G', 'P', 'E' }; - unsigned int thousand; - char *buf; - int i; - - if (pow2) - thousand = 1024; - else - thousand = 1000; - - buf = malloc(128); - - for (i = 0; base > 1; i++) - base /= thousand; - - do { - int len, carry = 0; - - len = sprintf(buf, "%'lu", num); - if (len <= maxlen) { - if (i >= 1) { - buf[len] = postfix[i]; - buf[len + 1] = '\0'; - } - return buf; - } - - if ((num % thousand) >= (thousand / 2)) - carry = 1; - - num /= thousand; - num += carry; - i++; - } while (i <= 5); - - return buf; -} - void update_rusage_stat(struct thread_data *td) { struct thread_stat *ts = &td->ts; @@ -102,15 +59,17 @@ static void show_group_stats(struct group_run_stats *rs, int id) log_info("\nRun status group %d (all jobs):\n", id); for (i = 0; i <= DDIR_WRITE; i++) { + const int i2p = is_power_of_2(rs->kb_base); + if (!rs->max_run[i]) continue; - p1 = num2str(rs->io_kb[i], 6, 1024, 1); - p2 = num2str(rs->agg[i], 6, 1024, 1); - p3 = num2str(rs->min_bw[i], 6, 1024, 1); - p4 = num2str(rs->max_bw[i], 6, 1024, 1); + p1 = num2str(rs->io_kb[i], 6, rs->kb_base, i2p); + p2 = num2str(rs->agg[i], 6, rs->kb_base, i2p); + p3 = num2str(rs->min_bw[i], 6, rs->kb_base, i2p); + p4 = num2str(rs->max_bw[i], 6, rs->kb_base, i2p); - log_info("%s: io=%siB, aggrb=%siB/s, minb=%siB/s, maxb=%siB/s," + log_info("%s: io=%sB, aggrb=%sB/s, minb=%sB/s, maxb=%sB/s," " mint=%llumsec, maxt=%llumsec\n", ddir_str[i], p1, p2, p3, p4, rs->min_run[i], rs->max_run[i]); @@ -196,20 +155,22 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts, unsigned long long bw, iops; double mean, dev; char *io_p, *bw_p, *iops_p; + int i2p; if (!ts->runtime[ddir]) return; + i2p = is_power_of_2(rs->kb_base); runt = ts->runtime[ddir]; bw = (1000 * ts->io_bytes[ddir]) / runt; - io_p = num2str(ts->io_bytes[ddir] >> 10, 6, 1024, 1); - bw_p = num2str(bw >> 10, 6, 1024, 1); + io_p = num2str(ts->io_bytes[ddir], 6, 1, i2p); + bw_p = num2str(bw, 6, 1, i2p); iops = (1000 * ts->total_io_u[ddir]) / runt; iops_p = num2str(iops, 6, 1, 0); - log_info(" %s: io=%siB, bw=%siB/s, iops=%s, runt=%6lumsec\n", + log_info(" %s: io=%sB, bw=%sB/s, iops=%s, runt=%6lumsec\n", ddir_str[ddir], io_p, bw_p, iops_p, ts->runtime[ddir]); @@ -253,7 +214,7 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts, double p_of_agg; p_of_agg = mean * 100 / (double) rs->agg[ddir]; - log_info(" bw (KiB/s) : min=%5lu, max=%5lu, per=%3.2f%%," + log_info(" bw (KB/s) : min=%5lu, max=%5lu, per=%3.2f%%," " avg=%5.02f, stdev=%5.02f\n", min, max, p_of_agg, mean, dev); } @@ -378,6 +339,12 @@ static void show_thread_status(struct thread_stat *ts, stat_calc_lat_u(ts, io_u_lat_u); stat_calc_lat_m(ts, io_u_lat_m); show_latencies(io_u_lat_u, io_u_lat_m); + if (ts->continue_on_error) { + log_info(" errors : total=%lu, first_error=%d/<%s>\n", + ts->total_err_count, + ts->first_error, + strerror(ts->first_error)); + } } static void show_ddir_status_terse(struct thread_stat *ts, @@ -453,6 +420,8 @@ static void show_thread_status_terse(struct thread_stat *ts, log_info(";%3.2f%%", io_u_lat_u[i]); for (i = 0; i < FIO_IO_U_LAT_M_NR; i++) log_info(";%3.2f%%", io_u_lat_m[i]); + if (ts->continue_on_error) + log_info(";%lu;%d", ts->total_err_count, ts->first_error); log_info("\n"); if (ts->description) @@ -492,6 +461,7 @@ void show_run_stats(void) struct thread_data *td; struct thread_stat *threadstats, *ts; int i, j, k, l, nr_ts, last_ts, idx; + int kb_base_warned = 0; runstats = malloc(sizeof(struct group_run_stats) * (groupid + 1)); @@ -564,11 +534,26 @@ void show_run_stats(void) * first pid in group, not very useful... */ ts->pid = td->pid; + + ts->kb_base = td->o.kb_base; + } else if (ts->kb_base != td->o.kb_base && !kb_base_warned) { + log_info("fio: kb_base differs for jobs in group, using" + " %u as the base\n", ts->kb_base); + kb_base_warned = 1; } - if (td->error && !ts->error) { - ts->error = td->error; - ts->verror = td->verror; + ts->continue_on_error = td->o.continue_on_error; + ts->total_err_count += td->total_err_count; + ts->first_error = td->first_error; + if (!ts->error) { + if (!td->error && td->o.continue_on_error && + td->first_error) { + ts->error = td->first_error; + ts->verror = td->verror; + } else if (td->error) { + ts->error = td->error; + ts->verror = td->verror; + } } for (l = 0; l <= DDIR_WRITE; l++) { @@ -616,6 +601,7 @@ void show_run_stats(void) ts = &threadstats[i]; rs = &runstats[ts->groupid]; + rs->kb_base = ts->kb_base; for (j = 0; j <= DDIR_WRITE; j++) { if (!ts->runtime[j]) @@ -629,7 +615,7 @@ void show_run_stats(void) if (ts->runtime[j]) { unsigned long runt; - runt = ts->runtime[j] * 1024 / 1000; + runt = ts->runtime[j]; bw = ts->io_bytes[j] / runt; } if (bw < rs->min_bw[j]) @@ -637,7 +623,7 @@ void show_run_stats(void) if (bw > rs->max_bw[j]) rs->max_bw[j] = bw; - rs->io_kb[j] += ts->io_bytes[j] >> 10; + rs->io_kb[j] += ts->io_bytes[j] / rs->kb_base; } } @@ -645,13 +631,13 @@ void show_run_stats(void) unsigned long max_run[2]; rs = &runstats[i]; - max_run[0] = rs->max_run[0] * 1024 / 1000; - max_run[1] = rs->max_run[1] * 1024 / 1000; + max_run[0] = rs->max_run[0]; + max_run[1] = rs->max_run[1]; if (rs->max_run[0]) - rs->agg[0] = (rs->io_kb[0]*1024) / max_run[0]; + rs->agg[0] = (rs->io_kb[0] * 1000) / max_run[0]; if (rs->max_run[1]) - rs->agg[1] = (rs->io_kb[1]*1024) / max_run[1]; + rs->agg[1] = (rs->io_kb[1] * 1000) / max_run[1]; } /* @@ -766,7 +752,8 @@ void add_bw_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs, if (spent < td->o.bw_avg_time) return; - rate = (td->this_io_bytes[ddir] - ts->stat_io_bytes[ddir]) * 1000 / spent / 1024; + rate = (td->this_io_bytes[ddir] - ts->stat_io_bytes[ddir]) * + 1000 / spent / 1024; add_stat_sample(&ts->bw_stat[ddir], rate); if (ts->bw_log)