Formato di output CSV Iperf


10

Se uso iperf con argomenti -y C e -r per testare il trasferimento bidirezionale ed esportarlo come CSV.

Ottengo un po 'di output ma il problema è che non so quali siano i nomi delle colonne. Ad esempio mostra tre file di dati ma non so quale corrisponda a inviare e quale ricevere.

Le altre colonne posso indovinare, ma preferirei esserne sicuro.

Non riesco a trovare questo documentato da nessuna parte!

Risposte:


10

I campi sono

timestamp, source_address, SOURCE_PORT, destination_address, DESTINATION_PORT, intervallo, transferred_bytes, bits_per_second

L'ho dedotto guardando

$ 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: Puoi trovare il codice sorgente pertinente qui :

// 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

La risposta accettata salta un campo dispari: quello che segue le coppie di porte IP + di origine e destinazione:

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

Il codice nella risposta accettata dice che questo deriva dalla transferIDvariabile. Alcune delle altre risposte qui sembrano sostenere che rappresenta un identificatore di connessione o una direzione di connessione. Tuttavia, una rapida immersione nel codice indica che transferIDproviene da una variabile globale denominata groupID. Viene inizializzato su zero:

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

Tuttavia, un rapido grep attraverso il codice sembra indicare che è incrementato e decrementato molto, in modo molto confuso. Non sembra esserci alcuna costante definita che dica cosa significa. Il test manuale ( iperf version 2.0.9 (9 Sept 2016) pthreads) mostra il numero che viene riutilizzato tra le connessioni. Quindi immagino che la morale della storia sia ... ignorare quel numero? Oppure usa iperf3.


1

Guarda il sesto campo supponendo che "," (virgola) sia un separatore di campo. Quindi guarda queste righe qui:

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 la connessione client -> server, quindi "4" indica la connessione "server -> client" (vedere le porte di origine / destinazione per dirlo, in questo esempio dato da "sciurus".


1

data e ora, IP di origine, porta di origine, IP di destinazione, porta di destinazione, numero di processo iperf, intervallo di tempo, quantità di dati trasferiti (byte), larghezza di banda (bit al secondo), jitter (millisecondi), numero di datagrammi persi, numero totale di datagrammi inviati, perdita percentuale, numero di datagrammi ricevuti fuori servizio

Ho ottenuto le informazioni di cui sopra da:

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


0

Ecco una semplice demo che utilizza i valori CSV e si esegue in un ciclo verificando che un determinato bps sia soddisfatto.

Ho anche scoperto che nelle risposte sopra è presente un campo aggiuntivo che ha un valore di 3/4/5. 4 e 5 sembrano essere la direzione. 3 Non sono sicuro di cosa significhi. In ogni caso, nel caso ciò aiuti:

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.