Netty参数
ALLOCATOR
Netty参数。ByteBuf
的分配器 ByteBufAllocator,对象池化。
可选值(Netty4.x):ByteBufAllocator.DEFAULT、PooledByteBufAllocator.DEFAULT
、UnpooledByteBufAllocator.DEFAULT
默认值(Netty4.1):
- 非
Android
:PooledByteBufAllocator.DEFAULT
Android
:UnpooledByteBufAllocator.DEFAULT
代码设置:
bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
系统参数配置:
io.netty.allocator.type,使用字符串值:unpooled,pooled
说明:
Netty的ByteBuf使用的是 堆外的池化模式。
RCVBUF_ALLOCATOR
Netty参数。用于Channel分配接受Buffer的分配器,默认值为 AdaptiveRecvByteBufAllocator.DEFAULT
,是一个自适应的接受缓冲区分配器,能根据接受到的数据自动调节大小。
可选值为 FixedRecvByteBufAllocator,固定大小的接受缓冲区分配器。
默认值:
默认值为 AdaptiveRecvByteBufAllocator.DEFAULT。
代码设置:
bootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT);
或者
bootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(592048)) //配置固定长度接收缓存区分配器
WRITE_BUFFER_WATER_MARK
Netty参数。水位线,提用户当前通道的消息堆积情况。用于替代原有的高低水位线参数,高水位线和低水位线是字节数。
值类型:io.netty.channel.WriteBufferWaterMark,
包含 WRITE_BUFFER_HIGHT_WATER_MARK(
高水位线)和 WRITE_BUFFER_LOW_WATER_MARK(
低水位线)两个默认属性,并提供带入参的构造方法来设置高低水位线。
当buffer
的大小超过高水位线的时候对应channel
的isWritable
就会变成false
,当buffer
的大小低于低水位线的时候,isWritable
就会变成true
。
所以每次调用channl.write(...)
方法应该判断isWritable
,如果是false
就不要再写数据了。
说明:
上面提到的buffer,是 ChannelOutboundBuffer,是Netty等待写入系统内核缓冲区的消息队列。ChannelOutboundBuffer本身是无界的,所以用的时候要注意。
默认值:
默认高水位是64K
,低水位是32K
,可以根据应用需要支持多少连接数和系统资源进行合理规划。
代码设置:
bootstrap.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1 * 1024 * 1024, 3 * 1024 * 1024))
CONNECT_TIMEOUT_MILLIS
Netty参数。连接超时毫秒数。
默认值:
默认值30000毫秒,即30秒。
代码设置:
bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 60000)
WRITE_SPIN_COUNT
Netty参数。一个Loop写操作执行的最大次数。默认值为16,也就是说,对于大数据量的写操作至多进行16次,如果16次仍没有全部写完数据,此时会提交一个新的写任务给EventLoop,任务将在下次调度继续执行。
这样,其他的写请求才能被响应不会因为单个大数据量写请求而耽误。
默认值:
默认值为16。
MAX_MESSAGES_PER_READ
Netty参数。一次Loop读取的最大消息数。
默认值:
对于ServerChannel或者NioByteChannel,默认值为16,其余Channel默认值为1。默认值这样设置是由于:ServerChannel须要接受足够多的链接,保证大吞吐量,NioByteChannel能够减小没必要要的系统调用select。
ALLOW_HALF_CLOSURE
Netty参数。一个连接的远端关闭时本地端是否关闭。
值为False
时,连接自动关闭;为True
时,触发ChannelInboundHandler
的userEventTriggered()
方法,事件为ChannelInputShutdownEvent
。
默认值:
默认值为False。
Socket参数
TCP_NODELAY
TCP参数 。用于启用或关闭Nagle算法。立即发送数据 。
在TCP/IP
协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK
表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。
这里就涉及到一个名为Nagle
的算法,该算法的目的就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
如果要求高实时性,有数据发送时就马上发送,就将该选项设置为true关闭Nagle算法;如果要减少发送次数减少网络交互,就设置为false等累积一定大小后再发送。
默认值:
默认值为true(Netty默认为true,而操作系统默认为false)
代码设置:
bootstrap.childOption(ChannelOption.TCP_NODELAY, true);
SO_SNDBUF
Socket参数。SO_SNDBUF是操作系统内核的写缓冲区,所有应用程序需要发送到对端的信息,都会放到该缓冲区中,等待发往对端。
默认值(16K):
[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_wmem 4096 16384 4194304 #第一个表示最小值,第二个表示默认值,第三个表示最大值
SO_RECBUF
Socket参数。SO_RECBUF是操作系统内核的读缓冲区,所有对端发过来的数据都会放到该缓冲区中,等待应用程序取走。
默认值(86K):
[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 4194304 #第一个表示最小值,第二个表示默认值,第三个表示最大值
SO_BACKLOG
Socket参数。用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列(accept 全连接队列)的最大长度。
若是队列已满,客户端链接将被拒绝。
默认值:
windows为200,其余为128。
代码设置:
bootstrap.option(ChannelOption.SO_BACKLOG, 1024)
SO_TIMEOUT
Socket参数。超时时间。
代码设置:
SO_KEEPALIVE
Socket参数。是否启用心跳保活机制,即连接保活。 启用该功能时,TCP会主动探测空闲连接的有效性。
在双方TCP套接字建立连接后(即都进入ESTABLISHED
状态)并且在两个小时左右(默认的心跳间隔是7200s即2小时)上层没有任何数据传输的情况下,这套机制才会被激活。
默认值:
Netty默认关闭该功能,即值为:false 。
代码设置:
bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
说明:
如果一方已经关闭或异常终止连接,而另一方却不知道,我们将这样的TCP连接称为半打开的。TCP通过保活定时器(KeepAlive)来检测半打开连接。
在高并发的网络服务器中,经常会出现漏掉socket的情况,对应的结果有一种情况就是出现大量的CLOSE_WAIT状态的连接。这个时候,可以通过设置KEEPALIVE选项来解决这个问题。
设置SO_KEEPALIVE选项来开启KEEPALIVE,然后通过TCP_KEEPIDLE、TCP_KEEPINTVL和TCP_KEEPCNT设置keepalive的开始时间、间隔、次数等参数。
当然,也可以通过设置/proc/sys/net/ipv4/tcp_keepalive_time、tcp_keepalive_intvl和tcp_keepalive_probes等内核参数来达到目的,但是这样的话,会影响所有的socket。
SO_REUSEADDR
Socket参数。地址复用,默认值false。有四种情况可以使用:
- 允许启动一个监听服务器并捆绑其端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。
- 允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。使用在有多块网卡或使用类似
IP Alias
技术的机器。 - 允许单个进程捆绑同一端口到多个socket上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。
- 允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)
SO_LINGER
Socket参数。关闭Socket的延迟时间。值含义如下:
-1:
表示socket.close()方法立即返回,但OS底层会将发送缓冲区的数据全部发送到对端。0:
表示socket.close()方法立即返回,OS放弃发送缓冲区的数据直接向对端发送RST
包,对端收到复位错误。非0整数值:
表示调用socket.close()方法的线程被阻塞直到延迟时间到或发送缓冲区中的数据发送完毕,若超时,则对端会收到复位错误。
默认值:
默认值为-1,表示禁用该功能。
参考: