簡體   English   中英

在linux上設置套接字發送緩沖區大小的正確方法?

[英]Correct way to set the socket send buffer size on linux?

我有一個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

平台可以自由調整請求的緩沖區大小,這就是Linux似乎正在做的事情。 除了可以通過內核配置調整最大值之外,你無能為力。

請注意,我在關於設置緩沖區大小> 64k的問題中的注釋適用於接收緩沖區,而不是發送緩沖區,因為接收緩沖區大小會影響窗口縮放選項,因此需要在連接套接字之前設置它,將窗戶尺度設定在石頭上。

我不明白為什么要求“更多通行證”應該導致如此重大的性能差異,甚至你問這個問題。 在我看來,如果向上調整接收器的窗口大小,並且在連接之前按照上面的方式進行操作會更好。

您可以繼承ServerSocket ,並覆蓋ServerSocket.implAccept(套接字套接字) 在您的覆蓋中,此方法將接收一個“空” Socket實例,您可以在其上調用Socket.setSendBufferSize(int)

然后:

ServerSocketChannel server = myServerSocket.getChannel();
...
SocketChannel clientChannel = server.accept();  // <-- this guy will have the new send buffer size.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM