formato de saída CSP do Iperf

8

Se eu usar iperf com os argumentos -y C e -r para testar a transferência bidirecional e exportá-la como um arquivo CSV.

Eu recebo alguma saída, mas o problema é que não sei quais são os nomes das colunas. Por exemplo, mostra três linhas de dados, mas não sei qual corresponde ao envio e qual receber.

As outras colunas que eu posso imaginar, mas eu preferiria ter certeza.

Não consigo encontrar isto documentado em qualquer lugar!

    
por user350325 12.01.2014 / 15:59

5 respostas

9

Os campos são

timestamp, source_address, source_port, destination_address, destination_port, intervalo, transfer_bytes, bits_per_second

Eu deduzi isso olhando para

$ 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: Você pode encontrar o código-fonte relevante aqui :

// 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 );
} 
    
por 14.01.2014 / 19:54
1

Observe o 6º campo assumindo que "," (vírgula) é um separador de campo. Então olhe para estas linhas aqui:

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" indica cliente - > conexão com o servidor, então "4" indica a conexão "servidor - > cliente" (observe as portas de origem / destino para informar, neste exemplo específico dado por "sciurus".

    
por 15.01.2014 / 02:04
1

data e hora, IP de origem, porta de origem, IP de destino, porta de destino, número de processo iperf, intervalo de tempo, quantidade de dados transferidos (bytes), largura de banda (bits por segundo), jitter (milissegundos), número de datagramas perdidos , número total de datagramas enviados, porcentagem de perda, número de datagramas recebidos fora de ordem

Eu recebi as informações acima de:

link

    
por 05.06.2014 / 17:56
1

A resposta aceita pula um campo ímpar: o que vem depois dos pares de IP e porta de origem e destino:

timestamp,
source_address,
source_port,
destination_address,
destination_port,
XXX,                  <---- this one
interval,
transferred_bytes,
bits_per_second

O código na resposta aceita diz que isso vem da variável transferID . Algumas das outras respostas aqui parecem argumentar que representa um identificador de conexão ou direção de conexão. No entanto, um mergulho rápido no código indica que transferID vem de uma variável global denominada groupID . É inicializado como zero:

// Global ID that we increment to be used 
// as identifier for SUM reports
int groupID = 0;

No entanto, um rápido grep através do código parece indicar que ele é incrementado e decrementado muito, muito confuso. Não parece haver nenhuma constante definida que diga o que isso significa. O teste manual ( iperf version 2.0.9 (9 Sept 2016) pthreads ) mostra o número que está sendo reutilizado entre as conexões. Então eu acho que a moral da história é ... ignorar esse número? Ou use o iperf3.

    
por 20.04.2017 / 17:40
0

Aqui está uma demonstração simples usando os valores de CSV e executando em uma verificação de loop para um determinado bps sendo atendido.

Eu também descobri que há um campo extra presente nas respostas acima, que tem 3/4/5 de valor. 4 e 5 parecem ser direção. 3 Não tenho certeza do que isso significa. De qualquer forma, caso isso ajude:

#!/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
    
por 28.05.2015 / 20:50

Tags