Formato de salida Iperf CSV

Formato de salida Iperf CSV

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

Obtengo algunos resultados, 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.

Las otras columnas las puedo adivinar, pero prefiero estar seguro.

¡No puedo encontrar esto documentado en ninguna parte!

Respuesta1

Los campos son

marca de tiempo, dirección_origen, puerto_origen, dirección_destino, puerto_destino, intervalo, bytes_transferidos, bits_por_segundo

Esto lo deduje 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 relevanteaquí:

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

Respuesta2

La respuesta aceptada omite un campo impar: el que viene después de los pares IP+puerto 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 esto proviene de la transferIDvariable. Algunas de las otras respuestas aquí parecen argumentar que representa un identificador de conexión o una dirección de conexión. Sin embargo, una inmersión rápida en el código indica que transferIDproviene de una variable global llamada groupID. Esinicializadoa cero:

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

Sin embargo, una revisión rápida 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 conexiones. Así que supongo que la moraleja de la historia es... ¿ignorar ese número? O utilice iperf3.

Respuesta3

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), fluctuación (milisegundos), número de datagramas perdidos, número total de datagramas enviados, porcentaje de pérdida, número de datagramas recibidos fuera de orden

Obtuve la información anterior de:

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

Respuesta4

Aquí hay una demostración simple que utiliza los valores CSV y se ejecuta en un bucle para verificar que se cumpla un bps determinado.

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

información relacionada