
Se eu usar iperf com argumentos -y C e -r para testar a transferência bidirecional e exportá-la como CSV.
Recebo alguns resultados, mas o problema é que não sei quais são os nomes das colunas. Por exemplo mostra três linhas de dados mas não sei qual corresponde enviar e qual receber.
As outras colunas eu posso adivinhar, mas prefiro ter certeza.
Não consigo encontrar isso documentado em lugar nenhum!
Responder1
Os campos são
carimbo de data / hora, endereço_de_fonte, porta_de_fonte, endereço_de_destino, porta_de_destino, intervalo, bytes_transferidos, bits_por_segundo
Eu deduzi isso olhando
$ 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: Você pode encontrar o código-fonte relevanteaqui:
// 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 );
}
Responder2
A resposta aceita pula um campo ímpar: aquele que vem depois dos pares IP+porta de origem e destino:
timestamp,
source_address,
source_port,
destination_address,
destination_port,
XXX, <---- this one
interval,
transferred_bytes,
bits_per_second
O código na resposta aceita diz que isso vem da transferID
variável. Algumas das outras respostas aqui parecem argumentar que representa um identificador de conexão ou direção de conexão. No entanto, uma rápida análise do código indica que ele transferID
vem de uma variável global chamada groupID
. Isso éinicializadopara zero:
// Global ID that we increment to be used
// as identifier for SUM reports
int groupID = 0;
No entanto, um rápido grep no código parece indicar que ele é incrementado e decrementado muito, de forma muito confusa. Não parece haver nenhuma constante definida que diga o que isso significa. O teste manual ( iperf version 2.0.9 (9 Sept 2016) pthreads
) mostra o número que está sendo reutilizado entre as conexões. Então acho que a moral da história é... ignorar esse número? Ou use iperf3.
Responder3
data e hora, IP de origem, porta de origem, IP de destino, porta de destino, número do processo iperf, intervalo de tempo, quantidade de dados transferidos (bytes), largura de banda (bits por segundo), jitter (milissegundos), número de datagramas perdidos, número total de datagramas enviados, perda percentual, número de datagramas recebidos fora de ordem
Peguei as informações acima de:
Responder4
Aqui está uma demonstração simples usando os valores CSV e executando em um loop verificando se um determinado bps está sendo atingido.
Também descobri que há um campo extra presente nas respostas acima, com valor 3/4/5. 4 e 5 parecem ser a direção. 3 Não tenho certeza do que isso significa. De qualquer forma, caso isso ajude:
#!/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