
Если я использую iperf с аргументами -y C и -r для проверки двунаправленной передачи и экспортирую ее как CSV.
Я получаю какой-то вывод, но проблема в том, что я не знаю, как называются столбцы. Например, он показывает три строки данных, но я не знаю, какая из них соответствует отправке, а какая — получению.
Остальные столбцы я могу предположить, но лучше быть уверенным.
Я не могу найти нигде документального подтверждения этому!
решение1
Поля есть
временная метка,исходный_адрес,исходный_порт,адрес_назначения,порт_назначения,интервал,переданные_байты,бит_в_секунду
Я пришел к такому выводу, посмотрев на
$ iperf -c localhost -r
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to localhost, TCP port 5001
TCP window size: 648 KByte (default)
------------------------------------------------------------
[ 5] local 127.0.0.1 port 54401 connected with 127.0.0.1 port 5001
[ 4] local 127.0.0.1 port 5001 connected with 127.0.0.1 port 54401
[ ID] Interval Transfer Bandwidth
[ 5] 0.0-10.0 sec 50.3 GBytes 43.2 Gbits/sec
[ 4] 0.0-10.0 sec 50.3 GBytes 43.2 Gbits/sec
$ iperf -c localhost -r -y C
20140114124826,127.0.0.1,54402,127.0.0.1,5001,5,0.0-10.0,52551090176,42041052917
20140114124826,127.0.0.1,5001,127.0.0.1,54402,4,0.0-10.0,52551090200,41999020136
EDIT: Вы можете найти соответствующий исходный кодздесь:
// TCP Reporting
printf( reportCSV_bw_format,
timestamp,
(stats->reserved_delay == NULL ? ",,," : stats->reserved_delay),
stats->transferID,
stats->startTime,
stats->endTime,
stats->TotalLen,
speed);
} else {
// UDP Reporting
printf( reportCSV_bw_jitter_loss_format,
timestamp,
(stats->reserved_delay == NULL ? ",,," : stats->reserved_delay),
stats->transferID,
stats->startTime,
stats->endTime,
stats->TotalLen,
speed,
stats->jitter*1000.0,
stats->cntError,
stats->cntDatagrams,
(100.0 * stats->cntError) / stats->cntDatagrams, stats->cntOutofOrder );
}
решение2
В принятом ответе пропущено одно лишнее поле: то, которое следует после пар IP+порт источника и назначения:
timestamp,
source_address,
source_port,
destination_address,
destination_port,
XXX, <---- this one
interval,
transferred_bytes,
bits_per_second
Код в принятом ответе говорит, что это происходит из transferID
переменной. Некоторые из других ответов здесь, кажется, утверждают, что это представляет идентификатор соединения или направление соединения. Однако быстрый просмотр кода показывает, что это transferID
происходит из глобальной переменной с именем groupID
. Этоинициализированк нулю:
// Global ID that we increment to be used
// as identifier for SUM reports
int groupID = 0;
Однако быстрый grep по коду, похоже, указывает на то, что он сильно увеличивается и уменьшается, что очень сбивает с толку. Кажется, нет никаких определенных констант, которые бы говорили, что это значит. Ручное тестирование ( iperf version 2.0.9 (9 Sept 2016) pthreads
) показывает, что число повторно используется между соединениями. Так что, полагаю, мораль истории такова... игнорировать это число? Или использовать iperf3.
решение3
дата и время, исходный IP-адрес, исходный порт, целевой IP-адрес, целевой порт, номер процесса iperf, временной интервал, объем переданных данных (байт), пропускная способность (бит в секунду), джиттер (миллисекунды), количество потерянных датаграмм, общее количество отправленных датаграмм, процент потерь, количество датаграмм, полученных не по порядку
Я получил вышеуказанную информацию от:
решение4
Ниже представлена простая демонстрация, использующая значения CSV и работающая в цикле для проверки соблюдения заданного значения bps.
Я также обнаружил, что в ответах выше есть дополнительное поле, которое имеет значение 3/4/5. 4 и 5, похоже, обозначают направление. 3 Я не уверен, что это значит. В любом случае, если это поможет:
#!/usr/bin/python
import sys
import subprocess
from subprocess import Popen
def runProcess(exe):
p = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(True):
retcode = p.poll() #returns None while subprocess is running
line = p.stdout.readline()
yield line
if(retcode is not None):
break
#
# do an iperf to a peer and check the bps calculated is at least
# what we asked for
#
def peer_run_until_target_bps_not_met (peer, sample_period, target_bps):
debug = 0
target_kbps = target_bps / 1024.0
target_mbps = target_bps / (1024.0 * 1024.0)
cmd = "iperf -c %s -t %d -i %d -y C" % (peer, sample_period, sample_period)
while (True):
bps=0
for line in runProcess(cmd.split()):
if line == "":
break
if (debug):
print "timestamp %s" % line.split(',')[0]
print "source_address %s" % line.split(',')[1]
print "source_port %s" % line.split(',')[2]
print "destination_address %s" % line.split(',')[3]
print "destination_port %s" % line.split(',')[4]
#
# "3" ???
# "5" indicates client -> server connection,
# "4" indicates "server -> client"
#
print "direction %s" % line.split(',')[5]
print "interval %s" % line.split(',')[6]
print "transferred_bytes %s" % line.split(',')[7]
print "bits_per_second %s" % line.split(',')[8]
transferred_bytes = float(line.split(',')[7])
bps = (transferred_bytes * 8) / float(sample_period)
kbps = bps / 1024.0
mbps = bps / (1024.0 * 1024.0)
print "OK: %12.2f bps / %10.2f Kbps / %10.2f Mbps (target %-10.2f Mbps)" % (bps, kbps, mbps, target_mbps)
if (bps < target_bps):
print "FAILED: need %.2f bps / %.2fKbps / %.2f Mbps" % \
(target_bps, target_kbps, target_mbps)
return
peer_run_until_target_bps_not_met("10.2.0.0", 5, 0.2 * 1024 * 1024) # 10 Mbps