-static int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max,
- double *mean, double *dev)
-{
- double n;
-
- if (is->samples == 0)
- return 0;
-
- *min = is->min_val;
- *max = is->max_val;
-
- n = (double) is->samples;
- *mean = (double) is->val / n;
- *dev = sqrt(((double) is->val_sq - (*mean * *mean) / n) / (n - 1));
- if (!(*min + *max) && !(*mean + *dev))
- return 0;
-
- return 1;
-}
-
-static void show_ddir_status(struct thread_data *td, struct group_run_stats *rs,
- int ddir)
-{
- char *ddir_str[] = { "read ", "write" };
- unsigned long min, max, bw;
- double mean, dev;
-
- if (!td->runtime[ddir])
- return;
-
- bw = td->io_bytes[ddir] / td->runtime[ddir];
- printf(" %s: io=%6lluMiB, bw=%6luKiB/s, runt=%6lumsec\n", ddir_str[ddir], td->io_bytes[ddir] >> 20, bw, td->runtime[ddir]);
-
- if (calc_lat(&td->slat_stat[ddir], &min, &max, &mean, &dev))
- printf(" slat (msec): min=%5lu, max=%5lu, avg=%5.02f, dev=%5.02f\n", min, max, mean, dev);
-
- if (calc_lat(&td->clat_stat[ddir], &min, &max, &mean, &dev))
- printf(" clat (msec): min=%5lu, max=%5lu, avg=%5.02f, dev=%5.02f\n", min, max, mean, dev);
-
- if (calc_lat(&td->bw_stat[ddir], &min, &max, &mean, &dev)) {
- double p_of_agg;
-
- p_of_agg = mean * 100 / (double) rs->agg[ddir];
- printf(" bw (KiB/s) : min=%5lu, max=%5lu, per=%3.2f%%, avg=%5.02f, dev=%5.02f\n", min, max, p_of_agg, mean, dev);
- }
-}
-
-static void show_thread_status(struct thread_data *td,
- struct group_run_stats *rs)
-{
- double usr_cpu, sys_cpu;
-
- if (!(td->io_bytes[0] + td->io_bytes[1]) && !td->error)
- return;
-
- printf("Client%d (groupid=%d): err=%2d:\n", td->thread_number, td->groupid, td->error);
-
- show_ddir_status(td, rs, td->ddir);
- show_ddir_status(td, rs, td->ddir ^ 1);
-
- if (td->runtime[0] + td->runtime[1]) {
- double runt = td->runtime[0] + td->runtime[1];
-
- usr_cpu = (double) td->usr_time * 100 / runt;
- sys_cpu = (double) td->sys_time * 100 / runt;
- } else {
- usr_cpu = 0;
- sys_cpu = 0;
- }
-
- printf(" cpu : usr=%3.2f%%, sys=%3.2f%%, ctx=%lu\n", usr_cpu, sys_cpu, td->ctx);
-}
-
-static void check_str_update(struct thread_data *td)
-{
- char c = run_str[td->thread_number - 1];
-
- if (td->runstate == td->old_runstate)
- return;
-
- switch (td->runstate) {
- case TD_REAPED:
- c = '_';
- break;
- case TD_EXITED:
- c = 'E';
- break;
- case TD_RUNNING:
- if (td_read(td)) {
- if (td->sequential)
- c = 'R';
- else
- c = 'r';
- } else {
- if (td->sequential)
- c = 'W';
- else
- c = 'w';
- }
- break;
- case TD_VERIFYING:
- c = 'V';
- break;
- case TD_CREATED:
- c = 'C';
- break;
- case TD_NOT_CREATED:
- c = 'P';
- break;
- default:
- printf("state %d\n", td->runstate);
- }
-
- run_str[td->thread_number - 1] = c;
- td->old_runstate = td->runstate;
-}
-
-static void eta_to_str(char *str, int eta_sec)
-{
- unsigned int d, h, m, s;
- static int always_d, always_h;
-
- d = h = m = s = 0;
-
- s = eta_sec % 60;
- eta_sec /= 60;
- m = eta_sec % 60;
- eta_sec /= 60;
- h = eta_sec % 24;
- eta_sec /= 24;
- d = eta_sec;
-
- if (d || always_d) {
- always_d = 1;
- str += sprintf(str, "%02dd:", d);
- }
- if (h || always_h) {
- always_h = 1;
- str += sprintf(str, "%02dh:", h);
- }
-
- str += sprintf(str, "%02dm:", m);
- str += sprintf(str, "%02ds", s);
-}
-
-static void print_thread_status(void)
-{
- unsigned long long bytes_done, bytes_total;
- int i, nr_running, t_rate, m_rate, eta_sec;
- char eta_str[32];
- double perc;
-
- bytes_done = bytes_total = 0;
- nr_running = t_rate = m_rate = 0;
- for (i = 0; i < thread_number; i++) {
- struct thread_data *td = &threads[i];
-
- if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING){
- nr_running++;
- t_rate += td->rate;
- m_rate += td->ratemin;
- }
-
- bytes_total += td->total_io_size;
- if (td->verify)
- bytes_total += td->total_io_size;
-
- if (td->zone_size && td->zone_skip)
- bytes_total /= (td->zone_skip / td->zone_size);
-
- bytes_done += td->io_bytes[DDIR_READ] +td->io_bytes[DDIR_WRITE];
-
- check_str_update(td);
- }
-
- perc = 0;
- eta_sec = 0;
- if (bytes_total && bytes_done) {
- unsigned long runtime;
-
- perc = (double) bytes_done / (double) bytes_total;
- if (perc > 1.0)
- perc = 1.0;
-
- runtime = time_since_now(&genesis);
- if (runtime >= 5) {
- memset(eta_str, 0, sizeof(eta_str));
- eta_sec = (runtime * (1.0 / perc)) - runtime;
- eta_to_str(eta_str, eta_sec);
- }
-
- perc *= 100.0;
- }
-
- printf("Threads now running (%d)", nr_running);
- if (m_rate || t_rate)
- printf(", commitrate %d/%dKiB/sec", t_rate, m_rate);
- printf(": [%s] [%3.2f%% done]", run_str, perc);
- if (eta_sec)
- printf(" [eta %s]", eta_str);
- printf("\r");
- fflush(stdout);
-}
-