Format de sortie CSV Iperf

10

Si j'utilise iperf avec les arguments -y C et -r pour tester le transfert bidirectionnel et l'exporter en tant que CSV.

J'obtiens une sortie mais le problème est que je ne sais pas quels sont les noms des colonnes. Par exemple, il montre trois lignes de données, mais je ne sais pas ce qui correspond à l'envoi et à la réception.

Je peux deviner les autres colonnes, mais je préfère en être sûr.

Je ne trouve cela documenté nulle part!

user350325
la source

Réponses:

10

Les champs sont

horodatage, adresse_source, port_source, adresse_destination, port_destination, intervalle, octets_transférés, bits_par_seconde

J'ai déduit cela en regardant

$ 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: Vous pouvez trouver le code source pertinent ici :

// 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
la source
2

La réponse acceptée saute un champ impair: celui qui vient après les paires source + destination IP + ports:

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

Le code dans la réponse acceptée indique que cela vient de la transferIDvariable. Certaines des autres réponses ici semblent faire valoir qu'il représente un identifiant de connexion ou une direction de connexion. Cependant, une plongée rapide dans le code indique que cela transferIDprovient d'une variable globale nommée groupID. Il est initialisé à zéro:

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

Cependant, un rapide grep à travers le code semble indiquer qu'il est incrémenté et décrémenté beaucoup, très confus. Il ne semble pas y avoir de constantes définies qui disent ce que cela signifie. Les tests manuels ( iperf version 2.0.9 (9 Sept 2016) pthreads) indiquent le nombre réutilisé entre les connexions. Donc je suppose que la morale de l'histoire est ... ignorer ce nombre? Ou utilisez iperf3.

brenns10
la source
1

Regardez le 6ème champ en supposant que "," (virgule) est un séparateur de champ. Regardez ces lignes ici:

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" indique la connexion client -> serveur, puis "4" indique la connexion "serveur -> client" (regardez les ports source / destination pour le dire, dans cet exemple particulier donné par "sciurus".

Jacek Lakomiec
la source
1

date et heure, IP source, port source, IP de destination, port de destination, numéro de processus iperf, intervalle de temps, quantité de données transférées (octets), bande passante (bits par seconde), gigue (millisecondes), nombre de datagrammes perdus, nombre total de datagrammes envoyés, pourcentage de perte, nombre de datagrammes reçus en panne

J'ai obtenu les informations ci-dessus de:

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

Victor
la source
0

Voici une démonstration simple utilisant les valeurs CSV et s'exécutant dans une boucle vérifiant qu'un bps donné soit respecté.

J'ai également trouvé qu'il y avait un champ supplémentaire présent dans les réponses ci-dessus qui est 3/4/5 en valeur. 4 et 5 semblent être une direction. 3 Je ne sais pas ce que cela signifie. Quoi qu'il en soit, au cas où cela aiderait:

#!/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
la source