Netty——参数说明

 

Netty参数

ALLOCATOR

Netty参数ByteBuf的分配器 ByteBufAllocator,对象池化。可选值(Netty4.x):ByteBufAllocator.DEFAULTPooledByteBufAllocator.DEFAULTUnpooledByteBufAllocator.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的大小超过高水位线的时候对应channelisWritable就会变成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时,触发ChannelInboundHandleruserEventTriggered()方法,事件为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_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT设置keepalive的开始时间、间隔、次数等参数。

当然,也可以通过设置/proc/sys/net/ipv4/tcp_keepalive_timetcp_keepalive_intvltcp_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,表示禁用该功能。

 

 

参考:

posted on 2021-05-22 18:44  曹伟雄  阅读(4511)  评论(0编辑  收藏  举报

导航