void print_netstat() { int i; uint64_t op, ip, ob, ib; double t; (void) printf("\nNetstat statistics for this run\n"); #ifdef HAVE_LIBKSTAT if (state_changed == 1) { (void) printf(WARNSTR); } #endif /* HAVE_LIBKSTAT */ (void) uperf_line(); (void) printf("%-5s %10s %10s %11s %11s\n", "Nic", "opkts/s", "ipkts/s", "obits/s", "ibits/s"); for (i = 0; i < no_nics; i++) { op = nics[i].s[1].tx_pkts - nics[i].s[0].tx_pkts; ip = nics[i].s[1].rx_pkts - nics[i].s[0].rx_pkts; ib = nics[i].s[1].rx_bytes - nics[i].s[0].rx_bytes; ob = nics[i].s[1].tx_bytes - nics[i].s[0].tx_bytes; t = (nics[i].s[1].stamp - nics[i].s[0].stamp)/1.0e+9; if (ip == 0 && op == 0) continue; (void) printf("%-5s %10.0f %10.0f ", nics[i].interface, op/t, ip/t); PRINT_NUMb(ob*8/t, 11); printf(" "); PRINT_NUMb(ib*8/t, 11); printf("\n"); } (void) uperf_line(); }
static int master_poll(uperf_shm_t *shm) { int no_txn; int error; int curr_txn = 0; barrier_t *curr_bar; double time_to_print; newstats_t prev_ns; bzero(&prev_ns, sizeof (prev_ns)); no_txn = workorder_max_txn(shm->workorder); shm->current_time = GETHRTIME(); time_to_print = shm->current_time; /* * The main event loop. It runs roughly at options.interval * frequency. * We come out of the loop if any of the following is true * 1. If slaves send anything (they should not in normal circumstances) * 2. All Transactions except the last one are complete * 3. Error */ while (curr_txn < no_txn) { curr_bar = &shm->bar[curr_txn]; if (shm->global_error > 0) { break; } error = poll_slaves(); if (error != 0) { /* msg arrived */ /* Read slave msg and process it */ (void) printf("\n*** Slave aborted! ***\n"); shm->global_error++; break; } shm->current_time = GETHRTIME(); shm_process_callouts(shm); if (BARRIER_REACHED(curr_bar)) { /* goto Next Txn */ if (ENABLED_STATS(options)) { if (curr_txn != 0) { print_progress(shm, prev_ns); (void) printf("\n"); } update_aggr_stat(shm); (void) memcpy(&prev_ns, AGG_STAT(shm), sizeof (prev_ns)); prev_ns.end_time = GETHRTIME(); (void) snprintf(prev_ns.name, sizeof (prev_ns.name), "Txn%d", curr_txn + 1); } /* * Ask slaves to begin curr_txn Ok to ignore * return value as number of transactions * per group may not be the same */ (void) send_command_to_slaves(UPERF_CMD_NEXT_TXN, curr_txn); /* release barrier so master can also begin curr_txn */ shm->txn_begin = GETHRTIME(); unlock_barrier(curr_bar); curr_txn++; } shm->current_time = GETHRTIME(); if (ENABLED_STATS(options) && (time_to_print <= shm->current_time)) { print_progress(shm, prev_ns); time_to_print = shm->current_time + options.interval * 1.0e+6; } } while (shm->global_error == 0 && shm->finished == 0) { shm_process_callouts(shm); print_progress(shm, prev_ns); (void) poll(NULL, 0, 100); } if (ENABLED_STATS(options)) { (void) printf("\n"); uperf_line(); } if (shm->global_error > 0) { master_prepare_to_exit(shm); return (1); } if (ENABLED_ERROR_STATS(options)) { return (send_command_to_slaves(UPERF_CMD_SEND_STATS, 0)); } else { return (0); } }