Iperf CSV-Ausgabeformat

Iperf CSV-Ausgabeformat

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. Beispielsweise werden drei Datenzeilen angezeigt, aber ich weiß nicht, welche dem Senden und welche dem Empfangen entspricht.

Bei den anderen Spalten kann ich eine Vermutung anstellen, aber ich möchte lieber sichergehen.

Ich kann dies nirgends dokumentiert finden!

Antwort1

Die Felder sind

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

Ich habe dies gefolgert 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 SieHier:

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

Antwort2

Die akzeptierte Antwort überspringt ein ungerades Feld: dasjenige, 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 transferIDVariable stammt. Einige der anderen Antworten hier scheinen zu argumentieren, dass es eine Verbindungskennung oder Verbindungsrichtung darstellt. Ein kurzer Blick auf den Code zeigt jedoch, dass dies transferIDvon einer globalen Variable namens stammt groupID. Es istinitialisiertbis Null:

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

Ein schnelles Durchsehen des Codes scheint jedoch darauf hinzudeuten, dass er sehr verwirrend häufig inkrementiert und dekrementiert wird. Es scheint keine definierten Konstanten zu geben, die angeben, was das bedeutet. Manuelle Tests ( iperf version 2.0.9 (9 Sept 2016) pthreads) zeigen, dass die Zahl zwischen Verbindungen wiederverwendet wird. Die Moral der Geschichte ist also wohl: Diese Zahl ignorieren? Oder iperf3 verwenden.

Antwort3

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 gesendeter Datagramme, Verlust in Prozent, Anzahl in der falschen Reihenfolge empfangener Datagramme

Die obigen Informationen habe ich von:

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

Antwort4

Hier ist eine einfache Demo, die die CSV-Werte verwendet und in einer Schleife ausgeführt wird, um zu prüfen, ob eine bestimmte bps-Zahl erreicht wird.

Ich habe auch festgestellt, dass es in den obigen Antworten ein zusätzliches Feld mit den Werten 3/4/5 gibt. 4 und 5 scheinen die Richtung zu sein. 3, ich bin mir nicht sicher, was es bedeutet. Falls das 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

verwandte Informationen