netty 配置参数
配置参数
ChannelOption
public class ChannelOption<T> extends AbstractConstant<ChannelOption<T>> {
private static final ConstantPool<ChannelOption<Object>> pool = new ConstantPool<ChannelOption<Object>>() {
protected ChannelOption<Object> newConstant(int id, String name) {
return new ChannelOption(id, name);
}
};
public static final ChannelOption<ByteBufAllocator> ALLOCATOR = valueOf("ALLOCATOR");
public static final ChannelOption<RecvByteBufAllocator> RCVBUF_ALLOCATOR = valueOf("RCVBUF_ALLOCATOR");
public static final ChannelOption<MessageSizeEstimator> MESSAGE_SIZE_ESTIMATOR = valueOf("MESSAGE_SIZE_ESTIMATOR");
public static final ChannelOption<Integer> CONNECT_TIMEOUT_MILLIS = valueOf("CONNECT_TIMEOUT_MILLIS");
public static final ChannelOption<Integer> MAX_MESSAGES_PER_WRITE = valueOf("MAX_MESSAGES_PER_WRITE");
public static final ChannelOption<Integer> WRITE_SPIN_COUNT = valueOf("WRITE_SPIN_COUNT");
public static final ChannelOption<WriteBufferWaterMark> WRITE_BUFFER_WATER_MARK = valueOf("WRITE_BUFFER_WATER_MARK");
public static final ChannelOption<Boolean> ALLOW_HALF_CLOSURE = valueOf("ALLOW_HALF_CLOSURE");
public static final ChannelOption<Boolean> AUTO_READ = valueOf("AUTO_READ");
public static final ChannelOption<Boolean> AUTO_CLOSE = valueOf("AUTO_CLOSE");
public static final ChannelOption<Boolean> SO_BROADCAST = valueOf("SO_BROADCAST");
public static final ChannelOption<Boolean> SO_KEEPALIVE = valueOf("SO_KEEPALIVE");
public static final ChannelOption<Integer> SO_SNDBUF = valueOf("SO_SNDBUF");
public static final ChannelOption<Integer> SO_RCVBUF = valueOf("SO_RCVBUF");
public static final ChannelOption<Boolean> SO_REUSEADDR = valueOf("SO_REUSEADDR");
public static final ChannelOption<Integer> SO_LINGER = valueOf("SO_LINGER");
public static final ChannelOption<Integer> SO_BACKLOG = valueOf("SO_BACKLOG");
public static final ChannelOption<Integer> SO_TIMEOUT = valueOf("SO_TIMEOUT");
public static final ChannelOption<Integer> IP_TOS = valueOf("IP_TOS");
public static final ChannelOption<InetAddress> IP_MULTICAST_ADDR = valueOf("IP_MULTICAST_ADDR");
public static final ChannelOption<NetworkInterface> IP_MULTICAST_IF = valueOf("IP_MULTICAST_IF");
public static final ChannelOption<Integer> IP_MULTICAST_TTL = valueOf("IP_MULTICAST_TTL");
public static final ChannelOption<Boolean> IP_MULTICAST_LOOP_DISABLED = valueOf("IP_MULTICAST_LOOP_DISABLED");
public static final ChannelOption<Boolean> TCP_NODELAY = valueOf("TCP_NODELAY");
public static final ChannelOption<Boolean> TCP_FASTOPEN_CONNECT = valueOf("TCP_FASTOPEN_CONNECT");
public static final ChannelOption<Integer> TCP_FASTOPEN = valueOf(ChannelOption.class, "TCP_FASTOPEN");
public static final ChannelOption<Boolean> SINGLE_EVENTEXECUTOR_PER_GROUP = valueOf("SINGLE_EVENTEXECUTOR_PER_GROUP");
public static <T> ChannelOption<T> valueOf(String name) {
public static <T> ChannelOption<T> valueOf(Class<?> firstNameComponent, String secondNameComponent) {
public static boolean exists(String name) {
public void validate(T value) {
private ChannelOption(int id, String name) {
参数说明
allocator:内存分配器
public final class ByteBufUtil {
static { //静态语句块
MAX_BYTES_PER_CHAR_UTF8 = (int)CharsetUtil.encoder(CharsetUtil.UTF_8).maxBytesPerChar();
String allocType = SystemPropertyUtil.get("io.netty.allocator.type", PlatformDependent.isAndroid() ? "unpooled" : "pooled");
//读取参数io.netty.allocator.type,
//如果没有设置,根据PlatformDependent.isAndroid()的值设置
//4.0版本:unpooled
//4.1版本:pooled
allocType = allocType.toLowerCase(Locale.US).trim();
Object alloc;
if ("unpooled".equals(allocType)) {
alloc = UnpooledByteBufAllocator.DEFAULT; //4.0版本默认值
logger.debug("-Dio.netty.allocator.type: {}", allocType);
} else if ("pooled".equals(allocType)) {
alloc = PooledByteBufAllocator.DEFAULT; //4.1版本默认值
logger.debug("-Dio.netty.allocator.type: {}", allocType);
} else {
alloc = PooledByteBufAllocator.DEFAULT;
logger.debug("-Dio.netty.allocator.type: pooled (unknown: {})", allocType);
}
DEFAULT_ALLOCATOR = (ByteBufAllocator)alloc;
THREAD_LOCAL_BUFFER_SIZE = SystemPropertyUtil.getInt("io.netty.threadLocalDirectBufferSize", 0);
logger.debug("-Dio.netty.threadLocalDirectBufferSize: {}", THREAD_LOCAL_BUFFER_SIZE);
MAX_CHAR_BUFFER_SIZE = SystemPropertyUtil.getInt("io.netty.maxThreadLocalCharBufferSize", 16384);
logger.debug("-Dio.netty.maxThreadLocalCharBufferSize: {}", MAX_CHAR_BUFFER_SIZE);
FIND_NON_ASCII = new ByteProcessor() {
public boolean process(byte value) {
return value >= 0;
}
};
}
RCVBUF_ALLOCATOR:缓冲区分器,设置接受缓冲区大小
默认为AdaptiveRecvByteBufAllocator,根据接收数据自动调节大小
.option(ChannelOption.RCVBUF_ALLOCATOR,new FixedRecvByteBufAllocator(4096))
.option(ChannelOption.RCVBUF_ALLOCATOR,new AdaptiveRecvByteBufAllocator(4096))
WRITE_BUFFER_WATER_MARK:写高低水位
public final class WriteBufferWaterMark {
private static final int DEFAULT_LOW_WATER_MARK = 32768;
private static final int DEFAULT_HIGH_WATER_MARK = 65536;
public static final WriteBufferWaterMark DEFAULT = new WriteBufferWaterMark(32768, 65536, false);
private final int low;
private final int high;
socket 参数
SO_BROADCAST:广播模式
SO_REUSEADDR:socket复用,默认false
SO_KEEPALIVE:连接保活,默认关闭
开启该功能时,tcp会主动探测连接有效性,默认检测间隔为7200s(2h)
SO_SNDBUF:socket发送缓冲,cat /proc/sys/net/ipv4/tcp_smem查看大小
SO_RCVBUF:socket接收缓冲,cat /proc/sys/net/ipv4/tcp_rmem查看大小
SO_LINGER:关闭socket的延时时间,默认-1
-1:调用close立即返回,缓冲区的数据会发送到对端
0:调用close立即返回,缓冲区的数据不会发送到对端
大于0:阻塞到数据发送完毕、或者超时
SO_BACKLOG:服务端接收连接的队列长度,如果超过最大值,连接会被拒绝
windows为200,其余128
SO_TIMEOUT:socket连接接收数据的等待超时时间,默认为0,表示无限等待
ip 参数
IP_TOS:设置IP头部的Type-of-Service属性,用于描述IP包的优先级和QoS选项
IP_MULTICAST_TTL:多播数据报的存活跳数(time-to-live)
IP_MULTICAST_LOOP_DISABLED:对应IP参数IP_MULTICAST_LOOP,设置本地回环接口的多播功能
IP_MULTICAST_ADDR:对应IP参数IP_MULTICAST_IF,设置对应地址的网卡为多播模式
IP_MULTICAST_IF:对应IP参数IP_MULTICAST_IF2,设置对应地址的网卡为多播模式,支持IPv6
tcp 参数
TCP_NODELAY:是否没有延时,立即发送(开启Nagle算法,会延时发送)
true:禁用Nagle算法,即使用小数据包即时传输
false:开启Nagle算法,有足够数据量时再发送,数据会有延时
TCP_FASTOPEN_CONNECT:是否开启fast open
TCP_FASTOPEN:socket连接中可以处于等待状态的fast-open请求的个数
全局参数
AUTO_READ:自动读取,默认true
AUTO_CLOSE:自动关闭
CONNECT_TIMEOUT_MILLIS:连接超时时间(毫秒),默认30000(30秒)
ALLOW_HALF_CLOSURE:一个连接远端关闭时,本端是否关闭,默认false(本端连接自动关闭)
MAX_MESSAGES_PER_WRITE:一次loop写入的最大消息数
WRITE_SPIN_COUNT:一个Loop写操作执行的最大次数,默认值为1
MESSAGE_SIZE_ESTIMATOR:消息大小估算器,默认为DefaultMessageSizeEstimator
SINGLE_EVENTEXECUTOR_PER_GROUP:是否使用单线程执行ChannelPipeline中的事件,默认true
已禁用参数(4.1.77)
MAX_MESSAGES_PER_READ:一次loop读取的最大消息数
ServerChannel、NioByteChannel,默认值为16
其余channel默认为1
# 写高低水位标记使用户可以控制写入数据速度,从而实现流量控制
# 推荐每次调用channl.write(msg)方法首先调用channel.isWritable()判断是否可写
WRITE_BUFFER_HIGH_WATER_MARK:写高水位标记,默认值64KB
如果Netty的写缓冲区中的字节超过该值,
Channel.isWritable()返回false
WRITE_BUFFER_LOW_WATER_MARK:写低水位标记,默认值32KB
Netty的写缓冲区中的字节超过高水位之后若下降到低水位,
则Channel的isWritable()返回true
DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION:datagram channel注册的时候是否激活