Versión de iperf3: 3.2
Hardware: entre un servidor Linux y un cliente Linux
Sistema operativo (y distribución, si corresponde): Linux basado en Debian
@ aledesma78 fue el descubridor original de este problema.
Tenemos un dispositivo con velocidad limitada a 3750 kbps. Esperábamos ver que el resultado de la velocidad final sea igual o inferior a 3,75 Mbits / seg.
Vemos un resultado de velocidad final por encima de la velocidad de velocidad limitada, pero ningún intervalo no omitido alcanza esa velocidad.
Limite la velocidad de un dispositivo y ejecute una prueba de velocidad descendente.
iperf3_2 -c 10.254.223.197 -R -P 2 -O2 -t5 -C cubic
Connecting to host 10.254.223.197, port 5201
Reverse mode, remote host 10.254.223.197 is sending
[ 5] local 10.0.0.103 port 48668 connected to 10.254.223.197 port 5201
[ 7] local 10.0.0.103 port 48669 connected to 10.254.223.197 port 5201
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 250 KBytes 2.05 Mbits/sec (omitted)
[ 7] 0.00-1.00 sec 246 KBytes 2.02 Mbits/sec (omitted)
[SUM] 0.00-1.00 sec 496 KBytes 4.07 Mbits/sec (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 250 KBytes 2.05 Mbits/sec (omitted)
[ 7] 1.00-2.00 sec 185 KBytes 1.52 Mbits/sec (omitted)
[SUM] 1.00-2.00 sec 436 KBytes 3.57 Mbits/sec (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 0.00-1.00 sec 195 KBytes 1.60 Mbits/sec
[ 7] 0.00-1.00 sec 242 KBytes 1.98 Mbits/sec
[SUM] 0.00-1.00 sec 437 KBytes 3.58 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 212 KBytes 1.74 Mbits/sec
[ 7] 1.00-2.00 sec 225 KBytes 1.84 Mbits/sec
[SUM] 1.00-2.00 sec 437 KBytes 3.58 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 2.00-3.00 sec 232 KBytes 1.90 Mbits/sec
[ 7] 2.00-3.00 sec 204 KBytes 1.67 Mbits/sec
[SUM] 2.00-3.00 sec 436 KBytes 3.57 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 3.00-4.00 sec 266 KBytes 2.18 Mbits/sec
[ 7] 3.00-4.00 sec 171 KBytes 1.40 Mbits/sec
[SUM] 3.00-4.00 sec 437 KBytes 3.58 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 4.00-5.00 sec 164 KBytes 1.34 Mbits/sec
[ 7] 4.00-5.00 sec 272 KBytes 2.22 Mbits/sec
[SUM] 4.00-5.00 sec 436 KBytes 3.57 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-5.02 sec 1.36 MBytes 2.28 Mbits/sec 0 sender
[ 5] 0.00-5.00 sec 1.17 MBytes 1.96 Mbits/sec receiver
[ 7] 0.00-5.02 sec 1.51 MBytes 2.53 Mbits/sec 0 sender
[ 7] 0.00-5.00 sec 1.34 MBytes 2.24 Mbits/sec receiver
[SUM] 0.00-5.02 sec 2.88 MBytes 4.81 Mbits/sec 0 sender
[SUM] 0.00-5.00 sec 2.51 MBytes 4.20 Mbits/sec receiver
Accepted connection from 10.254.223.201, port 48667
[ 5] local 10.254.223.197 port 5201 connected to 10.254.223.201 port 48668
[ 8] local 10.254.223.197 port 5201 connected to 10.254.223.201 port 48669
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 518 KBytes 4.24 Mbits/sec 0 83.4 KBytes (omitted)
[ 8] 0.00-1.00 sec 520 KBytes 4.26 Mbits/sec 0 83.4 KBytes (omitted)
[SUM] 0.00-1.00 sec 1.01 MBytes 8.50 Mbits/sec 0 (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 407 KBytes 3.34 Mbits/sec 0 96.2 KBytes (omitted)
[ 8] 1.00-2.00 sec 263 KBytes 2.16 Mbits/sec 0 90.5 KBytes (omitted)
[SUM] 1.00-2.00 sec 670 KBytes 5.49 Mbits/sec 0 (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 0.00-1.00 sec 153 KBytes 1.25 Mbits/sec 0 105 KBytes
[ 8] 0.00-1.00 sec 297 KBytes 2.43 Mbits/sec 0 102 KBytes
[SUM] 0.00-1.00 sec 450 KBytes 3.68 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 334 KBytes 2.73 Mbits/sec 0 115 KBytes
[ 8] 1.00-2.00 sec 161 KBytes 1.32 Mbits/sec 0 112 KBytes
[SUM] 1.00-2.00 sec 495 KBytes 4.05 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 2.00-3.00 sec 187 KBytes 1.53 Mbits/sec 0 126 KBytes
[ 8] 2.00-3.00 sec 356 KBytes 2.92 Mbits/sec 0 124 KBytes
[SUM] 2.00-3.00 sec 543 KBytes 4.45 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 3.00-4.00 sec 444 KBytes 3.64 Mbits/sec 0 163 KBytes
[ 8] 3.00-4.00 sec 206 KBytes 1.69 Mbits/sec 0 146 KBytes
[SUM] 3.00-4.00 sec 650 KBytes 5.33 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 4.00-5.00 sec 280 KBytes 2.29 Mbits/sec 0 197 KBytes
[ 8] 4.00-5.00 sec 529 KBytes 4.33 Mbits/sec 0 202 KBytes
[SUM] 4.00-5.00 sec 809 KBytes 6.63 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-5.02 sec 1.36 MBytes 2.28 Mbits/sec 0 sender
[ 8] 0.00-5.02 sec 1.51 MBytes 2.53 Mbits/sec 0 sender
[SUM] 0.00-5.02 sec 2.88 MBytes 4.81 Mbits/sec 0 sender
Como puede ver, la suma final del cliente informa 4,20 Mbits / seg, por encima del límite de velocidad del cliente. No debería ser posible alcanzar velocidades superiores al límite de velocidad.
Hay un retraso notable después del intervalo final de la prueba. ¿Iperf3 sigue contando los paquetes entrantes finales después del último intervalo y los agrega al total, que luego se divide solo por el tiempo de los intervalos? Esto explicaría que la suma esté por encima del promedio de las velocidades de intervalo.
Hicimos una captura por wirehark de los paquetes entrantes en el lado del servidor y notamos muchos errores de TCP (que se muestran a continuación). Los errores fueron un montón de ACK duplicados, presumiblemente por la ráfaga de tráfico que hace el algoritmo cúbico mientras se acelera.
Dado que la congestión puede provocar un retraso en los paquetes, probamos el algoritmo de congestión de Vegas TCP para ver si eso hacía una diferencia.
iperf3_2 -c 10.254.223.197 -R -P 2 -O2 -t5 -C vegas
Connecting to host 10.254.223.197, port 5201
Reverse mode, remote host 10.254.223.197 is sending
[ 5] local 10.0.0.103 port 48680 connected to 10.254.223.197 port 5201
[ 7] local 10.0.0.103 port 48681 connected to 10.254.223.197 port 5201
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 238 KBytes 1.95 Mbits/sec (omitted)
[ 7] 0.00-1.00 sec 259 KBytes 2.12 Mbits/sec (omitted)
[SUM] 0.00-1.00 sec 496 KBytes 4.07 Mbits/sec (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 325 KBytes 2.66 Mbits/sec (omitted)
[ 7] 1.00-2.00 sec 112 KBytes 915 Kbits/sec (omitted)
[SUM] 1.00-2.00 sec 437 KBytes 3.58 Mbits/sec (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 0.00-1.00 sec 208 KBytes 1.70 Mbits/sec
[ 7] 0.00-1.00 sec 229 KBytes 1.88 Mbits/sec
[SUM] 0.00-1.00 sec 437 KBytes 3.58 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 178 KBytes 1.46 Mbits/sec
[ 7] 1.00-2.00 sec 257 KBytes 2.11 Mbits/sec
[SUM] 1.00-2.00 sec 436 KBytes 3.57 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 2.00-3.00 sec 182 KBytes 1.49 Mbits/sec
[ 7] 2.00-3.00 sec 255 KBytes 2.09 Mbits/sec
[SUM] 2.00-3.00 sec 437 KBytes 3.58 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 3.00-4.00 sec 175 KBytes 1.44 Mbits/sec
[ 7] 3.00-4.00 sec 262 KBytes 2.14 Mbits/sec
[SUM] 3.00-4.00 sec 437 KBytes 3.58 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 4.00-5.00 sec 181 KBytes 1.48 Mbits/sec
[ 7] 4.00-5.00 sec 256 KBytes 2.10 Mbits/sec
[SUM] 4.00-5.00 sec 437 KBytes 3.58 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-5.02 sec 911 KBytes 1.49 Mbits/sec 0 sender
[ 5] 0.00-5.00 sec 925 KBytes 1.52 Mbits/sec receiver
[ 7] 0.00-5.02 sec 1.24 MBytes 2.08 Mbits/sec 0 sender
[ 7] 0.00-5.00 sec 1.35 MBytes 2.27 Mbits/sec receiver
[SUM] 0.00-5.02 sec 2.13 MBytes 3.56 Mbits/sec 0 sender
[SUM] 0.00-5.00 sec 2.26 MBytes 3.79 Mbits/sec receiver
Accepted connection from 10.254.223.201, port 48679
[ 5] local 10.254.223.197 port 5201 connected to 10.254.223.201 port 48680
[ 8] local 10.254.223.197 port 5201 connected to 10.254.223.201 port 48681
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 379 KBytes 3.10 Mbits/sec 0 35.4 KBytes (omitted)
[ 8] 0.00-1.00 sec 455 KBytes 3.73 Mbits/sec 0 17.0 KBytes (omitted)
[SUM] 0.00-1.00 sec 834 KBytes 6.83 Mbits/sec 0 (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 325 KBytes 2.66 Mbits/sec 0 17.0 KBytes (omitted)
[ 8] 1.00-2.00 sec 70.7 KBytes 579 Kbits/sec 0 7.07 KBytes (omitted)
[SUM] 1.00-2.00 sec 396 KBytes 3.24 Mbits/sec 0 (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 0.00-1.00 sec 195 KBytes 1.60 Mbits/sec 0 8.48 KBytes
[ 8] 0.00-1.00 sec 212 KBytes 1.74 Mbits/sec 0 9.90 KBytes
[SUM] 0.00-1.00 sec 407 KBytes 3.34 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 195 KBytes 1.60 Mbits/sec 0 7.07 KBytes
[ 8] 1.00-2.00 sec 283 KBytes 2.32 Mbits/sec 0 9.90 KBytes
[SUM] 1.00-2.00 sec 478 KBytes 3.92 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 2.00-3.00 sec 195 KBytes 1.60 Mbits/sec 0 7.07 KBytes
[ 8] 2.00-3.00 sec 283 KBytes 2.32 Mbits/sec 0 9.90 KBytes
[SUM] 2.00-3.00 sec 478 KBytes 3.92 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 3.00-4.00 sec 195 KBytes 1.60 Mbits/sec 0 7.07 KBytes
[ 8] 3.00-4.00 sec 212 KBytes 1.74 Mbits/sec 0 9.90 KBytes
[SUM] 3.00-4.00 sec 407 KBytes 3.34 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 4.00-5.00 sec 130 KBytes 1.07 Mbits/sec 0 7.07 KBytes
[ 8] 4.00-5.00 sec 283 KBytes 2.32 Mbits/sec 0 9.90 KBytes
[SUM] 4.00-5.00 sec 413 KBytes 3.38 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-5.02 sec 911 KBytes 1.49 Mbits/sec 0 sender
[ 8] 0.00-5.02 sec 1.24 MBytes 2.08 Mbits/sec 0 sender
[SUM] 0.00-5.02 sec 2.13 MBytes 3.56 Mbits/sec 0 sender
¡Viola! La suma está por debajo de la velocidad de tasa limitada. Pero hubo ocasiones en las que ejecuté iperf3 con el algoritmo Vegas en las que veía una suma de 3,78 Mbits / seg (solo ligeramente por encima de la velocidad de velocidad limitada).
Hicimos una captura de wirehark nuevamente (se muestra a continuación). Esta vez, no hay errores de TCP.
N / A
La velocidad de suma parece incluir más bytes que las velocidades de intervalo individuales, lo que genera velocidades de suma inexactas que son más altas de lo que deberían ser.
Las velocidades de suma deben incluir el promedio de los recuentos de bytes en todos los intervalos, cualquier exceso debe incluirse como un conjunto de datos adicional.
Creé un script para hacer los cálculos de los recuentos de intervalos y compararlo con la suma.
./iperf3 -c 10.254.223.197 -P 2 -R -J -t 5 -O 2
{
"start": {
"connected": [{
"socket": 5,
"local_host": "10.0.0.103",
"local_port": 42061,
"remote_host": "10.254.223.197",
"remote_port": 5201
}, {
"socket": 7,
"local_host": "10.0.0.103",
"local_port": 42062,
"remote_host": "10.254.223.197",
"remote_port": 5201
}],
"version": "iperf 3.3",
"system_info": "Linux alarm 3.14.79-28-ARCH #1 SMP PREEMPT Tue Nov 28 20:47:59 MST 2017 aarch64",
"timestamp": {
"time": "Mon, 15 Jan 2018 23:15:14 GMT",
"timesecs": 1516058114
},
"connecting_to": {
"host": "10.254.223.197",
"port": 5201
},
"cookie": "p53abfwnpdgxdb4i4ben3aby5q6p3tr72mzd",
"tcp_mss_default": 1448,
"sock_bufsize": 0,
"sndbuf_actual": 16384,
"rcvbuf_actual": 87380,
"sock_bufsize": 0,
"sndbuf_actual": 16384,
"rcvbuf_actual": 87380,
"test_start": {
"protocol": "TCP",
"num_streams": 2,
"blksize": 131072,
"omit": 2,
"duration": 5,
"bytes": 0,
"blocks": 0,
"reverse": 1,
"tos": 545460846592
}
},
"intervals": [{
"streams": [{
"socket": 5,
"start": 0,
"end": 1.0000720024108887,
"seconds": 1.0000720024108887,
"bytes": 263536,
"bits_per_second": 2108136.2091104626,
"omitted": true
}, {
"socket": 7,
"start": 0,
"end": 1.0000808238983154,
"seconds": 1.0000808238983154,
"bytes": 244712,
"bits_per_second": 1957537.784165184,
"omitted": true
}],
"sum": {
"start": 0,
"end": 1.0000720024108887,
"seconds": 1.0000720024108887,
"bytes": 508248,
"bits_per_second": 4065691.2604273204,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 1.0000720024108887,
"end": 2.0000720024108887,
"seconds": 1,
"bytes": 254848,
"bits_per_second": 2038784,
"omitted": true
}, {
"socket": 7,
"start": 1.0000808238983154,
"end": 2.0000829696655273,
"seconds": 1.0000021457672119,
"bytes": 192584,
"bits_per_second": 1540668.6940836317,
"omitted": true
}],
"sum": {
"start": 1.0000720024108887,
"end": 2.0000720024108887,
"seconds": 1,
"bytes": 447432,
"bits_per_second": 3579456,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 9.3936920166015625e-05,
"end": 0.99996590614318848,
"seconds": 1.0000598430633545,
"bytes": 205616,
"bits_per_second": 1644829.5683599333,
"omitted": false
}, {
"socket": 7,
"start": 8.296966552734375e-05,
"end": 0.99997401237487793,
"seconds": 1.0000569820404053,
"bytes": 241816,
"bits_per_second": 1934417.7729283024,
"omitted": false
}],
"sum": {
"start": 9.3936920166015625e-05,
"end": 0.99996590614318848,
"seconds": 1.0000598430633545,
"bytes": 447432,
"bits_per_second": 3579241.80720577,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 0.99996590614318848,
"end": 1.9999659061431885,
"seconds": 1,
"bytes": 231680,
"bits_per_second": 1853440,
"omitted": false
}, {
"socket": 7,
"start": 0.99997401237487793,
"end": 1.9999749660491943,
"seconds": 1.0000009536743164,
"bytes": 215752,
"bits_per_second": 1726014.3539444408,
"omitted": false
}],
"sum": {
"start": 0.99996590614318848,
"end": 1.9999659061431885,
"seconds": 1,
"bytes": 447432,
"bits_per_second": 3579456,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 1.9999659061431885,
"end": 2.9999370574951172,
"seconds": 0.99997115135192871,
"bytes": 237472,
"bits_per_second": 1899830.8075503621,
"omitted": false
}, {
"socket": 7,
"start": 1.9999749660491943,
"end": 2.9999480247497559,
"seconds": 0.99997305870056152,
"bytes": 209960,
"bits_per_second": 1679725.253981042,
"omitted": false
}],
"sum": {
"start": 1.9999659061431885,
"end": 2.9999370574951172,
"seconds": 0.99997115135192871,
"bytes": 447432,
"bits_per_second": 3579559.2654454992,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 2.9999370574951172,
"end": 3.9999649524688721,
"seconds": 1.0000278949737549,
"bytes": 275120,
"bits_per_second": 2200898.6059911489,
"omitted": false
}, {
"socket": 7,
"start": 2.9999480247497559,
"end": 3.9999740123748779,
"seconds": 1.0000259876251221,
"bytes": 170864,
"bits_per_second": 1366876.4781264982,
"omitted": false
}],
"sum": {
"start": 2.9999370574951172,
"end": 3.9999649524688721,
"seconds": 1.0000278949737549,
"bytes": 445984,
"bits_per_second": 3567772.4770803885,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 3.9999649524688721,
"end": 4.9999239444732666,
"seconds": 0.99995899200439453,
"bytes": 176656,
"bits_per_second": 1413305.9568444674,
"omitted": false
}, {
"socket": 7,
"start": 3.9999740123748779,
"end": 4.9999361038208008,
"seconds": 0.99996209144592285,
"bytes": 270776,
"bits_per_second": 2166290.1209261958,
"omitted": false
}],
"sum": {
"start": 3.9999649524688721,
"end": 4.9999239444732666,
"seconds": 0.99995899200439453,
"bytes": 447432,
"bits_per_second": 3579602.7923355773,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 5,
"start": 0,
"end": 5.0177791118621826,
"seconds": 5.0177791118621826,
"bytes": 1662304,
"bits_per_second": 2650262.5371774738,
"retransmits": 0,
"max_snd_cwnd": 0,
"max_rtt": 0,
"min_rtt": 0,
"mean_rtt": 0
},
"receiver": {
"socket": 5,
"start": 0,
"end": 4.9999239444732666,
"seconds": 4.9999239444732666,
"bytes": 1388688,
"bits_per_second": 2221934.5980812446
}
}, {
"sender": {
"socket": 7,
"start": 0,
"end": 5.0177791118621826,
"seconds": 5.0177791118621826,
"bytes": 1601488,
"bits_per_second": 2553301.7126465905,
"retransmits": 0,
"max_snd_cwnd": 0,
"max_rtt": 0,
"min_rtt": 0,
"mean_rtt": 0
},
"receiver": {
"socket": 7,
"start": 0,
"end": 4.9999239444732666,
"seconds": 4.9999239444732666,
"bytes": 1240240,
"bits_per_second": 1984414.1851332216
}
}],
"sum_sent": {
"start": 0,
"end": 5.0177791118621826,
"seconds": 5.0177791118621826,
"bytes": 3263792,
"bits_per_second": 5203564.2498240648,
"retransmits": 0
},
"sum_received": {
"start": 0,
"end": 4.9999239444732666,
"seconds": 4.9999239444732666,
"bytes": 2628928,
"bits_per_second": 4206348.7832144666
},
"cpu_utilization_percent": {
"host_total": 1.4895097996990692,
"host_user": 0.27786769885254531,
"host_system": 1.2504046448364539,
"remote_total": 0.077469205119125223,
"remote_user": 0.033212949675937929,
"remote_system": 0.044283932901250572
},
"sender_tcp_congestion": "cubic",
"receiver_tcp_congestion": "cubic"
}
}
Intvl (non-omitted) start time: 0.000094
Intvl (non-omitted) end time: 4.999924
Intvl (non-omitted) total bytes: 2235712
Intvl (non-omitted) data rate (bits/s): 3577260.821464
Sum total bytes: 2628928
Sum data rate (bits/s): 4206348.783214
Diff (Sum total bytes - Intvl (non-omitted) total bytes): 393216
Si solo calculamos los intervalos no omitidos, podemos ver que la velocidad de datos está más en línea con lo que vemos por intervalo a 3,58 Mbits / seg y el recuento total de bytes y el recuento de bytes del intervalo tiene una disparidad de bytes de casi 400 KB.
Gracias por el informe y análisis descriptivo de errores y me disculpo por no haber reconocido este problema antes. Claramente, algo extraño está sucediendo con nuestra contabilidad. Me pregunto si de alguna manera estamos incluyendo los bytes omitidos en la suma total o alguna otra cosa para inflar la suma.
Creemos que iperf3 sigue contando los bytes que quedan en los búferes incluso después de que iperf3 haya terminado de medir los intervalos.
No estoy convencido de que contar esos bytes al final sea un error (fueron enviados válidamente por el remitente durante la duración de la prueba, y recuerdo que las condiciones de detención de la prueba se aplican en el lado del remitente, no en el receptor). Sin embargo, si los contamos, también debemos tener en cuenta el tiempo durante el cual se recibieron esos bytes para que el cálculo de la tasa sea correcto.
Estoy de acuerdo. Es ventajoso tener en cuenta todos los bytes que se reciben y no lo veo como un error, sino que iperf3 no tiene en cuenta el momento en que entran esos últimos bytes. ¿Puede haber otro intervalo agregado al JSON que cuenta para ese tiempo y lo ha marcado como un intervalo extra?
¿Se puede agregar otro intervalo al JSON que represente ese tiempo y marcarlo como un intervalo adicional?
Pensé que eso era lo que hicimos, por eso estoy un poco confundido. Necesito intentar reproducir este error localmente y luego sumergirme en el código fuente. ¿Sucede esto de manera constante? Además, ¿solo sucede con múltiples flujos paralelos o también lo ve con un solo flujo?
Sucede consistentemente cuando se usa el algoritmo cúbico y no importa si es un flujo único o más.
Es solo porque estamos probando velocidades más bajas que pudimos encontrar este problema. Los bytes adicionales no son tan notables en la suma general a velocidades más altas.
está bien. Buenas (?!?) Noticias: he podido reproducir este problema con un par de máquinas virtuales en mi portátil con un enlace restringido artificialmente por tc (8) a 256 Kbps. Sin embargo, solo he visto esto hasta ahora con múltiples flujos TCP paralelos. No sé en este momento qué tan significativo es eso, solo una observación.
El servidor es CentOS 7, el cliente es CentOS 6, ambos ejecutan iperf3 compilado a partir de la punta del código master
:
bmah-centos6:iperf% src/iperf3 --client 192.168.56.104 --parallel 2 --reverse -O2 -t 5 -C cubic -fk
Connecting to host 192.168.56.104, port 5201
Reverse mode, remote host 192.168.56.104 is sending
[ 5] local 192.168.56.101 port 52906 connected to 192.168.56.104 port 5201
[ 7] local 192.168.56.101 port 52908 connected to 192.168.56.104 port 5201
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 21.2 KBytes 173 Kbits/sec (omitted)
[ 7] 0.00-1.00 sec 14.1 KBytes 116 Kbits/sec (omitted)
[SUM] 0.00-1.00 sec 35.4 KBytes 289 Kbits/sec (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 17.0 KBytes 139 Kbits/sec (omitted)
[ 7] 1.00-2.00 sec 9.90 KBytes 81.1 Kbits/sec (omitted)
[SUM] 1.00-2.00 sec 26.9 KBytes 220 Kbits/sec (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 0.00-1.00 sec 14.1 KBytes 116 Kbits/sec
[ 7] 0.00-1.00 sec 14.1 KBytes 116 Kbits/sec
[SUM] 0.00-1.00 sec 28.3 KBytes 232 Kbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 14.1 KBytes 116 Kbits/sec
[ 7] 1.00-2.00 sec 17.0 KBytes 139 Kbits/sec
[SUM] 1.00-2.00 sec 31.1 KBytes 255 Kbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 2.00-3.00 sec 14.1 KBytes 116 Kbits/sec
[ 7] 2.00-3.00 sec 14.1 KBytes 116 Kbits/sec
[SUM] 2.00-3.00 sec 28.3 KBytes 232 Kbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 3.00-4.00 sec 15.6 KBytes 127 Kbits/sec
[ 7] 3.00-4.00 sec 15.6 KBytes 127 Kbits/sec
[SUM] 3.00-4.00 sec 31.1 KBytes 255 Kbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 4.00-5.00 sec 14.1 KBytes 116 Kbits/sec
[ 7] 4.00-5.00 sec 14.1 KBytes 116 Kbits/sec
[SUM] 4.00-5.00 sec 28.3 KBytes 232 Kbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-5.02 sec 79.2 KBytes 129 Kbits/sec 0 sender
[ 5] 0.00-5.00 sec 72.1 KBytes 118 Kbits/sec receiver
[ 7] 0.00-5.02 sec 110 KBytes 180 Kbits/sec 0 sender
[ 7] 0.00-5.00 sec 74.9 KBytes 123 Kbits/sec receiver
[SUM] 0.00-5.02 sec 189 KBytes 309 Kbits/sec 0 sender
[SUM] 0.00-5.00 sec 147 KBytes 241 Kbits/sec receiver
iperf Done.
No debería ser posible que el remitente envíe 309 Kbps. Así que necesito averiguar qué está pasando con esto.
Bien, después de jugar con esto por un tiempo, se me ocurrieron algunas cosas. TL; DR: iperf3 está funcionando correctamente, pero hay algunas sutilezas en la interpretación de la salida que pueden ser engañosas.
Las mediciones en cada intervalo se toman en la capa de aplicación (es decir, dentro del propio iperf3). Este es un hecho importante que la gente (incluyéndome a mí) a veces olvida. Entre la aplicación y el cable se encuentran los búferes de socket del kernel, la pila completa del protocolo TCP / IP (incluido el control de flujo y el control de congestión) y los búferes de interfaz.
Las lecturas anómalas (con la tasa de bits anormalmente alta) se tomaron del lado de envío, en particular antes de los efectos de limitación de la tasa del control de flujo y control de congestión de TCP.
Las pruebas realizadas para investigar esto (incluidas las que ejecuté) fueron todas bastante cortas, solo unos segundos.
Lo que creo que está sucediendo aquí es que el proceso de envío puede enviar una gran ráfaga de datos (hasta los límites de los búferes de socket y sin tener en cuenta el algoritmo de control de congestión de TCP). En algún momento, los algoritmos de control de congestión y / o la pérdida de paquetes lo obligan a detenerse. Tenga en cuenta que la última parte de cada ráfaga ya se envía en lo que respecta a iperf3 (por lo que se cuenta en las estadísticas de intervalo como "enviado"), pero está en los búferes de socket en el lado de la aplicación, esperando la retransmisión. Por lo tanto, es posible que un intervalo registre una cantidad de datos enviados que en realidad es más de lo que es posible enviar por cable, porque los datos aún no han salido del host de envío.
Este efecto es especialmente visible porque la corta duración de la prueba (5 segundos) permite observar en un intervalo de tiempo corto tasas que no son indicativas de la tasa a más largo plazo. Realmente no ve esto en el lado del cliente (receptor), pero los registros del servidor (remitente) lo muestran. Aquí hay un registro de remitentes de una prueba reciente que hice. Tenga en cuenta la naturaleza a ráfagas del tráfico procedente del remitente. Esto también es visible en la salida del lado del servidor en su informe de error original, aunque es un poco menos visible (¿tal vez porque tenía un mayor ancho de banda de cuello de botella?). Pero muestra fluctuaciones en la cantidad de datos enviados en cada intervalo, tanto por encima como por debajo del ancho de banda del cuello de botella.
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.56.101, port 53362
[ 5] local 192.168.56.104 port 5201 connected to 192.168.56.101 port 53364
[ 8] local 192.168.56.104 port 5201 connected to 192.168.56.101 port 53366
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 130 KBytes 1.06 Mbits/sec 0 28.3 KBytes (omitted)
[ 8] 0.00-1.00 sec 77.8 KBytes 636 Kbits/sec 0 14.1 KBytes (omitted)
[SUM] 0.00-1.00 sec 208 KBytes 1.70 Mbits/sec 0 (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 60.8 KBytes 498 Kbits/sec 0 28.3 KBytes (omitted)
[ 8] 1.00-2.00 sec 49.5 KBytes 405 Kbits/sec 0 19.8 KBytes (omitted)
[SUM] 1.00-2.00 sec 110 KBytes 903 Kbits/sec 0 (omitted)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 0.00-1.00 sec 0.00 Bytes 0.00 bits/sec 0 28.3 KBytes
[ 8] 0.00-1.00 sec 0.00 Bytes 0.00 bits/sec 0 19.8 KBytes
[SUM] 0.00-1.00 sec 0.00 Bytes 0.00 bits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 1.00-2.00 sec 0.00 Bytes 0.00 bits/sec 0 28.3 KBytes
[ 8] 1.00-2.00 sec 0.00 Bytes 0.00 bits/sec 0 19.8 KBytes
[SUM] 1.00-2.00 sec 0.00 Bytes 0.00 bits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 2.00-3.00 sec 0.00 Bytes 0.00 bits/sec 0 28.3 KBytes
[ 8] 2.00-3.00 sec 48.1 KBytes 394 Kbits/sec 0 19.8 KBytes
[SUM] 2.00-3.00 sec 48.1 KBytes 394 Kbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 3.00-4.00 sec 79.2 KBytes 649 Kbits/sec 0 28.3 KBytes
[ 8] 3.00-4.00 sec 0.00 Bytes 0.00 bits/sec 0 22.6 KBytes
[SUM] 3.00-4.00 sec 79.2 KBytes 649 Kbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 5] 4.00-5.00 sec 0.00 Bytes 0.00 bits/sec 0 28.3 KBytes
[ 8] 4.00-5.00 sec 62.2 KBytes 509 Kbits/sec 0 22.6 KBytes
[SUM] 4.00-5.00 sec 62.2 KBytes 509 Kbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-5.02 sec 79.2 KBytes 129 Kbits/sec 0 sender
[ 8] 0.00-5.02 sec 110 KBytes 180 Kbits/sec 0 sender
[SUM] 0.00-5.02 sec 189 KBytes 309 Kbits/sec 0 sender
Tenga en cuenta que cuando ejecuté pruebas similares, pero más largas (digamos 10-30 segundos), todavía vemos las fluctuaciones en los datos enviados a la capa de aplicación por intervalo, pero el promedio a largo plazo (correctamente) se acerca al ancho de banda del cuello de botella. Aquí está el final de una prueba de 30 segundos, que muestra las tasas de bits de envío y recepción aproximadamente iguales y acerca de lo que esperaríamos ver en un enlace de velocidad limitada de 256 Kbps:
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-30.02 sec 410 KBytes 112 Kbits/sec 0 sender
[ 5] 0.00-30.00 sec 450 KBytes 123 Kbits/sec receiver
[ 7] 0.00-30.02 sec 484 KBytes 132 Kbits/sec 0 sender
[ 7] 0.00-30.00 sec 448 KBytes 122 Kbits/sec receiver
[SUM] 0.00-30.02 sec 894 KBytes 244 Kbits/sec 0 sender
[SUM] 0.00-30.00 sec 898 KBytes 245 Kbits/sec receiver
iperf Done.
Entonces, por lo que puedo decir, iperf3 está funcionando correctamente, pero es posible que se necesiten pruebas más largas para producir resultados más significativos. (Otras formas de deshacerse de este efecto podrían ser usar tamaños de envío más pequeños, reducir los tamaños de búfer de socket o usar una cola justa basada en socket, aunque no probé ninguno de ellos).
Cuando el remitente tiene una velocidad de bits superior al límite de velocidad, tiene sentido que haya una congestión, pero a mí me preocupa más ver que eso suceda en el extremo del receptor. Si miras la salida de mi primer cliente, el receptor SUM tiene una tasa de bits por encima del límite de tasa
[SUM] 0.00-5.00 sec 2.51 MBytes 4.20 Mbits/sec receiver
¿Por qué el receptor afirma haber recibido una tasa más alta de lo posible (en el caso anterior está limitado a 3,75 Mbits / seg)?
Me gustaría señalar que cuando ejecuté mis pruebas, noté un retraso en los resultados de la suma en el último intervalo. Por lo general, no veo un retraso en los resultados de la suma, por lo que me pregunto si el receptor todavía está contando los bytes que quedan en el búfer incluso después de la última medición del intervalo.
Admitido. Déjame profundizar un poco más en esto. El problema en el extremo del receptor no es uno que esté viendo (tal vez estaba viendo la parte incorrecta del problema, pero en cualquier caso ...) Puede que necesite encontrar algo más para intentar reproducir ese lado.
Pasé la mayor parte del día la semana pasada tratando de reproducir este error, porque la precisión de la medición (a diferencia de algunas funciones opcionales) es algo muy importante para nosotros. Pero no he podido recrearlo. Si alguien (cualquiera) puede ayudarme a ver este problema de primera mano y abordarlo, preferiblemente mediante el uso de un par de máquinas virtuales y algún mecanismo de limitación como tc, sería muy apreciado.
@ bmah888 Te envié un correo electrónico que puede ser útil