4

我有一个 NIO 服务器,它获取导致 ~1meg 响应的小客户端请求。服务器使用以下内容接受新客户端:

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

然后我注销包含 clientChannel.socket().getSendBufferSize() 结果的“客户端连接”行。

在 Windows 上,该设置将客户端套接字的发送缓冲区大小从 8k 更改为 2megs。但是在 linux 上,套接字说它的发送缓冲区是 131,071 字节。

这导致性能很差,因为我的 clientChannel.write 一次只写入 128k,因此需要 7 多遍才能写入所有数据。在 Windows 上,setSendBufferSize 更改显着提高了性能。

Linux 似乎配置为允许大型套接字发送缓冲区:

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

2 回答 2

2

该平台可以自由地向上或向下调整请求的缓冲区大小,这就是 Linux 似乎正在做的事情。除了通过内核配置调整最大值之外,您无能为力。

请注意,我在您链接的关于设置缓冲区大小> 64k 的问题中的评论适用于接收缓冲区,而不是发送缓冲区,因为接收缓冲区大小会影响窗口缩放选项,因此需要在连接套接字之前设置它,这用石头设置窗口比例。

我不明白为什么要求“更多通行证”会导致如此重大的性能差异,以至于您甚至会问这个问题。在我看来,您最好向上调整接收器的窗口大小,并在连接之前进行上述操作。

于 2013-05-02T21:34:03.583 回答
-2

您可以继承 ServerSocket并覆盖ServerSocket.implAccept(Socket socket)。在您的覆盖中,此方法将接收一个“空” Socket实例,您可以在该实例上调用Socket.setSendBufferSize(int)

然后:

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