Почему двунаправленный iperf-запрос зависает на стороне сервера?
Чтобы диагностировать разницу в сетевом трафике между двумя местоположениями и нашим главным серверным центром, я использую iperf для регистрации скорости трафика с помощью следующей команды:
iperf -c <server ip> -F 500MB_Test_File.zip -n 500M -y C
После того, как я заметил различия между загрузкой и скоростью загрузки, я хотел использовать -d
вариант и наткнулся на странное поведение: хотя передача прошла в направлении клиента к серверу, в другом направлении она зависла и, похоже, не зависала. Вот тест, который я сделал, который показывает, что он не связан с тем, что я использую файл в качестве источника для передачи данных:
$ iperf -c <server IP> -d -i 1
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to <server ip>, TCP port 5001
TCP window size: 153 KByte (default)
------------------------------------------------------------
[ 5] local <local ip> port 35144 connected with <server ip> port 5001
[ 4] local <local ip> port 5001 connected with <server ip> port 39967
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 1.0 sec 9.75 MBytes 81.8 Mbits/sec
[ 4] 0.0- 1.0 sec 10.7 MBytes 89.3 Mbits/sec
[ 5] 1.0- 2.0 sec 10.9 MBytes 91.2 Mbits/sec
[ 4] 1.0- 2.0 sec 10.9 MBytes 91.3 Mbits/sec
[ 5] 2.0- 3.0 sec 11.0 MBytes 92.3 Mbits/sec
[ 4] 2.0- 3.0 sec 10.9 MBytes 91.4 Mbits/sec
[ 5] 3.0- 4.0 sec 11.0 MBytes 92.3 Mbits/sec
[ 4] 3.0- 4.0 sec 10.9 MBytes 91.4 Mbits/sec
[ 5] 4.0- 5.0 sec 11.0 MBytes 92.3 Mbits/sec
[ 4] 4.0- 5.0 sec 10.9 MBytes 91.4 Mbits/sec
[ 5] 5.0- 6.0 sec 11.0 MBytes 92.3 Mbits/sec
[ 4] 5.0- 6.0 sec 10.9 MBytes 91.4 Mbits/sec
[ 5] 6.0- 7.0 sec 10.9 MBytes 91.2 Mbits/sec
[ 4] 6.0- 7.0 sec 10.9 MBytes 91.4 Mbits/sec
[ 5] 7.0- 8.0 sec 11.2 MBytes 94.4 Mbits/sec
[ 4] 7.0- 8.0 sec 10.9 MBytes 91.4 Mbits/sec
[ 5] 8.0- 9.0 sec 11.1 MBytes 93.3 Mbits/sec
[ 5] 9.0-10.0 sec 11.1 MBytes 93.3 Mbits/sec
[ 5] 0.0-10.0 sec 109 MBytes 91.4 Mbits/sec
^C^C
Я использую iperf 2.0.5. И клиенты, и сервер являются машинами Linux, а сервер является виртуальным.
РЕДАКТИРОВАТЬ
MariusMatutiae предложению MariusMatutiae, я запустил сервер iperf на клиентском компьютере, а затем попытался сделать двунаправленный запрос от виртуальной машины, и вот что я получил:
[host@centos ~]$ iperf -c <client_id> -d -i 1
bind failed: Address already in use
------------------------------------------------------------
Client connecting to <client_id>, TCP port 5001
TCP window size: 19.3 KByte (default)
------------------------------------------------------------
[ 4] local <server_id> port 40175 connected with <client_id> port 5001
[ ID] Interval Transfer Bandwidth
[ 4] 0.0- 1.0 sec 11.6 MBytes 97.5 Mbits/sec
[ 4] 1.0- 2.0 sec 9.50 MBytes 79.7 Mbits/sec
[ 4] 2.0- 3.0 sec 10.6 MBytes 89.1 Mbits/sec
[ 4] 3.0- 4.0 sec 11.0 MBytes 92.3 Mbits/sec
[ 4] 4.0- 5.0 sec 11.0 MBytes 92.3 Mbits/sec
[ 4] 5.0- 6.0 sec 10.9 MBytes 91.2 Mbits/sec
[ 4] 6.0- 7.0 sec 11.0 MBytes 92.3 Mbits/sec
[ 4] 7.0- 8.0 sec 10.8 MBytes 90.2 Mbits/sec
[ 4] 8.0- 9.0 sec 8.38 MBytes 70.3 Mbits/sec
[ 4] 9.0-10.0 sec 9.75 MBytes 81.8 Mbits/sec
[ 4] 0.0-10.0 sec 105 MBytes 87.8 Mbits/sec
[host@centos ~]$
Я думал, отлично, команда останавливается сама по себе, но я получаю результаты только в одном направлении. Пока я не посмотрел на машину, где я запустил сервер iPerf, на этот раз, и увидел это:
$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local <client_ip> port 5001 connected with <server_ip> port 40179
------------------------------------------------------------
Client connecting to <server_ip>, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 6] local <client_ip> port 36243 connected with <server_ip> port 5001
[ ID] Interval Transfer Bandwidth
[ 6] 0.0-10.0 sec 45.4 MBytes 38.0 Mbits/sec
[ 4] 0.0-10.2 sec 64.2 MBytes 52.8 Mbits/sec
Это заставило меня задуматься о том, что, возможно, мне нужно запустить сервер в качестве демона по обе стороны соединения, чтобы двунаправленная команда работала, и действительно, я получил аналогичные результаты, только выводя производительность на одной стороне транзакции, но как таковую У меня нет никакого способа получить данные о производительности с другой стороны: я запустил демон iperf с -D > iperflog
но журнал, кажется, не заполнен...
Предполагается ли так, что iperf должен работать на обеих машинах для выполнения двунаправленного запроса? Ли bind failed: Address already in use
сообщение, которое я получаю, когда запускаю клиент iperf и сервер запущен с обеих сторон, чтобы понять, в чем проблема? У меня такое ощущение, что то, что я делаю, не должно быть стандартной процедурой...
1 ответ
Как я и подозревал, Мариус подтвердил, что клиент и сервер не могут работать на одной машине. Так что я ждал подходящего времени, чтобы убить демона, чтобы он не работал одновременно с клиентом, запустил сервер только с -s
на хосте (который находится в совершенно другом месте, как спросил Мариус), запустился двунаправленный запрос на ВМ, и запрос прошел (Мысль момента: "Что за...").
А потом до меня дошло, я получаю проблему, только если сервер запущен как демон.
Я подтвердил свою гипотезу, протестировав сервер как демон, а не демон, а также поменялся ролями машин.
Сводка: если вы хотите использовать двунаправленные запросы, не запускайте сервер как демон.