首页   快速返回

netty高性能要点     所属分类 netty 浏览量 156
最佳连接数  需要根据实际场景测试  

Netty Native 用C++编写JNI调用的Socket Transport

TCP/Socket参数
SO_REUSEADDR TCP_NODELAY SO_KEEPALIVE 
SO_LINGER  SO_TIMEOUT  SO_BACKLOG  SO_SNDBUF SO_RCVBUF

Netty参数
CONNECT_TIMEOUT_MILLIS  连接超时,默认30秒
WRITE_BUFFER_HIGH_WATER_MARK  WRITE_BUFFER_LOW_WATER_MARK  流控参数 

write buffer里排队准备输出的字节超过上限,Channel writable 变为 false 
低于下限时变成可写


EventLoop和线程模型
BossGroup WorkerGroup   
BossGroup 用于accept 连接
WorkGroup用于处理I/O  
EventLoopGroup 默认 2倍的CPU核数

业务线程池  
把耗时处理 放在业务线程池处理 避免阻塞IO线程

定时任务
ctx.executor().schedule(new MyTimeoutTask(p), 30, TimeUnit.SECONDS)

Netty线程
SelectKeys()处理 IO事件
本线程提交的任务
其他线程提交的任务

IO事件与其他任务时间消耗比例  ioRatio  默认 50%


堆外内存池
ByteBuf释放 
-Dio.netty.leakDetectionLevel=disabled  关闭内存泄露检测

对象重用  Recycler
Dio.netty.recycler.maxCapacity.default=0  关闭重用

避免复制
CompositeByteBuff, slice(), duplicate()
避免扩容
ByteBuf的大小预估与AdaptiveRecvByteBufAllocator

rangeChecking
使用 readInt(),不要readBytes(bytes[],0,4) 



无锁的 MpscLinkedQueue (Mpsc Multiple Producer Single Consumer)

ASCIIString

FastThreadLocal

IntHashMap

FastUtils

JCTools

RecyclableArrayList

ThreadLocal的StringBuilder

JDK8 
ConcurrentHashMap
ThreadLocalRandom 
LongAdder vs AtomicLong


PlatformDependent

ctx.writeAndFlush() vs  channel.writeAndFlush()
channel 经过整个Pipeline, ctx直接找下一个outboundHandler

Handler能共用就标上Shareable 注解

上一篇     下一篇
nacos Java客户端使用

threadlocal实例及原理

使用int作为key的IntHashMap

redis要点整理

从高级程序员到CTO

java对象内存占用大小计算