
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 transferID
variable. 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 transferID
proviene 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:
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