X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=stat.c;h=1a9c553b12b744d72a1f25c28f6b7f1f53accfa0;hp=82e79dfcf1885b7cbcf3e2ad1212be29e79877c2;hb=f111f76c0e6687c0cc6fc562cb902e4a64e42b37;hpb=a94aedbc11829470cce77eb52969601d618054d6 diff --git a/stat.c b/stat.c index 82e79dfc..1a9c553b 100644 --- a/stat.c +++ b/stat.c @@ -14,6 +14,7 @@ #include "lib/output_buffer.h" #include "helper_thread.h" #include "smalloc.h" +#include "zbd.h" #define LOG_MSEC_SLACK 1 @@ -419,7 +420,7 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts, unsigned long runt; unsigned long long min, max, bw, iops; double mean, dev; - char *io_p, *bw_p, *bw_p_alt, *iops_p; + char *io_p, *bw_p, *bw_p_alt, *iops_p, *zbd_w_st = NULL; int i2p; if (ddir_sync(ddir)) { @@ -450,12 +451,16 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts, iops = (1000 * (uint64_t)ts->total_io_u[ddir]) / runt; iops_p = num2str(iops, ts->sig_figs, 1, 0, N2S_NONE); + if (ddir == DDIR_WRITE) + zbd_w_st = zbd_write_status(ts); - log_buf(out, " %s: IOPS=%s, BW=%s (%s)(%s/%llumsec)\n", + log_buf(out, " %s: IOPS=%s, BW=%s (%s)(%s/%llumsec)%s\n", rs->unified_rw_rep ? "mixed" : str[ddir], iops_p, bw_p, bw_p_alt, io_p, - (unsigned long long) ts->runtime[ddir]); + (unsigned long long) ts->runtime[ddir], + zbd_w_st ? : ""); + free(zbd_w_st); free(io_p); free(bw_p); free(bw_p_alt); @@ -1205,7 +1210,7 @@ static void show_thread_status_terse_all(struct thread_stat *ts, log_buf(out, ";%3.2f%%", io_u_lat_m[i]); /* disk util stats, if any */ - if (ver >= 3) + if (ver >= 3 && is_running_backend()) show_disk_util(1, NULL, out); /* Additional output if continue_on_error set - default off*/ @@ -1655,6 +1660,7 @@ void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, dst->total_run_time += src->total_run_time; dst->total_submit += src->total_submit; dst->total_complete += src->total_complete; + dst->nr_zone_resets += src->nr_zone_resets; } void init_group_run_stat(struct group_run_stats *gs) @@ -1922,6 +1928,8 @@ void __show_run_stats(void) if (is_backend) { fio_server_send_job_options(opt_lists[i], i); fio_server_send_ts(ts, rs); + if (output_format & FIO_OUTPUT_TERSE) + show_thread_status_terse(ts, rs, &output[__FIO_OUTPUT_TERSE]); } else { if (output_format & FIO_OUTPUT_TERSE) show_thread_status_terse(ts, rs, &output[__FIO_OUTPUT_TERSE]); @@ -2335,6 +2343,7 @@ void reset_io_stats(struct thread_data *td) ts->total_submit = 0; ts->total_complete = 0; + ts->nr_zone_resets = 0; } static void __add_stat_to_log(struct io_log *iolog, enum fio_ddir ddir, @@ -2466,11 +2475,13 @@ void add_clat_sample(struct thread_data *td, enum fio_ddir ddir, unsigned long long nsec, unsigned long long bs, uint64_t offset) { + const bool needs_lock = td_async_processing(td); unsigned long elapsed, this_window; struct thread_stat *ts = &td->ts; struct io_log *iolog = td->clat_hist_log; - td_io_u_lock(td); + if (needs_lock) + __td_io_u_lock(td); add_stat_sample(&ts->clat_stat[ddir], nsec); @@ -2519,37 +2530,43 @@ void add_clat_sample(struct thread_data *td, enum fio_ddir ddir, } } - td_io_u_unlock(td); + if (needs_lock) + __td_io_u_unlock(td); } void add_slat_sample(struct thread_data *td, enum fio_ddir ddir, unsigned long usec, unsigned long long bs, uint64_t offset) { + const bool needs_lock = td_async_processing(td); struct thread_stat *ts = &td->ts; if (!ddir_rw(ddir)) return; - td_io_u_lock(td); + if (needs_lock) + __td_io_u_lock(td); add_stat_sample(&ts->slat_stat[ddir], usec); if (td->slat_log) add_log_sample(td, td->slat_log, sample_val(usec), ddir, bs, offset); - td_io_u_unlock(td); + if (needs_lock) + __td_io_u_unlock(td); } void add_lat_sample(struct thread_data *td, enum fio_ddir ddir, unsigned long long nsec, unsigned long long bs, uint64_t offset) { + const bool needs_lock = td_async_processing(td); struct thread_stat *ts = &td->ts; if (!ddir_rw(ddir)) return; - td_io_u_lock(td); + if (needs_lock) + __td_io_u_lock(td); add_stat_sample(&ts->lat_stat[ddir], nsec); @@ -2560,12 +2577,14 @@ void add_lat_sample(struct thread_data *td, enum fio_ddir ddir, if (ts->lat_percentiles) add_clat_percentile_sample(ts, nsec, ddir); - td_io_u_unlock(td); + if (needs_lock) + __td_io_u_unlock(td); } void add_bw_sample(struct thread_data *td, struct io_u *io_u, unsigned int bytes, unsigned long long spent) { + const bool needs_lock = td_async_processing(td); struct thread_stat *ts = &td->ts; unsigned long rate; @@ -2574,7 +2593,8 @@ void add_bw_sample(struct thread_data *td, struct io_u *io_u, else rate = 0; - td_io_u_lock(td); + if (needs_lock) + __td_io_u_lock(td); add_stat_sample(&ts->bw_stat[io_u->ddir], rate); @@ -2583,7 +2603,9 @@ void add_bw_sample(struct thread_data *td, struct io_u *io_u, bytes, io_u->offset); td->stat_io_bytes[io_u->ddir] = td->this_io_bytes[io_u->ddir]; - td_io_u_unlock(td); + + if (needs_lock) + __td_io_u_unlock(td); } static int __add_samples(struct thread_data *td, struct timespec *parent_tv, @@ -2592,6 +2614,7 @@ static int __add_samples(struct thread_data *td, struct timespec *parent_tv, struct io_stat *stat, struct io_log *log, bool is_kb) { + const bool needs_lock = td_async_processing(td); unsigned long spent, rate; enum fio_ddir ddir; unsigned long next, next_log; @@ -2602,7 +2625,8 @@ static int __add_samples(struct thread_data *td, struct timespec *parent_tv, if (spent < avg_time && avg_time - spent >= LOG_MSEC_SLACK) return avg_time - spent; - td_io_u_lock(td); + if (needs_lock) + __td_io_u_lock(td); /* * Compute both read and write rates for the interval. @@ -2639,7 +2663,8 @@ static int __add_samples(struct thread_data *td, struct timespec *parent_tv, timespec_add_msec(parent_tv, avg_time); - td_io_u_unlock(td); + if (needs_lock) + __td_io_u_unlock(td); if (spent <= avg_time) next = avg_time; @@ -2659,9 +2684,11 @@ static int add_bw_samples(struct thread_data *td, struct timespec *t) void add_iops_sample(struct thread_data *td, struct io_u *io_u, unsigned int bytes) { + const bool needs_lock = td_async_processing(td); struct thread_stat *ts = &td->ts; - td_io_u_lock(td); + if (needs_lock) + __td_io_u_lock(td); add_stat_sample(&ts->iops_stat[io_u->ddir], 1); @@ -2670,7 +2697,9 @@ void add_iops_sample(struct thread_data *td, struct io_u *io_u, bytes, io_u->offset); td->stat_io_blocks[io_u->ddir] = td->this_io_blocks[io_u->ddir]; - td_io_u_unlock(td); + + if (needs_lock) + __td_io_u_unlock(td); } static int add_iops_samples(struct thread_data *td, struct timespec *t)