Show user/system CPU usage as well as total.

This commit is contained in:
Jef Poskanzer 2013-11-26 14:47:15 -08:00
parent fba44572d7
commit 056361fc5d
7 changed files with 37 additions and 16 deletions

View File

@ -179,8 +179,8 @@ struct iperf_test
Timer *stats_timer; Timer *stats_timer;
Timer *reporter_timer; Timer *reporter_timer;
double cpu_util; /* cpu utilization of the test */ double cpu_util[3]; /* cpu utilization of the test - total, user, system */
double remote_cpu_util; /* cpu utilization for the remote host/client */ double remote_cpu_util[3]; /* cpu utilization for the remote host/client - total, user, system */
int num_streams; /* total streams in the test (-P) */ int num_streams; /* total streams in the test (-P) */

View File

@ -1102,7 +1102,9 @@ send_results(struct iperf_test *test)
i_errno = IEPACKAGERESULTS; i_errno = IEPACKAGERESULTS;
r = -1; r = -1;
} else { } else {
cJSON_AddFloatToObject(j, "cpu_util", test->cpu_util); cJSON_AddFloatToObject(j, "cpu_util_total", test->cpu_util[0]);
cJSON_AddFloatToObject(j, "cpu_util_user", test->cpu_util[1]);
cJSON_AddFloatToObject(j, "cpu_util_system", test->cpu_util[2]);
if ( ! test->sender ) if ( ! test->sender )
sender_has_retransmits = -1; sender_has_retransmits = -1;
else else
@ -1148,7 +1150,9 @@ get_results(struct iperf_test *test)
{ {
int r = 0; int r = 0;
cJSON *j; cJSON *j;
cJSON *j_cpu_util; cJSON *j_cpu_util_total;
cJSON *j_cpu_util_user;
cJSON *j_cpu_util_system;
cJSON *j_sender_has_retransmits; cJSON *j_sender_has_retransmits;
int result_has_retransmits; int result_has_retransmits;
cJSON *j_streams; cJSON *j_streams;
@ -1171,13 +1175,17 @@ get_results(struct iperf_test *test)
i_errno = IERECVRESULTS; i_errno = IERECVRESULTS;
r = -1; r = -1;
} else { } else {
j_cpu_util = cJSON_GetObjectItem(j, "cpu_util"); j_cpu_util_total = cJSON_GetObjectItem(j, "cpu_util_total");
j_cpu_util_user = cJSON_GetObjectItem(j, "cpu_util_user");
j_cpu_util_system = cJSON_GetObjectItem(j, "cpu_util_system");
j_sender_has_retransmits = cJSON_GetObjectItem(j, "sender_has_retransmits"); j_sender_has_retransmits = cJSON_GetObjectItem(j, "sender_has_retransmits");
if (j_cpu_util == NULL || j_sender_has_retransmits == NULL) { if (j_cpu_util_total == NULL || j_cpu_util_user == NULL || j_cpu_util_system == NULL || j_sender_has_retransmits == NULL) {
i_errno = IERECVRESULTS; i_errno = IERECVRESULTS;
r = -1; r = -1;
} else { } else {
test->remote_cpu_util = j_cpu_util->valuefloat; test->remote_cpu_util[0] = j_cpu_util_total->valuefloat;
test->remote_cpu_util[1] = j_cpu_util_user->valuefloat;
test->remote_cpu_util[2] = j_cpu_util_system->valuefloat;
result_has_retransmits = j_sender_has_retransmits->valueint; result_has_retransmits = j_sender_has_retransmits->valueint;
if (! test->sender) if (! test->sender)
test->sender_has_retransmits = result_has_retransmits; test->sender_has_retransmits = result_has_retransmits;
@ -1833,9 +1841,9 @@ iperf_print_results(struct iperf_test *test)
} }
if (test->json_output) if (test->json_output)
cJSON_AddItemToObject(test->json_end, "cpu_utilization_percent", iperf_json_printf("host: %f remote: %f", (double) test->cpu_util, (double) test->remote_cpu_util)); cJSON_AddItemToObject(test->json_end, "cpu_utilization_percent", iperf_json_printf("host_total: %f host_user: %f host_system: %f remote_total: %f remote_user: %f remote_system: %f", (double) test->cpu_util[0], (double) test->cpu_util[1], (double) test->cpu_util[2], (double) test->remote_cpu_util[0], (double) test->remote_cpu_util[1], (double) test->remote_cpu_util[2]));
else if (test->verbose) else if (test->verbose)
iprintf(test, report_cpu, report_local, test->sender?report_sender:report_receiver, test->cpu_util, report_remote, test->sender?report_receiver:report_sender, test->remote_cpu_util); iprintf(test, report_cpu, report_local, test->sender?report_sender:report_receiver, test->cpu_util[0], test->cpu_util[1], test->cpu_util[2], report_remote, test->sender?report_receiver:report_sender, test->remote_cpu_util[0], test->remote_cpu_util[1], test->remote_cpu_util[2]);
} }
/**************************************************************************/ /**************************************************************************/

View File

@ -438,7 +438,7 @@ iperf_run_client(struct iperf_test * test)
continue; /* not done */ continue; /* not done */
} }
/* Yes, done! Send TEST_END. */ /* Yes, done! Send TEST_END. */
cpu_util(&test->cpu_util); cpu_util(test->cpu_util);
test->stats_callback(test); test->stats_callback(test);
if (iperf_set_send_state(test, TEST_END) != 0) if (iperf_set_send_state(test, TEST_END) != 0)
return -1; return -1;

View File

@ -181,7 +181,7 @@ iperf_handle_message_server(struct iperf_test *test)
case TEST_START: case TEST_START:
break; break;
case TEST_END: case TEST_END:
cpu_util(&test->cpu_util); cpu_util(test->cpu_util);
test->stats_callback(test); test->stats_callback(test);
SLIST_FOREACH(sp, &test->streams, streams) { SLIST_FOREACH(sp, &test->streams, streams) {
FD_CLR(sp->socket, &test->read_set); FD_CLR(sp->socket, &test->read_set);

View File

@ -21,6 +21,7 @@
#include <sys/select.h> #include <sys/select.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/resource.h>
#include <time.h> #include <time.h>
#include <errno.h> #include <errno.h>
@ -157,27 +158,39 @@ delay(int us)
void void
cpu_util(double *pcpu) cpu_util(double pcpu[3])
{ {
static struct timeval last; static struct timeval last;
static clock_t clast; static clock_t clast;
static struct rusage rlast;
struct timeval temp; struct timeval temp;
clock_t ctemp; clock_t ctemp;
struct rusage rtemp;
double timediff; double timediff;
double userdiff;
double systemdiff;
if (pcpu == NULL) { if (pcpu == NULL) {
gettimeofday(&last, NULL); gettimeofday(&last, NULL);
clast = clock(); clast = clock();
getrusage(RUSAGE_SELF, &rlast);
return; return;
} }
gettimeofday(&temp, NULL); gettimeofday(&temp, NULL);
ctemp = clock(); ctemp = clock();
getrusage(RUSAGE_SELF, &rtemp);
timediff = ((temp.tv_sec * 1000000.0 + temp.tv_usec) - timediff = ((temp.tv_sec * 1000000.0 + temp.tv_usec) -
(last.tv_sec * 1000000.0 + last.tv_usec)); (last.tv_sec * 1000000.0 + last.tv_usec));
userdiff = ((rtemp.ru_utime.tv_sec * 1000000.0 + rtemp.ru_utime.tv_usec) -
(rlast.ru_utime.tv_sec * 1000000.0 + rlast.ru_utime.tv_usec));
systemdiff = ((rtemp.ru_stime.tv_sec * 1000000.0 + rtemp.ru_stime.tv_usec) -
(rlast.ru_stime.tv_sec * 1000000.0 + rlast.ru_stime.tv_usec));
*pcpu = ((ctemp - clast) / timediff) * 100; pcpu[0] = ((ctemp - clast) / timediff) * 100;
pcpu[1] = (userdiff / timediff) * 100;
pcpu[2] = (systemdiff / timediff) * 100;
} }
char* char*

View File

@ -24,7 +24,7 @@ double timeval_diff(struct timeval *tv0, struct timeval *tv1);
int delay(int64_t ns); int delay(int64_t ns);
void cpu_util(double *); void cpu_util(double pcpu[3]);
char* get_system_info(void); char* get_system_info(void);

View File

@ -279,7 +279,7 @@ const char reportCSV_peer[] =
"%s,%u,%s,%u"; "%s,%u,%s,%u";
const char report_cpu[] = const char report_cpu[] =
"CPU Utilization: %s/%s %.1f%%, %s/%s %.1f%%\n"; "CPU Utilization: %s/%s %.1f%% (%.1f%%u/%.1f%%s), %s/%s %.1f%% (%.1f%%u/%.1f%%s)\n";
const char report_local[] = "local"; const char report_local[] = "local";
const char report_remote[] = "remote"; const char report_remote[] = "remote";