-y Cおよび-r引数を指定してiperfを使用して双方向転送をテストし、CSVとしてエクスポートした場合。
一部の出力が表示されますが、問題は、列名が何であるかわからないことです。たとえば、3行のデータが表示されていますが、どちらが送信に対応し、どれが受信に対応するのかわかりません。
他の列は推測できますが、どちらかといえば確かです。
このドキュメントはどこにも見つかりません。
-y Cおよび-r引数を指定してiperfを使用して双方向転送をテストし、CSVとしてエクスポートした場合。
一部の出力が表示されますが、問題は、列名が何であるかわからないことです。たとえば、3行のデータが表示されていますが、どちらが送信に対応し、どれが受信に対応するのかわかりません。
他の列は推測できますが、どちらかといえば確かです。
このドキュメントはどこにも見つかりません。
回答:
フィールドは
タイムスタンプ、source_address、source_port、destination_address、destination_port、interval、transferred_bytes、bits_per_second
私はこれを見て、
$ 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
編集:ここで関連するソースコードを見つけることができます:
// 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 );
}
"、"(コンマ)をフィールド区切り文字と想定して、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"で示される送信元/宛先ポートを確認してください)。
日時、送信元IP、送信元ポート、宛先IP、宛先ポート、iperfプロセス番号、時間間隔、転送されたデータ量(バイト)、帯域幅(ビット/秒)、ジッター(ミリ秒)、失われたデータグラムの数、合計数送信されたデータグラムの割合、損失の割合、順不同で受信されたデータグラムの数
私は上記の情報を以下から得ました:
受け入れられた回答は1つの奇妙なフィールドをスキップします:送信元と宛先の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;
ただし、コードをすばやくgrepすると、非常に混乱して、コードが大幅に増加および減少していることがわかります。それが何を意味するかを表す定義された定数はないようです。手動テスト(iperf version 2.0.9 (9 Sept 2016) pthreads
)は、接続間で再利用されている数を示します。だから私は物語の教訓は...その数を無視していると思いますか?または、iperf3を使用します。
以下は、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