Formato de saída Iperf CSV

9

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

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 a enviar e qual a receber.

Posso adivinhar as outras colunas, mas prefiro ter certeza.

Não consigo encontrar isso documentado em nenhum lugar!

user350325
fonte

Respostas:

10

Os campos são

registro de data e hora, endereço de origem, endereço de origem, endereço de destino, porto de destino, intervalo, bytes transferidos, bits_per_segundo

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 );
} 
sciurus
fonte
1

Observe o sexto campo assumindo "," (vírgula) como um separador de campos. 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 conexão cliente -> servidor, e "4" indica conexão "servidor -> cliente" (observe as portas de origem / destino para dizer, neste exemplo específico fornecido por "sciurus".

Jacek Lakomiec
fonte
1

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

Eu obtive as informações acima em:

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

Vencedor
fonte
1

A resposta aceita ignora um campo ímpar: aquele que vem depois dos pares de portas IP + 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 transferIDvariável. Algumas das outras respostas aqui parecem argumentar que representa um identificador de conexão ou direção de conexão. No entanto, um rápido mergulho no código indica que transferIDvem de uma variável global chamada groupID. É inicializado com zero:

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

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

brenns10
fonte
0

Aqui está uma demonstração simples usando os valores de CSV e executando em um loop verificando se um determinado bps está sendo cumprido.

Também descobri que há um campo extra presente nas respostas acima, cujo valor é 3/4/5. 4 e 5 parecem ser direção. 3 Não sei ao certo o 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
Neil McGill
fonte