ここだと一番確実に残るのでここにメモメモ
iperfで10GbEな実験
パラメータ設定はethの番号(1箇所)に注意しつつも基本的にコピペでOK, 順不同こんな感じで
setpci -d 8086:1048 e6.b=2e ifconfig eth0 mtu 16080 txqueuelen 50000 up echo 0 > /proc/sys/net/ipv4/tcp_timestamps echo 0 > /proc/sys/net/ipv4/tcp_sack echo 20000000 20000000 20000000 > /proc/sys/net/ipv4/tcp_rmem echo 20000000 20000000 20000000 > /proc/sys/net/ipv4/tcp_wmem echo 20000000 20000000 20000000 > /proc/sys/net/ipv4/tcp_mem echo 16777216 > /proc/sys/net/core/rmem_max echo 16777216 > /proc/sys/net/core/wmem_max echo 16777216 > /proc/sys/net/core/rmem_default echo 16777216 > /proc/sys/net/core/wmem_default echo 16777216 > /proc/sys/net/core/optmem_max echo 16777216 > /proc/sys/net/core/netdev_max_backlog export TCP_WINDOW_SIZE=256m export IPERF_LEN=16000
iperfは-bオプションをソースの1箇所を変えるだけで出来る, 演算の順番に注意しながら単位をbitからbyteに内部的に8倍のScaleをかける改造をかけておく
iperfの-bなんて適当に大きい値をかけておけば問題はないのでこんな感じで起動
iperf サーバ-s UDP-u iperf クライアント-c 相手のホストに10GbEの線経由でいくように設定したnameenshu3-1gb バンド幅, 結構いい加減に設定…つーか8Gbpsちょいぐらいの数字(単位はbyte per sec)-b 1073741824 0.5秒ごとに結果報告, 気分の問題-i 0.5
これはUDPでの測定の場合
一応目標(?)の4Gbpsは出たけど…である
WARNING: option -b implies udp testing ------------------------------------------------------------ Client connecting to enshu3-1gb, UDP port 5001 Sending 16000 byte datagrams UDP buffer size: 32.0 MByte (WARNING: requested 256 MByte) ------------------------------------------------------------ [ 3] local 192.168.0.2 port 32769 connected with 192.168.0.1 port 5001 [ ID] Interval Transfer Bandwidth [ 3] -0.0- 0.5 sec 248 MBytes 4.16 Gbits/sec [ 3] 0.5- 1.0 sec 247 MBytes 4.14 Gbits/sec [ 3] 1.0- 1.5 sec 245 MBytes 4.11 Gbits/sec [ 3] 1.5- 2.0 sec 244 MBytes 4.09 Gbits/sec [ 3] 2.0- 2.5 sec 245 MBytes 4.12 Gbits/sec [ 3] 2.5- 3.0 sec 245 MBytes 4.11 Gbits/sec [ 3] 3.0- 3.5 sec 246 MBytes 4.12 Gbits/sec [ 3] 3.5- 4.0 sec 246 MBytes 4.12 Gbits/sec [ 3] 4.0- 4.5 sec 246 MBytes 4.13 Gbits/sec [ 3] 4.5- 5.0 sec 245 MBytes 4.12 Gbits/sec [ 3] 5.0- 5.5 sec 246 MBytes 4.13 Gbits/sec [ 3] 5.5- 6.0 sec 246 MBytes 4.12 Gbits/sec [ 3] 6.0- 6.5 sec 247 MBytes 4.14 Gbits/sec [ 3] 6.5- 7.0 sec 247 MBytes 4.14 Gbits/sec [ 3] 7.0- 7.5 sec 246 MBytes 4.13 Gbits/sec [ 3] 7.5- 8.0 sec 246 MBytes 4.13 Gbits/sec [ 3] 8.0- 8.5 sec 246 MBytes 4.13 Gbits/sec [ 3] 8.5- 9.0 sec 246 MBytes 4.12 Gbits/sec [ 3] 9.0- 9.5 sec 246 MBytes 4.12 Gbits/sec [ 3] 9.5-10.0 sec 245 MBytes 4.12 Gbits/sec [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 4.80 GBytes 4.13 Gbits/sec [ 3] Server Report: [ 3] 0.0-10.0 sec 4.74 GBytes 4.07 Gbits/sec 0.027 ms 4443/322316 (1.4%) [ 3] Sent 322316 datagrams
とりあえず妙に安定して4Gbpsを叩き出している
次はTCP単線
コマンドと結果はこんな感じ
iperf -s iperf -c enshu3-1gb -i 0.5
------------------------------------------------------------ Client connecting to enshu3-1gb, TCP port 5001 TCP window size: 32.0 MByte (WARNING: requested 256 MByte) ------------------------------------------------------------ [ 3] local 192.168.0.2 port 32803 connected with 192.168.0.1 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0- 0.5 sec 212 MBytes 3.55 Gbits/sec [ 3] 0.5- 1.0 sec 210 MBytes 3.52 Gbits/sec [ 3] 1.0- 1.5 sec 186 MBytes 3.11 Gbits/sec [ 3] 1.5- 2.0 sec 204 MBytes 3.42 Gbits/sec [ 3] 2.0- 2.5 sec 206 MBytes 3.45 Gbits/sec [ 3] 2.5- 3.0 sec 206 MBytes 3.46 Gbits/sec [ 3] 3.0- 3.5 sec 207 MBytes 3.47 Gbits/sec [ 3] 3.5- 4.0 sec 204 MBytes 3.42 Gbits/sec [ 3] 4.0- 4.5 sec 206 MBytes 3.46 Gbits/sec [ 3] 4.5- 5.0 sec 207 MBytes 3.47 Gbits/sec [ 3] 5.0- 5.5 sec 204 MBytes 3.42 Gbits/sec [ 3] 5.5- 6.0 sec 206 MBytes 3.46 Gbits/sec [ 3] 6.0- 6.5 sec 207 MBytes 3.47 Gbits/sec [ 3] 6.5- 7.0 sec 203 MBytes 3.41 Gbits/sec [ 3] 7.0- 7.5 sec 205 MBytes 3.45 Gbits/sec [ 3] 7.5- 8.0 sec 207 MBytes 3.47 Gbits/sec [ 3] 8.0- 8.5 sec 203 MBytes 3.41 Gbits/sec [ 3] 8.5- 9.0 sec 206 MBytes 3.45 Gbits/sec [ 3] 9.0- 9.5 sec 206 MBytes 3.46 Gbits/sec [ 3] 9.5-10.0 sec 204 MBytes 3.41 Gbits/sec [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 4.00 GBytes 3.44 Gbits/sec
で, こっちは4本接続の場合
iperf -c enshu3-1gb -i 0.5 -P 4行数節約 | grep SUM
[SUM] 0.0- 0.5 sec 247 MBytes 4.14 Gbits/sec [SUM] 0.5- 1.0 sec 224 MBytes 3.76 Gbits/sec [SUM] 1.0- 1.5 sec 213 MBytes 3.57 Gbits/sec [SUM] 1.5- 2.0 sec 203 MBytes 3.41 Gbits/sec [SUM] 2.0- 2.5 sec 205 MBytes 3.43 Gbits/sec [SUM] 2.5- 3.0 sec 216 MBytes 3.62 Gbits/sec [SUM] 3.0- 3.5 sec 209 MBytes 3.50 Gbits/sec [SUM] 3.5- 4.0 sec 214 MBytes 3.59 Gbits/sec [SUM] 4.0- 4.5 sec 210 MBytes 3.53 Gbits/sec [SUM] 4.5- 5.0 sec 208 MBytes 3.48 Gbits/sec [SUM] 5.0- 5.5 sec 209 MBytes 3.51 Gbits/sec [SUM] 5.5- 6.0 sec 208 MBytes 3.48 Gbits/sec [SUM] 6.0- 6.5 sec 203 MBytes 3.40 Gbits/sec [SUM] 6.5- 7.0 sec 195 MBytes 3.27 Gbits/sec [SUM] 7.0- 7.5 sec 213 MBytes 3.58 Gbits/sec [SUM] 7.5- 8.0 sec 208 MBytes 3.49 Gbits/sec [SUM] 8.0- 8.5 sec 207 MBytes 3.47 Gbits/sec [SUM] 8.5- 9.0 sec 207 MBytes 3.47 Gbits/sec [SUM] 9.0- 9.5 sec 210 MBytes 3.53 Gbits/sec [SUM] 9.5-10.0 sec 202 MBytes 3.39 Gbits/sec [SUM] 0.0-10.2 sec 4.11 GBytes 3.47 Gbits/sec
最初にだけ4Gbps出ている傾向だけは変わらないのでちょっと弄れば上手くいくのだろうか
とりあえず現状のレポートなのである
因みにnetstat -iの結果からするとボトルネックはいまだに送信側にある模様
次は何を弄れば…
ちょっとしたきっかけからSPARCの内部レジスタの値を読み出すと言うことを実装しようとする
制限はV8系列のコードで書くということ, V9にすると簡単なんだけど, それだと色々なところに問題をきたしてしまうのだ
まずはその目的を果たすことができるレジスタを探す, この辺は当たり前のことではあるが日本語の情報源が少ない, 結果, 英語情報を個人的には情報量の限度はあるが, 取捨選択が比較的短時間で終わる日本語の方が先に当たる価値があると思う, 往々にして外れはするけれど…渡り歩く羽目になる
とりあえずはアセンブラで何とかする方法を探す, そしてその後でそれをインラインアセンブリなんて使ったことないですインラインアセンブリにする方法を模索する
当然こんなことを一人でしたわけではなく, メインでやっていた人がいるのだがこの辺は書いてもいいのか微妙なのであえて伏せてみることに
で, 一通り完成したのは良いが, そこからx86, IA64, i386_64, Powerと, 対応CPUを広げる作業を行う, この辺は完全に趣味の世界, こんなに多くの種類のアセンブラコードを見たのは初めて… たった一つのことでもアセンブラにした途端色々な実現コードに変化するというのは結構面白かった
結局夕食の関係で最後までは見ていられなかったが, 結局V9版のコードもしっかりと搭載する予定の模様, 後日結果物を見てみたいものである