Iperf: Suma la velocidad sobre la velocidad de velocidad limitada

Creado en 24 ene. 2018  ·  13Comentarios  ·  Fuente: esnet/iperf

Contexto

  • 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

Informe de error

  • Comportamiento esperado

@ 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.

  • Comportamiento real

Vemos un resultado de velocidad final por encima de la velocidad de velocidad limitada, pero ningún intervalo no omitido alcanza esa velocidad.

  • Pasos para reproducir

Limite la velocidad de un dispositivo y ejecute una prueba de velocidad descendente.

SALIDA DEL CLIENTE

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

SALIDA DEL SERVIDOR

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.

iperf3 packets with cubic

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.

SALIDA DEL CLIENTE

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

SALIDA DEL SERVIDOR

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.

iperf3 packets with vegas

  • Solución posible

N / A

Solicitud de mejora

  • Comportamiento actual

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.

  • Comportamiento deseado

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.

bug

Todos 13 comentarios

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

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

hardikjoshi90 picture hardikjoshi90  ·  7Comentarios

Surendraknatarajan picture Surendraknatarajan  ·  9Comentarios

travis1230 picture travis1230  ·  4Comentarios

KevinJosephMorin picture KevinJosephMorin  ·  5Comentarios

cypherstream picture cypherstream  ·  6Comentarios