From 079ad09b1ef22fa0d47c2cd2673908c5619aa41a Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 20 Feb 2007 13:58:20 +0100 Subject: [PATCH] First step for group reporting Put most of the stats into a dedicated structure, so we can later share such a structure between threads. Signed-off-by: Jens Axboe --- fio.c | 20 ++++++++-------- fio.h | 51 +++++++++++++++++++++-------------------- init.c | 12 +++++----- stat.c | 72 ++++++++++++++++++++++++++++++++-------------------------- 4 files changed, 83 insertions(+), 72 deletions(-) diff --git a/fio.c b/fio.c index 45965444..e4fec4f6 100644 --- a/fio.c +++ b/fio.c @@ -597,7 +597,7 @@ static void clear_io_state(struct thread_data *td) struct fio_file *f; int i; - td->stat_io_bytes[0] = td->stat_io_bytes[1] = 0; + td->ts.stat_io_bytes[0] = td->ts.stat_io_bytes[1] = 0; td->this_io_bytes[0] = td->this_io_bytes[1] = 0; td->zone_bytes = 0; @@ -686,15 +686,15 @@ static void *thread_main(void *data) } fio_gettime(&td->epoch, NULL); - getrusage(RUSAGE_SELF, &td->ru_start); + getrusage(RUSAGE_SELF, &td->ts.ru_start); runtime[0] = runtime[1] = 0; while (td->loops--) { fio_gettime(&td->start, NULL); - memcpy(&td->stat_sample_time, &td->start, sizeof(td->start)); + memcpy(&td->ts.stat_sample_time, &td->start, sizeof(td->start)); if (td->ratemin) - memcpy(&td->lastrate, &td->stat_sample_time, sizeof(td->lastrate)); + memcpy(&td->lastrate, &td->ts.stat_sample_time, sizeof(td->lastrate)); clear_io_state(td); prune_io_piece_log(td); @@ -730,12 +730,12 @@ static void *thread_main(void *data) td->runtime[0] = runtime[0] / 1000; td->runtime[1] = runtime[1] / 1000; - if (td->bw_log) - finish_log(td, td->bw_log, "bw"); - if (td->slat_log) - finish_log(td, td->slat_log, "slat"); - if (td->clat_log) - finish_log(td, td->clat_log, "clat"); + if (td->ts.bw_log) + finish_log(td, td->ts.bw_log, "bw"); + if (td->ts.slat_log) + finish_log(td, td->ts.slat_log, "slat"); + if (td->ts.clat_log) + finish_log(td, td->ts.clat_log, "clat"); if (td->write_iolog_file) write_iolog_close(td); if (td->exec_postrun) { diff --git a/fio.h b/fio.h index 259166fc..38de5e3d 100644 --- a/fio.h +++ b/fio.h @@ -225,6 +225,31 @@ struct fio_file { unsigned int unlink; }; +struct thread_stat { + struct io_log *slat_log; + struct io_log *clat_log; + struct io_log *bw_log; + + /* + * bandwidth and latency stats + */ + struct io_stat clat_stat[2]; /* completion latency */ + struct io_stat slat_stat[2]; /* submission latency */ + struct io_stat bw_stat[2]; /* bandwidth stats */ + + unsigned long long stat_io_bytes[2]; + struct timeval stat_sample_time[2]; + + /* + * fio system usage accounting + */ + struct rusage ru_start; + struct rusage ru_end; + unsigned long usr_time; + unsigned long sys_time; + unsigned long ctx; +}; + /* * How many depth levels to log */ @@ -243,6 +268,7 @@ struct thread_data { pthread_t thread; int thread_number; int groupid; + struct thread_stat ts; enum fio_filetype filetype; struct fio_file *files; unsigned int nr_files; @@ -357,8 +383,8 @@ struct thread_data { unsigned long io_issues[2]; unsigned long long io_blocks[2]; unsigned long long io_bytes[2]; - unsigned long long zone_bytes; unsigned long long this_io_bytes[2]; + unsigned long long zone_bytes; volatile int mutex; /* @@ -372,33 +398,10 @@ struct thread_data { unsigned int cpuload; unsigned int cpucycle; - /* - * bandwidth and latency stats - */ - struct io_stat clat_stat[2]; /* completion latency */ - struct io_stat slat_stat[2]; /* submission latency */ - struct io_stat bw_stat[2]; /* bandwidth stats */ - - unsigned long long stat_io_bytes[2]; - struct timeval stat_sample_time[2]; - - struct io_log *slat_log; - struct io_log *clat_log; - struct io_log *bw_log; - struct timeval start; /* start of this loop */ struct timeval epoch; /* time job was started */ struct timeval end_time;/* time job ended */ - /* - * fio system usage accounting - */ - struct rusage ru_start; - struct rusage ru_end; - unsigned long usr_time; - unsigned long sys_time; - unsigned long ctx; - /* * read/write mixed workload state */ diff --git a/init.c b/init.c index 744ae854..6dc221ea 100644 --- a/init.c +++ b/init.c @@ -752,9 +752,9 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num) fio_sem_init(&td->mutex, 0); - td->clat_stat[0].min_val = td->clat_stat[1].min_val = ULONG_MAX; - td->slat_stat[0].min_val = td->slat_stat[1].min_val = ULONG_MAX; - td->bw_stat[0].min_val = td->bw_stat[1].min_val = ULONG_MAX; + td->ts.clat_stat[0].min_val = td->ts.clat_stat[1].min_val = ULONG_MAX; + td->ts.slat_stat[0].min_val = td->ts.slat_stat[1].min_val = ULONG_MAX; + td->ts.bw_stat[0].min_val = td->ts.bw_stat[1].min_val = ULONG_MAX; if (td->stonewall && td->thread_number > 1) groupid++; @@ -765,11 +765,11 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num) goto err; if (td->write_lat_log) { - setup_log(&td->slat_log); - setup_log(&td->clat_log); + setup_log(&td->ts.slat_log); + setup_log(&td->ts.clat_log); } if (td->write_bw_log) - setup_log(&td->bw_log); + setup_log(&td->ts.bw_log); if (!td->name) td->name = strdup(jobname); diff --git a/stat.c b/stat.c index 819a7c68..337b45fd 100644 --- a/stat.c +++ b/stat.c @@ -310,13 +310,15 @@ void disk_util_timer_arm(void) void update_rusage_stat(struct thread_data *td) { - getrusage(RUSAGE_SELF, &td->ru_end); + struct thread_stat *ts = &td->ts; - td->usr_time += mtime_since(&td->ru_start.ru_utime, &td->ru_end.ru_utime); - td->sys_time += mtime_since(&td->ru_start.ru_stime, &td->ru_end.ru_stime); - td->ctx += td->ru_end.ru_nvcsw + td->ru_end.ru_nivcsw - (td->ru_start.ru_nvcsw + td->ru_start.ru_nivcsw); + getrusage(RUSAGE_SELF, &ts->ru_end); + + ts->usr_time += mtime_since(&ts->ru_start.ru_utime, &ts->ru_end.ru_utime); + ts->sys_time += mtime_since(&ts->ru_start.ru_stime, &ts->ru_end.ru_stime); + ts->ctx += ts->ru_end.ru_nvcsw + ts->ru_end.ru_nivcsw - (ts->ru_start.ru_nvcsw + ts->ru_start.ru_nivcsw); - memcpy(&td->ru_start, &td->ru_end, sizeof(td->ru_end)); + memcpy(&ts->ru_start, &ts->ru_end, sizeof(ts->ru_end)); } static int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, @@ -402,6 +404,7 @@ static void show_ddir_status(struct thread_data *td, struct group_run_stats *rs, int ddir) { const char *ddir_str[] = { "read ", "write" }; + struct thread_stat *ts; unsigned long min, max; unsigned long long bw; double mean, dev; @@ -419,13 +422,14 @@ static void show_ddir_status(struct thread_data *td, struct group_run_stats *rs, free(io_p); free(bw_p); - if (calc_lat(&td->slat_stat[ddir], &min, &max, &mean, &dev)) + ts = &td->ts; + if (calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev)) fprintf(f_out, " slat (msec): min=%5lu, max=%5lu, avg=%5.02f, stdev=%5.02f\n", min, max, mean, dev); - if (calc_lat(&td->clat_stat[ddir], &min, &max, &mean, &dev)) + if (calc_lat(&ts->clat_stat[ddir], &min, &max, &mean, &dev)) fprintf(f_out, " clat (msec): min=%5lu, max=%5lu, avg=%5.02f, stdev=%5.02f\n", min, max, mean, dev); - if (calc_lat(&td->bw_stat[ddir], &min, &max, &mean, &dev)) { + if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) { double p_of_agg; p_of_agg = mean * 100 / (double) rs->agg[ddir]; @@ -458,14 +462,14 @@ static void show_thread_status(struct thread_data *td, if (runtime) { double runt = (double) runtime; - usr_cpu = (double) td->usr_time * 100 / runt; - sys_cpu = (double) td->sys_time * 100 / runt; + usr_cpu = (double) td->ts.usr_time * 100 / runt; + sys_cpu = (double) td->ts.sys_time * 100 / runt; } else { usr_cpu = 0; sys_cpu = 0; } - fprintf(f_out, " cpu : usr=%3.2f%%, sys=%3.2f%%, ctx=%lu\n", usr_cpu, sys_cpu, td->ctx); + fprintf(f_out, " cpu : usr=%3.2f%%, sys=%3.2f%%, ctx=%lu\n", usr_cpu, sys_cpu, td->ts.ctx); /* * Do depth distribution calculations @@ -495,6 +499,7 @@ static void show_thread_status(struct thread_data *td, static void show_ddir_status_terse(struct thread_data *td, struct group_run_stats *rs, int ddir) { + struct thread_stat *ts = &td->ts; unsigned long min, max; unsigned long long bw; double mean, dev; @@ -505,17 +510,17 @@ static void show_ddir_status_terse(struct thread_data *td, fprintf(f_out, ",%llu,%llu,%lu", td->io_bytes[ddir] >> 10, bw, td->runtime[ddir]); - if (calc_lat(&td->slat_stat[ddir], &min, &max, &mean, &dev)) + if (calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev)) fprintf(f_out, ",%lu,%lu,%f,%f", min, max, mean, dev); else fprintf(f_out, ",%lu,%lu,%f,%f", 0UL, 0UL, 0.0, 0.0); - if (calc_lat(&td->clat_stat[ddir], &min, &max, &mean, &dev)) + if (calc_lat(&ts->clat_stat[ddir], &min, &max, &mean, &dev)) fprintf(f_out, ",%lu,%lu,%f,%f", min, max, mean, dev); else fprintf(f_out, ",%lu,%lu,%f,%f", 0UL, 0UL, 0.0, 0.0); - if (calc_lat(&td->bw_stat[ddir], &min, &max, &mean, &dev)) { + if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) { double p_of_agg; p_of_agg = mean * 100 / (double) rs->agg[ddir]; @@ -539,14 +544,14 @@ static void show_thread_status_terse(struct thread_data *td, if (td->runtime[0] + td->runtime[1]) { double runt = (double) (td->runtime[0] + td->runtime[1]); - usr_cpu = (double) td->usr_time * 100 / runt; - sys_cpu = (double) td->sys_time * 100 / runt; + usr_cpu = (double) td->ts.usr_time * 100 / runt; + sys_cpu = (double) td->ts.sys_time * 100 / runt; } else { usr_cpu = 0; sys_cpu = 0; } - fprintf(f_out, ",%f%%,%f%%,%lu\n", usr_cpu, sys_cpu, td->ctx); + fprintf(f_out, ",%f%%,%f%%,%lu\n", usr_cpu, sys_cpu, td->ts.ctx); } void show_run_stats(void) @@ -682,38 +687,41 @@ void add_agg_sample(unsigned long val, enum fio_ddir ddir) void add_clat_sample(struct thread_data *td, enum fio_ddir ddir, unsigned long msec) { - add_stat_sample(&td->clat_stat[ddir], msec); + struct thread_stat *ts = &td->ts; + + add_stat_sample(&ts->clat_stat[ddir], msec); - if (td->clat_log) - add_log_sample(td, td->clat_log, msec, ddir); + if (ts->clat_log) + add_log_sample(td, ts->clat_log, msec, ddir); } void add_slat_sample(struct thread_data *td, enum fio_ddir ddir, unsigned long msec) { - add_stat_sample(&td->slat_stat[ddir], msec); + struct thread_stat *ts = &td->ts; + + add_stat_sample(&ts->slat_stat[ddir], msec); - if (td->slat_log) - add_log_sample(td, td->slat_log, msec, ddir); + if (ts->slat_log) + add_log_sample(td, ts->slat_log, msec, ddir); } void add_bw_sample(struct thread_data *td, enum fio_ddir ddir, struct timeval *t) { - unsigned long spent = mtime_since(&td->stat_sample_time[ddir], t); + struct thread_stat *ts = &td->ts; + unsigned long spent = mtime_since(&ts->stat_sample_time[ddir], t); unsigned long rate; if (spent < td->bw_avg_time) return; - rate = (td->this_io_bytes[ddir] - td->stat_io_bytes[ddir]) / spent; - add_stat_sample(&td->bw_stat[ddir], rate); + rate = (td->this_io_bytes[ddir] - ts->stat_io_bytes[ddir]) / spent; + add_stat_sample(&ts->bw_stat[ddir], rate); - if (td->bw_log) - add_log_sample(td, td->bw_log, rate, ddir); + if (ts->bw_log) + add_log_sample(td, ts->bw_log, rate, ddir); - fio_gettime(&td->stat_sample_time[ddir], NULL); - td->stat_io_bytes[ddir] = td->this_io_bytes[ddir]; + fio_gettime(&ts->stat_sample_time[ddir], NULL); + ts->stat_io_bytes[ddir] = td->this_io_bytes[ddir]; } - - -- 2.25.1