Iperf CSV-Ausgabeformat

9

Wenn ich iperf mit den Argumenten -y C und -r verwende, um die bidirektionale Übertragung zu testen und als CSV zu exportieren.

Ich bekomme eine Ausgabe, aber das Problem ist, dass ich die Spaltennamen nicht kenne. Zum Beispiel zeigt es drei Datenzeilen, aber ich weiß nicht, welche dem Senden und welche dem Empfangen entsprechen.

Die anderen Spalten kann ich erraten, aber ich wäre mir lieber sicher.

Ich kann das nirgendwo dokumentiert finden!

user350325
quelle

Antworten:

10

Die Felder sind

Zeitstempel, Quelladresse, Quellport, Zieladresse, Zielport, Intervall, übertragene Bytes, Bits pro Sekunde

Ich folgerte dies durch einen Blick auf

$ 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: Den entsprechenden Quellcode finden Sie hier :

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

Schauen Sie sich das 6. Feld an und nehmen Sie an, dass "," (Komma) ein Feldtrennzeichen ist. Dann schauen Sie sich diese Zeilen hier an:

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" gibt die Client -> Server-Verbindung an, dann "4" die "Server -> Client" -Verbindung (siehe die Quell- / Ziel-Ports in diesem speziellen Beispiel von "sciurus").

Jacek Lakomiec
quelle
1

Datum und Uhrzeit, Quell-IP, Quell-Port, Ziel-IP, Ziel-Port, Iperf-Prozessnummer, Zeitintervall, übertragene Datenmenge (Bytes), Bandbreite (Bits pro Sekunde), Jitter (Millisekunden), Anzahl verlorener Datagramme, Gesamtzahl Anzahl der gesendeten Datagramme, prozentualer Verlust, Anzahl der nicht in der richtigen Reihenfolge empfangenen Datagramme

Ich habe die oben genannten Informationen erhalten von:

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

Sieger
quelle
1

Die akzeptierte Antwort überspringt ein ungerades Feld: das Feld, das nach den Quell- und Ziel-IP + -Port-Paaren kommt:

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

Der Code in der akzeptierten Antwort besagt, dass dies von der transferIDVariablen stammt. Einige der anderen Antworten hier scheinen zu argumentieren, dass es sich um eine Verbindungskennung oder eine Verbindungsrichtung handelt. Ein kurzer Blick durch den Code zeigt jedoch an, dass er transferIDvon einer globalen Variablen namens stammt groupID. Es wird auf Null initialisiert :

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

Ein kurzer Blick durch den Code scheint jedoch darauf hinzudeuten, dass er sehr verwirrend und stark dekrementiert ist. Es scheint keine definierten Konstanten zu geben, die sagen, was es bedeutet. Manuelles Testen ( iperf version 2.0.9 (9 Sept 2016) pthreads) zeigt die Nummer an, die zwischen Verbindungen wiederverwendet wird. Ich denke also, die Moral der Geschichte ist ... diese Zahl ignorieren? Oder verwenden Sie iperf3.

brenns10
quelle
0

Hier ist eine einfache Demo, die die CSV-Werte verwendet und in einer Schleife ausgeführt wird, um zu überprüfen, ob ein bestimmtes Bit erreicht wurde.

Ich habe auch festgestellt, dass in den obigen Antworten ein zusätzliches Feld vorhanden ist, dessen Wert 3/4/5 beträgt. 4 und 5 scheinen Richtung zu sein. 3 Ich bin mir nicht sicher, was es bedeutet. Wie auch immer, falls dies hilft:

#!/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
quelle