Formato de salida Iperf CSV

9

Si uso iperf con los argumentos -y C y -r para probar la transferencia bidireccional y exportarlo como CSV.

Me sale algo pero el problema es que no sé cuáles son los nombres de las columnas. Por ejemplo, muestra tres filas de datos, pero no sé cuál corresponde enviar y cuál recibir.

Puedo adivinar las otras columnas, pero preferiría estar seguro.

¡No puedo encontrar esto documentado en ningún lado!

usuario350325
fuente

Respuestas:

10

Los campos son

marca de tiempo, dirección_origen, puerto_origen, dirección_destino, puerto_destino, intervalo, bytes transferidos, bits por segundo

Deduje esto mirando

$ 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

EDITAR: Puede encontrar el código fuente relevante aquí :

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

Mire el sexto campo suponiendo que "," (coma) sea un separador de campo. Entonces mira estas líneas aquí:

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 conexión de cliente -> servidor, luego "4" indica conexión de "servidor -> cliente" (mire los puertos de origen / destino para indicar, en este ejemplo particular dado por "sciurus".

Jacek Lakomiec
fuente
1

fecha y hora, IP de origen, puerto de origen, IP de destino, puerto de destino, número de proceso iperf, intervalo de tiempo, cantidad de datos transferidos (bytes), ancho de banda (bits por segundo), jitter (milisegundos), número de datagramas perdidos, número total de datagramas enviados, porcentaje de pérdida, número de datagramas recibidos fuera de servicio

Obtuve la información anterior de:

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

Víctor
fuente
1

La respuesta aceptada omite un campo impar: el que viene después de los pares de puertos IP + de origen y destino:

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

El código en la respuesta aceptada dice que proviene de la transferIDvariable. Algunas de las otras respuestas aquí parecen argumentar que representa un identificador de conexión o dirección de conexión. Sin embargo, una inmersión rápida a través del código indica que transferIDproviene de una variable global llamada groupID. Se inicializa a cero:

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

Sin embargo, una rápida revisión a través del código parece indicar que se incrementa y disminuye mucho, de manera muy confusa. No parece haber constantes definidas que digan lo que significa. La prueba manual ( iperf version 2.0.9 (9 Sept 2016) pthreads) muestra el número que se reutiliza entre las conexiones. Así que supongo que la moraleja de la historia es ... ¿ignorar ese número? O usa iperf3.

brenns10
fuente
0

Aquí hay una demostración simple que usa los valores CSV y se ejecuta en un bucle para verificar que se cumplan ciertos bps.

También descubrí que hay un campo adicional presente en las respuestas anteriores que tiene un valor de 3/4/5. 4 y 5 parecen ser dirección. 3 No estoy seguro de lo que significa. De todos modos, en caso de que esto ayude:

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