netty高性能要点
所属分类 netty
浏览量 2307
最佳连接数 需要根据实际场景测试
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对象内存占用大小计算