Формат виводу CSV Iperf


10

Якщо я використовую iperf з аргументами -y C і -r, щоб перевірити двонаправлену передачу та експортувати її як CSV.

Я отримую деякий вихід, але проблема полягає в тому, що я не знаю, що таке назви стовпців. Наприклад, він показує три рядки даних, але я не знаю, який відповідає надіслати і який отримати.

Інші колонки я можу здогадатися, але я скоріше буду впевнений.

Я не можу знайти це документально ніде!

Відповіді:


10

Поля є

часова мітка, джерело_адреса, джерело_порту, адреса призначення, адреса призначення, інтервал, перенесені_байти, біт_пер_секунда

Я вивів це, подивившись

$ 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: Відповідний вихідний код ви можете знайти тут :

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

2

Прийнята відповідь пропускає одне непарне поле: те, що приходить після пар вихідного та призначення IP + портів:

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

Код у прийнятій відповіді говорить, що це походить від transferIDзмінної. Деякі інші відповіді тут, схоже, стверджують, що він являє собою ідентифікатор з'єднання або напрям з'єднання. Однак швидке занурення через код вказує на те, що transferIDпоходить від глобальної змінної з назвою groupID. Він ініціалізується до нуля:

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

Однак, швидке схвалення коду, схоже, вказує на те, що він значно збільшується та зменшується, дуже заплутано. Здається, немає визначених констант, які б сказали, що це означає. Ручне тестування ( iperf version 2.0.9 (9 Sept 2016) pthreads) показує кількість повторного використання між з'єднаннями. Тож я здогадуюсь, мораль історії полягає в тому, щоб ... ігнорувати це число? Або використовуйте iperf3.


1

Подивіться на 6-е поле, припускаючи, що "," (кома) є роздільником поля. Потім подивіться на ці рядки тут:

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" вказує підключення клієнт -> сервер, потім "4" вказує "з'єднання - сервер -> клієнт" (дивіться на порти джерела / місця призначення, щоб сказати, у цьому конкретному прикладі, наданому "sciurus".


1

дата і час, IP-код джерела, порт джерела, IP-адреса призначення, порт призначення, номер процесу iperf, часовий інтервал, кількість переданих даних (байти), пропускна здатність (біти в секунду), тремтіння (мілісекунд), кількість втрачених дейтаграм, загальна кількість відправлених дейтаграм, відсоткові втрати, кількість дейтаграм, отриманих поза замовленням

Отриману вище інформацію я отримав від:

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


0

Ось проста демонстрація з використанням значень CSV та запуску в циклі, перевіряючи, чи заданий bps виконується.

Я також виявив, що додаткове поле присутнє в відповідях вище, що має значення 3/4/5. 4 і 5, здається, є напрямком. 3 Я не впевнений, що це означає. У будь-якому випадку, якщо це допоможе:

#!/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.