心有 netty 一点通!

摘要:
在实际应用中,我们通常会定义相应的业务消息协议,并选择合适的序列化机制,nettyI/O线程池部分根据预设的规则进行数据的编解码。netty利用NIOFileChanneltransferTo方法,通道对通道写数据。PoolArenanetty的内存池实现类。

一、标准的netty线程模型

双池合璧:

心有 netty 一点通!第1张

1、连接线程池:

连接线程池专门负责监听客户端连接请求,并完成连接的建立(包括诸如握手、安全认证等过程)。

连接的建立本身是一个极其复杂、损耗性能的过程,此处使用线程池,能够极大的增加处理客户端连接的能力。

2、I/O线程池:

连接线程池会将成功建立的连接注册到后端I/O线程池,由I/O线程池负责对相应连接的网络数据进行读写、编解码处理。

在实际应用中,我们通常会定义相应的业务消息协议,并选择合适的序列化机制,netty I/O线程池部分根据预设的规则进行数据的编解码。

二、延伸的业务线程池

心有 netty 一点通!第2张

其实我们这里说的业务线程池不在网络层处理逻辑里。处理到I/O线程池部分,所需要的请求数据已经处理完毕,涉及具体的业务处理逻辑,比较复杂的,或者时间、性能消耗特别大的,通常我们会单独设置相应的线程池来处理。

三、netty的极致性能设计

1、无锁化设计

I/O线程的内部串行化:

心有 netty 一点通!第3张

局部无锁化串行处理,避免多线程切换带来的复杂性及性能损耗(锁竞争、CPU资源分配)。至于对于处理能力的考虑,可以通过调整I/O线程池容量来平衡。

尽量避免I/O线程和业务线程混淆及切换。

2、直接内存使用

TCP接收和发送使用直接内存代替堆内存,避免了数据在堆内存和主内存之间的复制消耗,提升了I/O读取和写入的性能。

心有 netty 一点通!第4张

3、transferTo

依赖于操作系统零拷贝特性直接将缓冲区数据发送到相应的通道。

心有 netty 一点通!第5张

传统的方式,先将源文件拷贝到内存,然后由内存写到目的文件。

netty 利用 NIO FileChannel transferTo方法,通道对通道写数据。

4、CompositeByteBuf

组合缓存使用可以像操作单个缓存一样操作多个缓存,避免了传统的操作方式带来的内存复制性能消耗。

心有 netty 一点通!第6张

5、内存池使用

netty支持通过内存池的方式循环利用ByteBuf,避免了频繁的创建,销毁ByteBuf带来的资源及性能损耗。

ByteBuf byte数据缓冲区,是NIO编程的主要对象。高负载情景下,ByteBuf内存池使用,可以有效降低GC频率。

PoolArena netty的内存池实现类。PoolArena 是由多个Chunk组成的大块内存区域,每个Chunk由一个多个Page组成。

Chunk:组织管理Page的内存分配和释放,Page被构建为二叉树形式:

心有 netty 一点通!第7张

PoolSubpage:对于小于Page的内存使用,直接在Page中完成分配,每个Page切分为大小相同的多个存储块儿,存储块儿的大小由第一次申请的内存块儿大小决定。

回收:netty使用状态位标识Chunk及Page内存可用性,Chunk标识二叉树Page节点使用状态;Page标识内部内存块儿的使用状态。

6、线程安全优化

合理的使用线程安全容器、原子类等,提升系统的并发处理能力,

7、引用计数器

通过引用计数器及时的申请释放不再引用的对象,细粒度的内存管理降低了GC的频率,减少GC带来的时延增大和CPU损耗。

Netty 4中 ByteBuf 和 ByteBufHolder 引入引用计数器功能(实现ReferenceCounted接口),在特定的对象上跟踪引用的数目。

引用计数器初始为1。如果对象活动的引用计数器大于0,则不会被释放。当引用计数减少到0,实例将会被释放。这也是 PooledByteBufAllocator 内存池应用的核心特性。

免责声明:文章转载自《心有 netty 一点通!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇org.apache.commons.httpclient工具类在Android上常用的定时器 AlarmManager下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[软件过程/软件生命周期模型]软件过程的工具链【待续】

0 宣言:DevOps & RUP统一过程建模 1 项目管理 (需求管理 / 缺陷管理 / ...) 禅道(前身:bugfree) [在线协作] JIRA(项目与事务跟踪工具) 与禅道类同,但又不同,有明显的Scrum敏捷风格 Microsoft Project [离线维护] 在线文档 or Excel 2 系统建模 2....

Modbus协议服务端(Netty)

pom.xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.0.21.Final...

线程池管理线程及线程间通信

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading; namespace ConsoleTest{ public class ClassThread { //监听线程事件 private Manual...

多线程使用注意

命名 来源:https://www.cnblogs.com/guozp/p/10344446.html 我们在创建线程池的时候,一定要给线程池名字,如下这种写法,线程是默认直接生成的: public static void main(String[] args) { ExecutorService executorService = E...

彻底理解Android Binder通信架构

copy from : http://gityuan.com/2016/09/04/binder-start-service/ 基于Android 6.0的源码剖析, 本文深度剖析Binder IPC过程, 这绝对是一篇匠心巨作,从Java framework到Native,再到Linux Kernel,带你全程看Binder通信过程. 一. 引言 1.1...

Netty源码剖析-断开连接

参考文献:极客时间傅健老师的《Netty源码剖析与实战》Talk is cheap.show me the code! ----主线: ----源码:     在NioEventLoop的unsafe.read()打断点  在客户端关闭的地方也加个断点,并且修改点代码:  然后启动server和client;就会发现代码停在关闭的地方: 当下一步的...