2013-05-02 25 views
1

我有一个NIO服务器,可以获取导致〜1meg响应的小型客户端请求。服务器使用以下来接受新的客户端:在Linux上设置套接字发送缓冲区大小的正确方法是什么?

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 
+0

这个问题说,我需要之前调用accept设置SendBufferSize:http://stackoverflow.com/questions/12749174/can-i-increase-the-socket-send-buffer-size-if-the-send-失败 - 由于到缓冲区满。但是我没有clientChannel,直到我打电话给Accept。 – 2013-05-02 18:39:36

+0

我对这个问题的评论是指接收缓冲区大小。您可以随时随地设置发送缓冲区大小。 – EJP 2013-05-02 21:29:50

回答

1

的平台是免费的调整所要求的缓冲区大小向上或向下,这是Linux的,似乎是在做。除了可能通过内核配置来调整最大值以外,你无能为力。

请注意,我在您关联的设置缓冲区大小> 64k的问题中的注释适用于接收缓冲区,而不是发送缓冲区,因为接收缓冲区大小会影响窗口缩放选项,所以需要在套接字前设置它连接,它设置在stone.m

我不明白为什么需要“更多的通行证”应该引起如此大的性能差异,你甚至问这个问题的窗口规模。在我看来,如果向上调整接收器的窗口大小,并在连接之前进行上述操作,会更好。

+0

增加客户端的接收缓冲区在Windows客户端上工作,但不会导致服务器增加其发送缓冲区。当服务器有1meg发送并且只有一个128k发送缓冲区时,它需要7个clientChannel.write调用才能获得所有发送的数据。我应该继续在循环中调用写入吗? – 2013-05-06 19:16:57

+0

增加接收者的接收缓冲区对服务器的发送缓冲区没有影响,无处不在。如果您处于阻止模式,则只需执行一次写入操作,否则您必须循环。 – EJP 2013-06-21 09:05:27

+0

看来net.core.wmem_max限制了我128k。遵循http://www.cyberciti.biz/faq/linux-tcp-tuning/的指示,允许我的Java程序请求2meg发送缓冲区。 – 2014-02-20 20:06:07

-1

你也可以继承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. 
+0

ServerSocket的子类有一个的ServerSocketChannel没有影响,并设置发送缓冲区的大小时,整个演习没有任何区别。 – EJP 2013-05-02 22:06:30

相关问题