Iperf: Суммарная скорость выше скорости с ограничением

Созданный на 24 янв. 2018  ·  13Комментарии  ·  Источник: esnet/iperf

Контекст

  • Версия iperf3: 3.2

  • Оборудование: между сервером Linux и клиентом Linux

  • Операционная система (и дистрибутив, если есть): Linux на основе Debian

Отчет об ошибке

  • Ожидаемое поведение

@ aledesma78 был

У нас есть ограниченная скорость устройства 3750 кбит / с. Мы ожидали увидеть окончательный результат скорости на уровне 3,75 Мбит / с или ниже.

  • Фактическое поведение

Мы видим конечный результат скорости выше скорости с ограничением скорости, но никакие непропущенные интервалы не достигают этой скорости.

  • Действия по воспроизведению

Ограничьте скорость устройства и запустите тест скорости нисходящего потока.

ВЫХОД КЛИЕНТА

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

Как вы можете видеть, окончательная сумма клиента сообщает о 4,20 Мбит / с, превышая лимит скорости, установленный клиентом. Не должно быть возможности достичь скорости выше, чем предел скорости.

После последнего интервала теста наблюдается заметная задержка. Подсчитывает ли iperf3 окончательные входящие пакеты после последнего интервала и добавляет их к общему количеству, которое затем делится только на время интервалов? Это объясняет, что сумма превышает среднее значение интервальных скоростей.

Мы провели захват входящих пакетов на стороне сервера с помощью wirehark и заметили множество ошибок TCP (показано ниже). Ошибки представляли собой набор повторяющихся ACK, предположительно из-за всплеска трафика, который кубический алгоритм делает во время наращивания.

iperf3 packets with cubic

Поскольку перегрузка может привести к задержке пакетов, мы попробовали алгоритм перегрузки Vegas TCP, чтобы увидеть, имеет ли это значение.

ВЫХОД КЛИЕНТА

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

Альт! Сумма ниже скорости с ограничением скорости. Но были времена, когда я запускал iperf3 с алгоритмом Vegas, и я видел в сумме 3,78 Мбит / с (лишь немного превышая скорость, ограниченную скоростью).

Мы снова сделали захват Wirehark (показано ниже). На этот раз ошибок TCP нет.

iperf3 packets with vegas

  • Возможное решение

N / A

Запрос об улучшении

  • Текущее поведение

Суммарная скорость, по-видимому, включает больше байтов, чем отдельные интервальные скорости, что приводит к неточному суммированию скоростей, которые выше, чем они должны быть.

  • Желаемое поведение

Суммарные скорости должны включать среднее количество байтов по всем интервалам, любое превышение должно быть включено как дополнительный набор данных.

Все 13 Комментарий

Я создал сценарий, чтобы вычислить интервалы и сравнить их с суммой.

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

Если мы просто вычислим непропущенные интервалы, мы увидим, что скорость передачи данных больше соответствует тому, что мы видим за интервал на уровне 3,58 Мбит / с, а общее количество байтов и количество интервальных байтов имеют расхождение в байтах почти 400 КБ.

Спасибо за подробный отчет об ошибке и анализ, и я извиняюсь за то, что не признал эту проблему раньше. Ясно, что с нашей бухгалтерией происходит что-то странное. Интересно, включаем ли мы каким-то образом пропущенные байты в общую сумму или что-то еще, чтобы увеличить сумму?

Мы думаем, что iperf3 все еще считает байты, оставшиеся в буферах, даже после того, как iperf3 завершил измерение интервалов.

Я не уверен, что подсчет этих байтов в конце является ошибкой (они были действительно отправлены отправителем в течение периода тестирования, и помните, что условия остановки теста применяются на стороне отправителя, а не получателя). Однако, если мы их подсчитываем, нам также необходимо учитывать время, в течение которого были получены эти байты, чтобы вычисление скорости было правильным.

Я согласен. Полезно вести учет всех полученных байтов, и я не вижу в этом ошибки, скорее iperf3 не учитывает то время, когда приходят эти последние байты. Можно ли добавить еще один интервал в JSON, который учитывает на это время и отмечен ли он как дополнительный интервал?

Можно ли добавить к JSON еще один интервал, который учитывает это время и пометить его как дополнительный интервал?

Я думал, что мы так поступили, поэтому немного сбит с толку. Мне нужно попытаться воспроизвести эту ошибку локально, а затем погрузиться в исходный код. Это происходит постоянно? Кроме того, это происходит только с несколькими параллельными потоками или вы также видите это с одним потоком?

Это происходит последовательно при использовании кубического алгоритма, и не имеет значения, однопоточный он или более.

Только потому, что мы тестируем более низкие скорости, мы смогли найти эту проблему. Дополнительные байты не так заметны в общей сумме на более высоких скоростях.

ОК. Хорошие (?!?) Новости: мне удалось воспроизвести эту проблему с помощью пары виртуальных машин на моем ноутбуке со ссылкой, искусственно ограниченной tc (8) до 256 Кбит / с. Однако я видел это пока только с несколькими параллельными потоками TCP. Я не знаю, насколько это важно, просто наблюдение.

Сервер - CentOS 7, клиент - CentOS 6, оба работают под управлением iperf3, скомпилированного из кончика кода 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.

Отправитель не должен выдавать 309 Кбит / с. Итак, мне нужно выяснить, что с этим происходит.

Хорошо, поигравшись с этим некоторое время, я придумал несколько вещей. TL; DR: iperf3 работает правильно, но есть несколько тонкостей в интерпретации вывода, которые могут ввести в заблуждение.

  • Измерения в каждом интервале выполняются на уровне приложения (т.е. внутри самого iperf3). Это важный факт, о котором люди (включая меня) иногда забывают. Между приложением и проводом находятся буферы сокетов ядра, весь стек протоколов TCP / IP (включая управление потоком и управление перегрузкой) и буферы интерфейса.

  • Аномальные показания (с аномально высоким битрейтом) были сняты с отправляющей стороны, в частности, до ограничивающих скорость эффектов контроля потока TCP и контроля перегрузки.

  • Все тесты, проведенные для изучения этого (включая те, что я проводил), были довольно короткими, всего несколько секунд.

Я думаю, что здесь происходит то, что процесс отправки может отправить большой пакет данных (до пределов буферов сокета и без учета алгоритма контроля перегрузки TCP). В какой-то момент алгоритмы контроля перегрузки и / или потери пакетов заставляют его остановиться. Обратите внимание, что последняя часть каждого пакета уже отправлена, что касается iperf3 (поэтому в статистике интервалов он засчитывается как «отправленный»), но он находится в буферах сокета на стороне приложения, ожидая повторной передачи. Таким образом, в течение интервала можно записать объем отправленных данных, который на самом деле больше, чем можно отправить по сети, потому что данные еще не покинули отправляющий узел.

Этот эффект особенно заметен, потому что короткая продолжительность теста (5 секунд) позволяет наблюдать в течение короткого временного интервала скорости, которые не являются показательными для более долгосрочной скорости. Вы действительно не видите этого на стороне клиента (получателя), но журналы сервера (отправителя) показывают это. Вот журнал отправителя недавнего теста, который я сделал. Обратите внимание на прерывистый характер трафика, исходящего от отправителя. Это также видно в выводе на стороне сервера в вашем исходном отчете об ошибке, хотя он немного менее заметен (может быть, потому, что у вас была большая пропускная способность узкого места?). Но он показывает колебания объема данных, отправляемых в каждом интервале, как выше, так и ниже пропускной способности узкого места.

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

Обратите внимание, что когда я проводил аналогичные тесты, но дольше (скажем, 10–30 секунд), мы все еще видим колебания данных, отправляемых на уровне приложения за интервал, но долгосрочное среднее (правильно) приближается к пропускной способности узкого места. Вот конец 30-секундного теста, показывающего примерно равные битрейты отправки и получения и то, что мы ожидаем увидеть на ссылке с ограничением скорости 256 Кбит / с:

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

Итак, насколько я могу судить, iperf3 работает правильно, но для получения более значимых результатов может потребоваться использование более длительных тестов. (Другие способы избавиться от этого эффекта могут заключаться в использовании меньшего размера отправки, уменьшении размеров буфера сокета или использовании справедливой организации очереди на основе сокета, хотя я не тестировал ни один из них.)

Когда у отправителя скорость передачи данных превышает предел скорости, имеет смысл иметь дело с перегрузкой, но меня больше беспокоит то, что это произойдет на стороне получателя. Если вы посмотрите на мой первый вывод клиента, у получателя SUM битрейт превышает предел скорости

[SUM]   0.00-5.00   sec  2.51 MBytes  4.20 Mbits/sec                  receiver

Почему получатель утверждал, что получил скорость выше возможной (в приведенном выше случае она ограничена 3,75 Мбит / с)?

Хочу отметить, что когда я запускал свои тесты, я замечал задержку суммирования результатов на последнем интервале. Обычно я не вижу задержки в результатах суммирования, поэтому мне интересно, продолжает ли получатель считать байты, оставшиеся в буфере, даже после последнего измерения интервала.

Подтверждено. Позвольте мне углубиться в это еще раз. Проблема на стороне приемника - это не та, которую я вижу (возможно, я смотрел не на ту часть проблемы, но кто-нибудь ...). Возможно, мне нужно придумать что-нибудь еще, чтобы попытаться воспроизвести эту сторону.

На прошлой неделе я потратил большую часть дня, пытаясь воспроизвести эту ошибку, потому что точность измерения (в отличие от некоторых дополнительных функций) очень важна для нас. Но мне не удалось его воссоздать. Если кто-то (кто-нибудь) может помочь мне увидеть эту проблему из первых рук и попытаться решить ее, желательно с помощью пары виртуальных машин и некоторого ограничивающего механизма, такого как tc, это будет очень признательно.

@ bmah888 Я отправил вам электронное письмо, которое может оказаться полезным

Была ли эта страница полезной?
0 / 5 - 0 рейтинги