Si j'utilise IPERF avec -y C et -R arguments pour tester le transfert bidirectionnel et l'exporter en tant que CSV.
Je reçois une sortie, mais le problème est que je ne sais pas ce que sont les noms de colonne. Par exemple, il montre trois rangées de données mais je ne sais pas qui correspond à envoyer et à recevoir.
Les autres colonnes que je peux deviner, mais je préférerais être sûr.
Je ne trouve pas cela documenté nulle part!
Les champs sont
horodatage, source_address, source_port, destination_address, destination_port, intervalle, transfert_bytes, bits_per_second
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 correspondant 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 );
}
Regardez le 6ème champ en supposant "," (virgule) étant un séparateur de terrain. Ensuite, 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 le client -> Connexion du serveur, puis "4" Indique la connexion "Server -> Client" (regardez les ports source/destination à raconter, dans cet exemple particulier donné par "Sciurus".
La réponse acceptée saute un champ étrange: celui qui vient après la source et la destination IP + Pair Pairs:
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 dit que cela provient de la variable transferID
. Certaines des autres réponses ici semblent affirmer que cela représente une identification de connexion ou une direction de connexion. Cependant, une plongée rapide via le code indique que transferID
provient d'une variable globale nommée groupID
. C'est initialisé à zéro:
// Global ID that we increment to be used
// as identifier for SUM reports
int groupID = 0;
Cependant, un GRE rapide à travers le code semble indiquer qu'elle est incrémentée et décrémentée beaucoup, très confortablement. Il ne semble pas y avoir de constantes définies qui disent ce que cela signifie. Test manuel (iperf version 2.0.9 (9 Sept 2016) pthreads
) montre que le nombre étant réutilisé entre les connexions. Donc, je suppose que la morale de l'histoire est ... ignorer ce nombre? Ou utiliser iperf3.
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 des datagrammes envoyées, perte en pourcentage, nombre de datagrammes reçus en dehors de l'ordre
J'ai eu les informations ci-dessus de:
Voici une simple démo utilisant les valeurs CSV et fonctionnant dans une vérification de la boucle pour un BPS donné en cours de rencontre.
J'ai également trouvé qu'il y a un champ supplémentaire présent des réponses ci-dessus qui est 3/4/5 en valeur. 4 et 5 semblent être des directives. 3 Je ne suis pas sûr de ce que cela signifie. Quoi qu'il en soit, au cas où cela aide:
#!/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