X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=stat.c;h=08a402a74c6d12e6c7bb339acce638dec5234514;hp=fc1efd4057bd29ffa41e4e45c6061cd4e50624e2;hb=78abcf9b17b56997cdfa75af79cbcf468276e4f9;hpb=2ab71dc4d39e29764f0f80a3559a0119247e1eb1 diff --git a/stat.c b/stat.c index fc1efd40..08a402a7 100644 --- a/stat.c +++ b/stat.c @@ -16,6 +16,7 @@ #include "lib/pow2.h" #include "lib/output_buffer.h" #include "helper_thread.h" +#include "smalloc.h" struct fio_mutex *stat_mutex; @@ -1636,16 +1637,21 @@ void __show_run_stats(void) if (output_format & FIO_OUTPUT_JSON) { struct thread_data *global; char time_buf[32]; - time_t time_p; + struct timeval now; + unsigned long long ms_since_epoch; - time(&time_p); - os_ctime_r((const time_t *) &time_p, time_buf, + gettimeofday(&now, NULL); + ms_since_epoch = (unsigned long long)(now.tv_sec) * 1000 + + (unsigned long long)(now.tv_usec) / 1000; + + os_ctime_r((const time_t *) &now.tv_sec, time_buf, sizeof(time_buf)); time_buf[strlen(time_buf) - 1] = '\0'; root = json_create_object(); json_object_add_value_string(root, "fio version", fio_version_string); - json_object_add_value_int(root, "timestamp", time_p); + json_object_add_value_int(root, "timestamp", now.tv_sec); + json_object_add_value_int(root, "timestamp_ms", ms_since_epoch); json_object_add_value_string(root, "time", time_buf); global = get_global_options(); json_add_job_opts(root, "global options", &global->opt_list, false); @@ -1872,7 +1878,7 @@ static struct io_logs *get_new_log(struct io_log *iolog) new_size = new_samples * log_entry_sz(iolog); - cur_log = malloc(sizeof(*cur_log)); + cur_log = smalloc(sizeof(*cur_log)); if (cur_log) { INIT_FLIST_HEAD(&cur_log->list); cur_log->log = malloc(new_size); @@ -1883,7 +1889,7 @@ static struct io_logs *get_new_log(struct io_log *iolog) iolog->cur_log_max = new_samples; return cur_log; } - free(cur_log); + sfree(cur_log); } return NULL; @@ -1943,6 +1949,7 @@ static struct io_logs *regrow_log(struct io_log *iolog) dst = get_sample(iolog, cur_log, i); memcpy(dst, src, log_entry_sz(iolog)); } + cur_log->nr_samples = iolog->pending->nr_samples; iolog->pending->nr_samples = 0; return cur_log; @@ -1977,11 +1984,14 @@ static struct io_logs *get_cur_log(struct io_log *iolog) return cur_log; /* - * Out of space. If we're in IO offload mode, add a new log chunk - * inline. If we're doing inline submissions, flag 'td' as needing - * a log regrow and we'll take care of it on the submission side. + * Out of space. If we're in IO offload mode, or we're not doing + * per unit logging (hence logging happens outside of the IO thread + * as well), add a new log chunk inline. If we're doing inline + * submissions, flag 'td' as needing a log regrow and we'll take + * care of it on the submission side. */ - if (iolog->td->o.io_submit_mode == IO_MODE_OFFLOAD) + if (iolog->td->o.io_submit_mode == IO_MODE_OFFLOAD || + !per_unit_log(iolog)) return regrow_log(iolog); iolog->td->flags |= TD_F_REGROW_LOGS; @@ -2132,7 +2142,7 @@ static void add_log_sample(struct thread_data *td, struct io_log *iolog, _add_stat_to_log(iolog, elapsed, td->o.log_max != 0); - iolog->avg_last = elapsed; + iolog->avg_last = elapsed - (this_window - iolog->avg_msec); } void finalize_logs(struct thread_data *td, bool unit_logs) @@ -2255,9 +2265,6 @@ static int add_bw_samples(struct thread_data *td, struct timeval *t) unsigned long spent, rate; enum fio_ddir ddir; - if (per_unit_log(td->bw_log)) - return 0; - spent = mtime_since(&td->bw_sample_time, t); if (spent < td->o.bw_avg_time && td->o.bw_avg_time - spent >= 10) @@ -2326,9 +2333,6 @@ static int add_iops_samples(struct thread_data *td, struct timeval *t) unsigned long spent, iops; enum fio_ddir ddir; - if (per_unit_log(td->iops_log)) - return 0; - spent = mtime_since(&td->iops_sample_time, t); if (spent < td->o.iops_avg_time && td->o.iops_avg_time - spent >= 10) @@ -2388,7 +2392,7 @@ int calc_log_samples(void) fio_gettime(&now, NULL); for_each_td(td, i) { - if (!ramp_time_over(td) || + if (in_ramp_time(td) || !(td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING)) { next = min(td->o.iops_avg_time, td->o.bw_avg_time); continue;