-
- if (mlocked_mem) {
- if (munlock(mlocked_mem, mlock_size) < 0)
- perror("munlock");
- free(mlocked_mem);
- }
-}
-
-static void show_group_stats(struct group_run_stats *rs, int id)
-{
- printf("\nRun status group %d (all jobs):\n", id);
-
- if (rs->max_run[DDIR_READ])
- printf(" READ: io=%lluMiB, aggrb=%llu, minb=%llu, maxb=%llu, mint=%llumsec, maxt=%llumsec\n", rs->io_mb[0], rs->agg[0], rs->min_bw[0], rs->max_bw[0], rs->min_run[0], rs->max_run[0]);
- if (rs->max_run[DDIR_WRITE])
- printf(" WRITE: io=%lluMiB, aggrb=%llu, minb=%llu, maxb=%llu, mint=%llumsec, maxt=%llumsec\n", rs->io_mb[1], rs->agg[1], rs->min_bw[1], rs->max_bw[1], rs->min_run[1], rs->max_run[1]);
-}
-
-static void show_disk_util(void)
-{
- struct disk_util_stat *dus;
- struct list_head *entry;
- struct disk_util *du;
- double util;
-
- printf("\nDisk stats (read/write):\n");
-
- list_for_each(entry, &disk_list) {
- du = list_entry(entry, struct disk_util, list);
- dus = &du->dus;
-
- util = (double) 100 * du->dus.io_ticks / (double) du->msec;
- if (util > 100.0)
- util = 100.0;
-
- printf(" %s: ios=%u/%u, merge=%u/%u, ticks=%u/%u, in_queue=%u, util=%3.2f%%\n", du->name, dus->ios[0], dus->ios[1], dus->merges[0], dus->merges[1], dus->ticks[0], dus->ticks[1], dus->time_in_queue, util);
- }
-}
-
-static void show_run_stats(void)
-{
- struct group_run_stats *runstats, *rs;
- struct thread_data *td;
- int i;
-
- runstats = malloc(sizeof(struct group_run_stats) * (groupid + 1));
-
- for (i = 0; i < groupid + 1; i++) {
- rs = &runstats[i];
-
- memset(rs, 0, sizeof(*rs));
- rs->min_bw[0] = rs->min_run[0] = ~0UL;
- rs->min_bw[1] = rs->min_run[1] = ~0UL;
- }
-
- for (i = 0; i < thread_number; i++) {
- unsigned long rbw, wbw;
-
- td = &threads[i];
-
- if (td->error) {
- printf("Client%d: %s\n", td->thread_number, td->verror);
- continue;
- }
-
- rs = &runstats[td->groupid];
-
- if (td->runtime[0] < rs->min_run[0] || !rs->min_run[0])
- rs->min_run[0] = td->runtime[0];
- if (td->runtime[0] > rs->max_run[0])
- rs->max_run[0] = td->runtime[0];
- if (td->runtime[1] < rs->min_run[1] || !rs->min_run[1])
- rs->min_run[1] = td->runtime[1];
- if (td->runtime[1] > rs->max_run[1])
- rs->max_run[1] = td->runtime[1];
-
- rbw = wbw = 0;
- if (td->runtime[0])
- rbw = td->io_bytes[0] / td->runtime[0];
- if (td->runtime[1])
- wbw = td->io_bytes[1] / td->runtime[1];
-
- if (rbw < rs->min_bw[0])
- rs->min_bw[0] = rbw;
- if (wbw < rs->min_bw[1])
- rs->min_bw[1] = wbw;
- if (rbw > rs->max_bw[0])
- rs->max_bw[0] = rbw;
- if (wbw > rs->max_bw[1])
- rs->max_bw[1] = wbw;
-
- rs->io_mb[0] += td->io_bytes[0] >> 20;
- rs->io_mb[1] += td->io_bytes[1] >> 20;
- }
-
- for (i = 0; i < groupid + 1; i++) {
- rs = &runstats[i];
-
- if (rs->max_run[0])
- rs->agg[0] = (rs->io_mb[0]*1024*1000) / rs->max_run[0];
- if (rs->max_run[1])
- rs->agg[1] = (rs->io_mb[1]*1024*1000) / rs->max_run[1];
- }
-
- /*
- * don't overwrite last signal output
- */
- printf("\n");
-
- for (i = 0; i < thread_number; i++) {
- td = &threads[i];
- rs = &runstats[td->groupid];
-
- show_thread_status(td, rs);
- }
-
- for (i = 0; i < groupid + 1; i++)
- show_group_stats(&runstats[i], i);
-
- show_disk_util();