Назад | Перейти на главную страницу

Формат вывода Iperf CSV

Если я использую iperf с аргументами -y C и -r для проверки двунаправленной передачи и экспорта ее как CSV.

Я получаю некоторые результаты, но проблема в том, что я не знаю, каковы имена столбцов. Например, он показывает три строки данных, но я не знаю, что соответствует отправке, а что - получению.

Остальные столбцы я догадываюсь, но лучше буду уверен.

Я нигде не могу найти это задокументировано!

Поля

отметка времени, исходный_адрес, исходный_порт, целевой_адрес, целевой_порт, интервал, переданные_байты, биты_за_секунду

Я пришел к выводу, глядя на

$ 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

РЕДАКТИРОВАТЬ: вы можете найти соответствующий исходный код Вот:

// 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 );
} 

В принятом ответе пропущено одно нечетное поле: то, что идет после пар исходный и целевой 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.

Посмотрите на 6-е поле, предполагая, что "," (запятая) является разделителем полей. Тогда посмотрите на эти строки здесь:

Server listening on TCP port 5001
------------------------------------------------------------
Client connecting to localhost, TCP port 5001

[ 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

"5" указывает соединение клиент -> сервер, затем "4" указывает соединение "сервер -> клиент" (посмотрите на порты источника / назначения, чтобы сказать, в этом конкретном примере, предоставленном "sciurus".

дата и время, IP-адрес источника, порт источника, IP-адрес назначения, порт назначения, номер процесса iperf, временной интервал, объем переданных данных (байты), полоса пропускания (бит в секунду), джиттер (миллисекунды), количество потерянных дейтаграмм, общее количество отправленных дейтаграмм, процент потерь, количество вышедших из строя дейтаграмм

Я получил вышеуказанную информацию от:

http://www.jb.man.ac.uk/~jcullen/code/python/iperf_tests.py

Вот простая демонстрация, использующая значения CSV и работающая в цикле, проверяющем соответствие заданному бит / с.

Я также обнаружил, что из приведенных выше ответов присутствует дополнительное поле, значение которого составляет 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