1
1
* Add --pacing-timer option to allow tuning of -b timers.
These control the granularity of the timer and hence burstiness
of iperf3's sends.  The default is 1ms (1000), which is the default
starting with iperf 3.2.  Follow-on to the commit in #460.

* Update manpage and release notes for --pacing-timer.
Этот коммит содержится в:
Bruce A. Mah 2017-05-03 16:18:32 -07:00 коммит произвёл GitHub
родитель 8ab637ab08
Коммит cba8584b2d
6 изменённых файлов: 29 добавлений и 5 удалений

Просмотреть файл

@ -9,9 +9,10 @@
correct test durations for all protocols (#560, #238). correct test durations for all protocols (#560, #238).
* Application-level bandwidth pacing (--bandwidth option) is now * Application-level bandwidth pacing (--bandwidth option) is now
checked every millisecond, instead of of every tenth of a second, checked every millisecond by default, instead of of every tenth of
to provide smoother traffic behavior when using application a second, to provide smoother traffic behavior when using
pacing. (#460) application pacing. (#460) The pacing can be tuned via the use of
the --pacing-timer option.
* A new --dscp option allows specifying the DSCP value to be used * A new --dscp option allows specifying the DSCP value to be used
for outgoing packets (#508). The TOS byte value is now printed in for outgoing packets (#508). The TOS byte value is now printed in

Просмотреть файл

@ -116,6 +116,7 @@ struct iperf_settings
int blksize; /* size of read/writes (-l) */ int blksize; /* size of read/writes (-l) */
uint64_t rate; /* target data rate for application pacing*/ uint64_t rate; /* target data rate for application pacing*/
uint64_t fqrate; /* target data rate for FQ pacing*/ uint64_t fqrate; /* target data rate for FQ pacing*/
int pacing_timer; /* pacing timer in microseconds */
int burst; /* packets per burst */ int burst; /* packets per burst */
int mss; /* for TCP MSS */ int mss; /* for TCP MSS */
int ttl; /* IP TTL option */ int ttl; /* IP TTL option */

Просмотреть файл

@ -124,6 +124,16 @@ This bandwidth limit is implemented internally inside iperf3, and is
available on all platforms. available on all platforms.
Compare with the \--fq-rate flag. Compare with the \--fq-rate flag.
.TP .TP
.BR --pacing-timer " \fIn\fR[KMG]"
set pacing timer interval in microseconds (default 1000 microseconds,
or 1 ms).
This controls iperf3's internal pacing timer for the -b/--bandwidth
option.
The timer fires at the interval set by this parameter.
Smaller values of the pacing timer parameter smooth out the traffic
emitted by iperf3, but potentially at the cost of performance due to
more frequent timer processing.
.TP
.BR --fq-rate " \fIn\fR[KM]" .BR --fq-rate " \fIn\fR[KM]"
Set a rate to be used with fair-queueing based socket-level pacing, Set a rate to be used with fair-queueing based socket-level pacing,
in bits per second. in bits per second.

Просмотреть файл

@ -681,6 +681,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
{"authorized-users-path", required_argument, NULL, OPT_SERVER_AUTHORIZED_USERS}, {"authorized-users-path", required_argument, NULL, OPT_SERVER_AUTHORIZED_USERS},
#endif /* HAVE_SSL */ #endif /* HAVE_SSL */
{"fq-rate", required_argument, NULL, OPT_FQ_RATE}, {"fq-rate", required_argument, NULL, OPT_FQ_RATE},
{"pacing-timer", required_argument, NULL, OPT_PACING_TIMER},
{"debug", no_argument, NULL, 'd'}, {"debug", no_argument, NULL, 'd'},
{"help", no_argument, NULL, 'h'}, {"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
@ -1012,7 +1013,11 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
test->server_authorized_users = strdup(optarg); test->server_authorized_users = strdup(optarg);
break; break;
#endif /* HAVE_SSL */ #endif /* HAVE_SSL */
case 'h': case OPT_PACING_TIMER:
test->settings->pacing_timer = unit_atoi(optarg);
client_flag = 1;
break;
case 'h':
usage_long(stdout); usage_long(stdout);
exit(0); exit(0);
default: default:
@ -1298,7 +1303,7 @@ iperf_create_send_timers(struct iperf_test * test)
if (test->settings->rate != 0) { if (test->settings->rate != 0) {
cd.p = sp; cd.p = sp;
/* (Repeat every millisecond - arbitrary value to provide smooth pacing.) */ /* (Repeat every millisecond - arbitrary value to provide smooth pacing.) */
sp->send_timer = tmr_create((struct timeval*) 0, send_timer_proc, cd, 1000L, 1); sp->send_timer = tmr_create((struct timeval*) 0, send_timer_proc, cd, test->settings->pacing_timer, 1);
if (sp->send_timer == NULL) { if (sp->send_timer == NULL) {
i_errno = IEINITTEST; i_errno = IEINITTEST;
return -1; return -1;
@ -1460,6 +1465,8 @@ send_parameters(struct iperf_test *test)
cJSON_AddNumberToObject(j, "bandwidth", test->settings->rate); cJSON_AddNumberToObject(j, "bandwidth", test->settings->rate);
if (test->settings->fqrate) if (test->settings->fqrate)
cJSON_AddNumberToObject(j, "fqrate", test->settings->fqrate); cJSON_AddNumberToObject(j, "fqrate", test->settings->fqrate);
if (test->settings->pacing_timer)
cJSON_AddNumberToObject(j, "pacing_timer", test->settings->pacing_timer);
if (test->settings->burst) if (test->settings->burst)
cJSON_AddNumberToObject(j, "burst", test->settings->burst); cJSON_AddNumberToObject(j, "burst", test->settings->burst);
if (test->settings->tos) if (test->settings->tos)
@ -1545,6 +1552,8 @@ get_parameters(struct iperf_test *test)
test->settings->rate = j_p->valueint; test->settings->rate = j_p->valueint;
if ((j_p = cJSON_GetObjectItem(j, "fqrate")) != NULL) if ((j_p = cJSON_GetObjectItem(j, "fqrate")) != NULL)
test->settings->fqrate = j_p->valueint; test->settings->fqrate = j_p->valueint;
if ((j_p = cJSON_GetObjectItem(j, "pacing_timer")) != NULL)
test->settings->pacing_timer = j_p->valueint;
if ((j_p = cJSON_GetObjectItem(j, "burst")) != NULL) if ((j_p = cJSON_GetObjectItem(j, "burst")) != NULL)
test->settings->burst = j_p->valueint; test->settings->burst = j_p->valueint;
if ((j_p = cJSON_GetObjectItem(j, "TOS")) != NULL) if ((j_p = cJSON_GetObjectItem(j, "TOS")) != NULL)
@ -2037,6 +2046,7 @@ iperf_defaults(struct iperf_test *testp)
testp->settings->blksize = DEFAULT_TCP_BLKSIZE; testp->settings->blksize = DEFAULT_TCP_BLKSIZE;
testp->settings->rate = 0; testp->settings->rate = 0;
testp->settings->fqrate = 0; testp->settings->fqrate = 0;
testp->settings->pacing_timer = 1000;
testp->settings->burst = 0; testp->settings->burst = 0;
testp->settings->mss = 0; testp->settings->mss = 0;
testp->settings->bytes = 0; testp->settings->bytes = 0;

Просмотреть файл

@ -58,6 +58,7 @@ struct iperf_stream;
#define OPT_CLIENT_RSA_PUBLIC_KEY 13 #define OPT_CLIENT_RSA_PUBLIC_KEY 13
#define OPT_SERVER_RSA_PRIVATE_KEY 14 #define OPT_SERVER_RSA_PRIVATE_KEY 14
#define OPT_SERVER_AUTHORIZED_USERS 15 #define OPT_SERVER_AUTHORIZED_USERS 15
#define OPT_PACING_TIMER 16
/* states */ /* states */
#define TEST_START 1 #define TEST_START 1

Просмотреть файл

@ -134,6 +134,7 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n"
" -b, --bandwidth #[KMG][/#] target bandwidth in bits/sec (0 for unlimited)\n" " -b, --bandwidth #[KMG][/#] target bandwidth in bits/sec (0 for unlimited)\n"
" (default %d Mbit/sec for UDP, unlimited for TCP)\n" " (default %d Mbit/sec for UDP, unlimited for TCP)\n"
" (optional slash and packet count for burst mode)\n" " (optional slash and packet count for burst mode)\n"
" --pacing-timer #[KMG] set the timing for pacing, in microseconds (default 1000)\n"
#if defined(HAVE_SO_MAX_PACING_RATE) #if defined(HAVE_SO_MAX_PACING_RATE)
" --fq-rate #[KMG] enable fair-queuing based socket pacing in\n" " --fq-rate #[KMG] enable fair-queuing based socket pacing in\n"
" bits/sec (Linux only)\n" " bits/sec (Linux only)\n"