4

〜1メガの応答をもたらす小さなクライアント要求を取得するNIOサーバーがあります。サーバーは、次を使用して新しいクライアントを受け入れます。

SocketChannel clientChannel = server.accept();
clientChannel.configureBlocking(false);
clientChannel.socket().setSendBufferSize(2 * 1024 * 1024);

次に、clientChannel.socket().getSendBufferSize() の結果を含む「client connected」行をログアウトします。

Windows では、セットはクライアント ソケットの送信バッファ サイズを 8k から 2メガに変更します。しかし、Linux では、ソケットは送信バッファが 131,071 バイトであると言います。

私の clientChannel.write は一度に 128k しか書き込まないため、これによりパフォーマンスが低下するため、すべてのデータを書き込むにはさらに 7 回のパスが必要です。Windows では、setSendBufferSize の変更によりパフォーマンスが大幅に向上しました。

Linux は、大きなソケット送信バッファを許可するように構成されているようです。

$ cat /proc/sys/net/ipv4/tcp_wmem
4096    16384   4194304
4

2 に答える 2

-2

ServerSocketをサブクラス化し、 ServerSocket.implAccept(Socket socket)をオーバーライドできます。このメソッドは、オーバーライドで、 Socket.setSendBufferSize(int)を呼び出すことができる「空の」Socketインスタンスを受け取ります。

それで:

ServerSocketChannel server = myServerSocket.getChannel();
...
SocketChannel clientChannel = server.accept();  // <-- this guy will have the new send buffer size.
于 2013-05-02T21:16:13.103 に答える