Format wyjściowy Iperf CSV

10

Jeśli użyję iperf z argumentami -y C i -r do przetestowania transferu dwukierunkowego i wyeksportowania go jako CSV.

Dostaję dane wyjściowe, ale problem polega na tym, że nie wiem, jakie są nazwy kolumn. Na przykład pokazuje trzy wiersze danych, ale nie wiem, który odpowiada wysłać, a który odebrać.

Inne kolumny mogę odgadnąć, ale wolałbym być pewien.

Nigdzie nie mogę tego znaleźć!

użytkownik350325
źródło

Odpowiedzi:

10

Pola są

znacznik czasu, adres_źródłowy, port_źródłowy, adres_ docelowy, port_ docelowy, interwał, przesłane bajty, bit_pertuaru

Wydedukowałem to, patrząc na

$ 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

EDYCJA: Odpowiedni kod źródłowy można znaleźć tutaj :

// 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
źródło
2

Akceptowana odpowiedź pomija jedno nieparzyste pole: to, które występuje po źródłowym i docelowym parze IP + port:

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

Kod w zaakceptowanej odpowiedzi mówi, że pochodzi on od transferIDzmiennej. Niektóre inne odpowiedzi tutaj wydają się dowodzić, że reprezentuje identyfikator połączenia lub kierunek połączenia. Jednak szybkie zanurzenie się w kodzie wskazuje, że transferIDpochodzi on od zmiennej globalnej o nazwie groupID. Jest inicjowany do zera:

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

Jednak szybkie grep przez kod wydaje się wskazywać, że jest on zwiększany i zmniejszany bardzo, bardzo myląco. Wydaje się, że nie ma zdefiniowanych stałych, które mówią, co to znaczy. Testowanie ręczne ( iperf version 2.0.9 (9 Sept 2016) pthreads) pokazuje liczbę ponownie wykorzystywaną między połączeniami. Więc chyba morał tej historii jest ... zignorować tę liczbę? Lub użyj iperf3.

brenns10
źródło
1

Spójrz na szóste pole, zakładając, że „,” (przecinek) jest separatorem pól. Następnie spójrz na te linie tutaj:

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” oznacza połączenie klient -> serwer, a następnie „4” oznacza połączenie „serwer -> klient” (spójrz na porty źródłowy / docelowy w tym konkretnym przykładzie podanym przez „sciurus”).

Jacek Lakomiec
źródło
1

data i godzina, źródłowy adres IP, port źródłowy, docelowy adres IP, port docelowy, numer procesu iperf, przedział czasu, ilość przesłanych danych (bajty), przepustowość (bitów na sekundę), fluktuacje (milisekundy), liczba utraconych datagramów, liczba całkowita wysłanych datagramów, procentowa utrata, liczba datagramów otrzymanych poza kolejnością

Otrzymałem powyższe informacje od:

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

Zwycięzca
źródło
0

Oto prosta wersja demonstracyjna wykorzystująca wartości CSV i działająca w pętli sprawdzająca, czy dany bps jest spełniony.

Odkryłem również, że w odpowiedziach powyżej jest dodatkowe pole, które ma wartość 3/4/5. 4 i 5 wydają się być kierunkiem. 3 Nie jestem pewien, co to znaczy. W każdym razie, jeśli pomoże to:

#!/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
źródło