我有一个NIO服务器,接收小的客户端请求,并产生大约1兆字节的响应。服务器使用以下方法来接受新的客户端:
SocketChannel clientChannel = server.accept();
clientChannel.configureBlocking(false);
clientChannel.socket().setSendBufferSize(2 * 1024 * 1024);
我接下来会记录一条“客户端已连接”的日志,其中包括clientChannel.socket().getSendBufferSize()的结果。
在Windows上,该设置将客户端套接字的发送缓冲区大小从8k更改为2兆字节。但是在Linux上,套接字显示其发送缓冲区为131,071字节。
这会导致性能不佳,因为我的clientChannel.write每次只写入128k的数据,所以需要7次以上的操作才能将所有数据写入。在Windows上,setSendBufferSize的更改显著提高了性能。
Linux似乎被配置为允许大型套接字发送缓冲区:
$ cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304