Версия 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, предположительно из-за всплеска трафика, который кубический алгоритм делает во время наращивания.
Поскольку перегрузка может привести к задержке пакетов, мы попробовали алгоритм перегрузки 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 нет.
N / A
Суммарная скорость, по-видимому, включает больше байтов, чем отдельные интервальные скорости, что приводит к неточному суммированию скоростей, которые выше, чем они должны быть.
Суммарные скорости должны включать среднее количество байтов по всем интервалам, любое превышение должно быть включено как дополнительный набор данных.
Я создал сценарий, чтобы вычислить интервалы и сравнить их с суммой.
./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 Я отправил вам электронное письмо, которое может оказаться полезным