X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=stat.c;h=7bcae310f8d41bb388abc1af6b773b6125ea0492;hp=564edf342014bd07d4f61f99c09aa57c63f6f731;hb=b1d1b239d2a3299a4d7b7b3de185923c655d0a48;hpb=f6bb5b88614073878cbbd2666a1553481720faee diff --git a/stat.c b/stat.c index 564edf34..7bcae310 100644 --- a/stat.c +++ b/stat.c @@ -9,6 +9,7 @@ #include "fio.h" #include "diskutil.h" +#include "ieee754.h" void update_rusage_stat(struct thread_data *td) { @@ -101,13 +102,13 @@ static unsigned int plat_idx_to_val(unsigned int idx) static int double_cmp(const void *a, const void *b) { - const double fa = *(const double *)a; - const double fb = *(const double *)b; + const fio_fp64_t fa = *(const fio_fp64_t *) a; + const fio_fp64_t fb = *(const fio_fp64_t *) b; int cmp = 0; - if (fa > fb) + if (fa.u.f > fb.u.f) cmp = 1; - else if (fa < fb) + else if (fa.u.f < fb.u.f) cmp = -1; return cmp; @@ -116,38 +117,31 @@ static int double_cmp(const void *a, const void *b) /* * Find and display the p-th percentile of clat */ -static void show_clat_percentiles(unsigned int* io_u_plat, unsigned long nr, - double* user_list) +static void show_clat_percentiles(unsigned int *io_u_plat, unsigned long nr, + fio_fp64_t *plist) { unsigned long sum = 0; unsigned int len, i, j = 0; - const double *plist; int is_last = 0; - static const double def_list[FIO_IO_U_LIST_MAX_LEN] = { - 1.0, 5.0, 10.0, 20.0, 30.0, - 40.0, 50.0, 60.0, 70.0, 80.0, - 90.0, 95.0, 99.0, 99.5, 99.9}; - plist = user_list; - if (!plist) - plist = def_list; - - for (len = 0; len 1) - qsort((void*)user_list, len, sizeof(user_list[0]), double_cmp); + if (len > 1) + qsort((void*)plist, len, sizeof(plist[0]), double_cmp); log_info(" clat percentiles (usec) :"); for (i = 0; i < FIO_IO_U_PLAT_NR && !is_last; i++) { sum += io_u_plat[i]; - while (sum >= (plist[j] / 100 * nr)) { - assert(plist[j] <= 100.0); + while (sum >= (plist[j].u.f / 100.0 * nr)) { + assert(plist[j].u.f <= 100.0); /* for formatting */ if (j != 0 && (j % 4) == 0) @@ -181,23 +175,23 @@ static int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, *max = is->max_val; n = (double) is->samples; - *mean = is->mean; + *mean = is->mean.u.f; if (n > 1.0) - *dev = sqrt(is->S / (n - 1.0)); + *dev = sqrt(is->S.u.f / (n - 1.0)); else *dev = 0; return 1; } -static void show_group_stats(struct group_run_stats *rs, int id) +void show_group_stats(struct group_run_stats *rs) { char *p1, *p2, *p3, *p4; const char *ddir_str[] = { " READ", " WRITE" }; int i; - log_info("\nRun status group %d (all jobs):\n", id); + log_info("\nRun status group %d (all jobs):\n", rs->groupid); for (i = 0; i <= DDIR_WRITE; i++) { const int i2p = is_power_of_2(rs->kb_base); @@ -433,8 +427,7 @@ static void show_latencies(double *io_u_lat_u, double *io_u_lat_m) log_info("\n"); } -static void show_thread_status(struct thread_stat *ts, - struct group_run_stats *rs) +void show_thread_status(struct thread_stat *ts, struct group_run_stats *rs) { double usr_cpu, sys_cpu; unsigned long runtime; @@ -630,23 +623,23 @@ static void sum_stat(struct io_stat *dst, struct io_stat *src, int nr) * #Parallel_algorithm> */ if (nr == 1) { - mean = src->mean; - S = src->S; + mean = src->mean.u.f; + S = src->S.u.f; } else { - double delta = src->mean - dst->mean; + double delta = src->mean.u.f - dst->mean.u.f; - mean = ((src->mean * src->samples) + - (dst->mean * dst->samples)) / + mean = ((src->mean.u.f * src->samples) + + (dst->mean.u.f * dst->samples)) / (dst->samples + src->samples); - S = src->S + dst->S + pow(delta, 2.0) * + S = src->S.u.f + dst->S.u.f + pow(delta, 2.0) * (dst->samples * src->samples) / (dst->samples + src->samples); } dst->samples += src->samples; - dst->mean = mean; - dst->S = S; + dst->mean.u.f = mean; + dst->S.u.f = S; } void show_run_stats(void) @@ -716,9 +709,9 @@ void show_run_stats(void) ts->clat_percentiles = td->o.clat_percentiles; if (td->o.overwrite_plist) - ts->percentile_list = td->o.percentile_list; + memcpy(ts->percentile_list, td->o.percentile_list, sizeof(td->o.percentile_list)); else - ts->percentile_list = NULL; + memcpy(ts->percentile_list, def_percentile_list, sizeof(def_percentile_list)); idx++; ts->members++; @@ -728,8 +721,12 @@ void show_run_stats(void) * These are per-group shared already */ strncpy(ts->name, td->o.name, FIO_JOBNAME_SIZE); - strncpy(ts->description, td->o.description, - FIO_JOBNAME_SIZE); + if (td->o.description) + strncpy(ts->description, td->o.description, + FIO_JOBNAME_SIZE); + else + memset(ts->description, 0, FIO_JOBNAME_SIZE); + ts->groupid = td->groupid; /* @@ -858,15 +855,24 @@ void show_run_stats(void) ts = &threadstats[i]; rs = &runstats[ts->groupid]; - if (terse_output) + if (is_backend) + fio_server_send_ts(ts, rs); + else if (terse_output) show_thread_status_terse(ts, rs); else show_thread_status(ts, rs); } if (!terse_output) { - for (i = 0; i < groupid + 1; i++) - show_group_stats(&runstats[i], i); + for (i = 0; i < groupid + 1; i++) { + rs = &runstats[i]; + + rs->groupid = i; + if (is_backend) + fio_server_send_gs(rs); + else + show_group_stats(rs); + } show_disk_util(); } @@ -885,10 +891,10 @@ static inline void add_stat_sample(struct io_stat *is, unsigned long data) if (data < is->min_val) is->min_val = data; - delta = val - is->mean; + delta = val - is->mean.u.f; if (delta) { - is->mean += delta / (is->samples + 1.0); - is->S += delta * (val - is->mean); + is->mean.u.f += delta / (is->samples + 1.0); + is->S.u.f += delta * (val - is->mean.u.f); } is->samples++;