Rework tcpp output so that it generates a comma-delimited list of values,

optionally with a header if "-h" is passed.  Toast CPU time measurement
in the server for now.  Remove -C and -T, since we now always report
both connections/sec and Gb/sec.

MFC after:	1 week
Sponsored by:	Juniper Networks
This commit is contained in:
rwatson 2010-06-06 15:27:08 +00:00
parent a760c554f4
commit a4945a1273
4 changed files with 50 additions and 43 deletions

View File

@ -51,7 +51,7 @@
struct sockaddr_in remoteip; /* Base target address. */
struct sockaddr_in localipbase; /* Base local address, if -l. */
int cflag, lflag, mflag, pflag, sflag, tflag, Cflag, Mflag, Pflag, Tflag;
int cflag, hflag, lflag, mflag, pflag, sflag, tflag, Mflag, Pflag;
uint64_t bflag;
u_short rflag;
@ -61,7 +61,8 @@ usage(void)
fprintf(stderr, "client: tcpp"
" -c remoteIP"
" [-CPT]"
" [-h]"
" [-P]"
" [-M localIPcount]"
" [-l localIPbase]"
"\n\t"
@ -76,7 +77,7 @@ usage(void)
fprintf(stderr, "server: tcpp"
" -s"
" [-PT]"
" [-P]"
" [-l localIPbase]"
" [-m maxtcpsatonce]"
" [-p procs]"
@ -112,7 +113,7 @@ main(int argc, char *argv[])
rflag = BASEPORT_DEFAULT;
tflag = TCPS_DEFAULT;
Mflag = 1;
while ((ch = getopt(argc, argv, "b:c:l:m:p:r:st:CM:PT")) != -1) {
while ((ch = getopt(argc, argv, "b:c:hl:m:p:r:st:CM:PT")) != -1) {
switch (ch) {
case 'b':
ll = strtoll(optarg, &dummy, 10);
@ -127,6 +128,10 @@ main(int argc, char *argv[])
err(-1, "inet_aton: %s", optarg);
break;
case 'h':
hflag++;
break;
case 'l':
lflag++;
if (inet_aton(optarg, &localipbase.sin_addr) != 1)
@ -165,10 +170,6 @@ main(int argc, char *argv[])
tflag = ll;
break;
case 'C':
Cflag++;
break;
case 'M':
ll = strtoll(optarg, &dummy, 10);
if (*dummy != '\0' || ll <= 1)
@ -184,10 +185,6 @@ main(int argc, char *argv[])
errx(EX_USAGE, "-P current unsupported");
#endif
case 'T':
Tflag++;
break;
default:
usage();
}
@ -204,7 +201,7 @@ main(int argc, char *argv[])
usage();
/* Several flags are valid only on the client, disallow if server. */
if (sflag && (Cflag || Mflag > 1))
if (sflag && (hflag || Mflag > 1))
usage();
if (cflag)

View File

@ -30,8 +30,8 @@
#define TCPP_H
extern struct sockaddr_in localipbase, remoteip;
extern int cflag, lflag, mflag, pflag, sflag, tflag;
extern int Cflag, Iflag, Mflag, Pflag, Tflag;
extern int cflag, hflag, lflag, mflag, pflag, sflag, tflag;
extern int Iflag, Mflag, Pflag;
extern uint64_t bflag;
extern u_short rflag;

View File

@ -1,7 +1,11 @@
/*-
* Copyright (c) 2008-2009 Robert N. M. Watson
* Copyright (c) 2010 Juniper Networks, Inc.
* All rights reserved.
*
* This software was developed by Robert N. M. Watson under contract
* to Juniper Networks, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -337,33 +341,37 @@ tcpp_client(void)
if (failed)
errx(-1, "Too many errors");
printf("%jd bytes transferred in %jd.%09jd seconds\n",
(bflag * tflag * pflag), (intmax_t)ts_finish.tv_sec,
if (hflag)
printf("bytes,seconds,conn/s,Gb/s,user%%,nice%%,sys%%,"
"intr%%,idle%%\n");
/*
* Configuration parameters.
*/
printf("%jd,", bflag * tflag * pflag);
printf("%jd.%09jd,", (intmax_t)ts_finish.tv_sec,
(intmax_t)(ts_finish.tv_nsec));
if (Tflag)
printf("%d procs ", pflag);
if (Cflag) {
printf("%f cps%s", (double)(pflag * tflag)/
(ts_finish.tv_sec + ts_finish.tv_nsec * 1e-9),
Tflag ? " " : "\n");
} else {
printf("%f Gbps%s", (double)(bflag * tflag * pflag * 8) /
(ts_finish.tv_sec + ts_finish.tv_nsec * 1e-9) * 1e-9,
Tflag ? " " : "\n");
}
if (Tflag) {
ticks = 0;
for (i = 0; i < CPUSTATES; i++) {
cp_time_finish[i] -= cp_time_start[i];
ticks += cp_time_finish[i];
}
printf("user%% %lu nice%% %lu sys%% %lu intr%% %lu "
"idle%% %lu\n",
(100 * cp_time_finish[CP_USER]) / ticks,
(100 * cp_time_finish[CP_NICE]) / ticks,
(100 * cp_time_finish[CP_SYS]) / ticks,
(100 * cp_time_finish[CP_INTR]) / ticks,
(100 * cp_time_finish[CP_IDLE]) / ticks);
/*
* Effective transmit rates.
*/
printf("%f,", (double)(pflag * tflag)/
(ts_finish.tv_sec + ts_finish.tv_nsec * 1e-9));
printf("%f,", (double)(bflag * tflag * pflag * 8) /
(ts_finish.tv_sec + ts_finish.tv_nsec * 1e-9) * 1e-9);
/*
* CPU time (est).
*/
ticks = 0;
for (i = 0; i < CPUSTATES; i++) {
cp_time_finish[i] -= cp_time_start[i];
ticks += cp_time_finish[i];
}
printf("%0.02f,", (float)(100 * cp_time_finish[CP_USER]) / ticks);
printf("%0.02f,", (float)(100 * cp_time_finish[CP_NICE]) / ticks);
printf("%0.02f,", (float)(100 * cp_time_finish[CP_SYS]) / ticks);
printf("%0.02f,", (float)(100 * cp_time_finish[CP_INTR]) / ticks);
printf("%0.02f", (float)(100 * cp_time_finish[CP_IDLE]) / ticks);
printf("\n");
}

View File

@ -277,8 +277,10 @@ tcpp_server_worker(int workernum)
void
tcpp_server(void)
{
#if 0
long cp_time_last[CPUSTATES], cp_time_now[CPUSTATES], ticks;
size_t size;
#endif
pid_t pid;
int i;
@ -307,7 +309,7 @@ tcpp_server(void)
pid_list[i] = pid;
}
if (Tflag) {
#if 0
size = sizeof(cp_time_last);
if (sysctlbyname(SYSCTLNAME_CPTIME, &cp_time_last, &size,
NULL, 0) < 0)
@ -334,7 +336,7 @@ tcpp_server(void)
(100 * cp_time_last[CP_IDLE]) / ticks);
bcopy(cp_time_now, cp_time_last, sizeof(cp_time_last));
}
}
#endif
/*
* GC workers.