回線速度の計測 ( その2 )
回線速度の計測 の続き。
Linux サーバ側で、ローカル・ループバックに送ってみました。
[localhost]$ java SpeedTest client localhost 9999 145 187 874 1507 7417 14891 73285 3615779.3103448274 4.485886631016043E7 4.798974828375286E7 5.566428666224287E7 5.654987191586895E7 5.63334094419448E7 5.723277614791567E7 4.603496258174721E7
50Mbps くらい。伝送効率 0.5 というのは低いですが、ありえない値という程でもないですね。
としますと、 Linux サーバ側に問題がある、という訳でもなさそうです。 Windows クライアント - Linux サーバ間の通信の問題と考えるべきでしょう。
Wireshark を使って、 Windows クライアントのパケットを除いてみます。
[TCP Dup ACK 27#1] distinct > saiseh [ACK] Seq=1 Ack=9653 Win=26280 Len=0 SLE=11113 SRE=12573
saiseh > distinct [ACK] Seq=22225 Ack=1 Win=65535 Len=1460
[TCP Dup ACK 27#2] distinct > saiseh [ACK] Seq=1 Ack=9653 Win=26280 Len=0 SLE=11113 SRE=14033
[TCP Fast Retransmission] saiseh > distinct [ACK] Seq=9653 Ack=1 Win=65535 Len=1460
[TCP Dup ACK 27#3] distinct > saiseh [ACK] Seq=1 Ack=9653 Win=26280 Len=0 SLE=11113 SRE=15493
saiseh > distinct [PSH, ACK] Seq=23685 Ack=1 Win=65535 Len=892
[TCP Dup ACK 27#4] distinct > saiseh [ACK] Seq=1 Ack=9653 Win=26280 Len=0 SLE=11113 SRE=16385
[TCP Dup ACK 27#5] distinct > saiseh [ACK] Seq=1 Ack=9653 Win=26280 Len=0 SLE=11113 SRE=17845
[TCP Dup ACK 27#6] distinct > saiseh [ACK] Seq=1 Ack=9653 Win=26280 Len=0 SLE=11113 SRE=19305
[TCP Dup ACK 27#7] distinct > saiseh [ACK] Seq=1 Ack=9653 Win=26280 Len=0 SLE=11113 SRE=20765
[TCP Dup ACK 27#8] distinct > saiseh [ACK] Seq=1 Ack=9653 Win=26280 Len=0 SLE=22225 SRE=23685 SLE=11113 SRE=20765
distinct > saiseh [ACK] Seq=1 Ack=20765 Win=29200 Len=0 SLE=22225 SRE=23685
[TCP Dup ACK 41#1] distinct > saiseh [ACK] Seq=1 Ack=20765 Win=29200 Len=0 SLE=22225 SRE=24577
saiseh > distinct [ACK] Seq=24577 Ack=1 Win=65535 Len=1460
[TCP Dup ACK 41#2] distinct > saiseh [ACK] Seq=1 Ack=20765 Win=29200 Len=0 SLE=22225 SRE=26037
[TCP Fast Retransmission] saiseh > distinct [ACK] Seq=20765 Ack=1 Win=65535 Len=1460
"Dup ACK" というのが一杯出てます。クライアントがパケットを送り出すスピードが速すぎて、サーバが受け取れない、ってことですかね。
以下を参考に、 Windows の TCP ウインドウ・サイズを、 64 KB から 17KB へと変えてみましたが、特に変化なし。
Windows 2000 および Windows Server 2003 の TCP 機能について - Microsoft Knowledge Base 224829
Java プログラムの書き込みバッファ・サイズを変更する、というのは効くみたいです。
final int BUFFER_SIZE = 1460 * 4; System.out.print("Buffer: "); System.out.println(BUFFER_SIZE); Socket sock = new Socket(host, port); sock.setSendBufferSize(BUFFER_SIZE); sock.setReceiveBufferSize(BUFFER_SIZE); BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream(), BUFFER_SIZE);
でも、 これだけですと、 10Mbps くらいが限度みたいですね。
>java -client SpeedTest client 192.168.0.125 9999 Buffer: 5840 1982 1205 4013 8118 40793 81263 416608 264524.7225025227 6961500.41493776 1.0451791677049588E7 1.0333343187977334E7 1.0281920917804526E7 1.0322788969149552E7 1.0067747138797143E7 8383373.861174061
| 固定リンク
この記事へのコメントは終了しました。

コメント