心有 netty 一点通!
一、标准的netty线程模型
双池合璧:
1、连接线程池:
连接线程池专门负责监听客户端连接请求,并完成连接的建立(包括诸如握手、安全认证等过程)。
连接的建立本身是一个极其复杂、损耗性能的过程,此处使用线程池,能够极大的增加处理客户端连接的能力。
2、I/O线程池:
连接线程池会将成功建立的连接注册到后端I/O线程池,由I/O线程池负责对相应连接的网络数据进行读写、编解码处理。
在实际应用中,我们通常会定义相应的业务消息协议,并选择合适的序列化机制,netty I/O线程池部分根据预设的规则进行数据的编解码。
二、延伸的业务线程池
其实我们这里说的业务线程池不在网络层处理逻辑里。处理到I/O线程池部分,所需要的请求数据已经处理完毕,涉及具体的业务处理逻辑,比较复杂的,或者时间、性能消耗特别大的,通常我们会单独设置相应的线程池来处理。
三、netty的极致性能设计
1、无锁化设计
I/O线程的内部串行化:
局部无锁化串行处理,避免多线程切换带来的复杂性及性能损耗(锁竞争、CPU资源分配)。至于对于处理能力的考虑,可以通过调整I/O线程池容量来平衡。
尽量避免I/O线程和业务线程混淆及切换。
2、直接内存使用
TCP接收和发送使用直接内存代替堆内存,避免了数据在堆内存和主内存之间的复制消耗,提升了I/O读取和写入的性能。
3、transferTo
依赖于操作系统零拷贝特性直接将缓冲区数据发送到相应的通道。
传统的方式,先将源文件拷贝到内存,然后由内存写到目的文件。
netty 利用 NIO FileChannel transferTo方法,通道对通道写数据。
4、CompositeByteBuf
组合缓存使用可以像操作单个缓存一样操作多个缓存,避免了传统的操作方式带来的内存复制性能消耗。
5、内存池使用
netty支持通过内存池的方式循环利用ByteBuf,避免了频繁的创建,销毁ByteBuf带来的资源及性能损耗。
ByteBuf byte数据缓冲区,是NIO编程的主要对象。高负载情景下,ByteBuf内存池使用,可以有效降低GC频率。
PoolArena netty的内存池实现类。PoolArena 是由多个Chunk组成的大块内存区域,每个Chunk由一个多个Page组成。
Chunk:组织管理Page的内存分配和释放,Page被构建为二叉树形式:
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 一点通!的更多相关文章
- python编码问题一点通
一.了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的, ...
- php中的抽象方法和抽象类,简单明了,一点通
1.什么是抽象方法? 我们在类里面定义的没有方法提的方法就是抽象方法.所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方 ...
- 鹅厂优文 | ReactJS一点通
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂新鲜事儿发表于云+社区专栏 作者:卢文喆 腾讯云 UI工程师 导语 | 当React 刚开始红的时候,一直觉得 JSX 的设计思想 ...
- note——《Tableau商业分析一点通》
为了更好地发掘各领域的数据价值,且能对数据进行精确分析及可视化,掌握资料的脉动,做出正确的决策 人们需要一种工具:能够快速灵活地连接和整合数据,提供简单的方式实现从不同的角度去观察研究数据,计算和展示 ...
- ZBrush 2018软件安装激活教程一点通
Zbrush下载地址:https://pixologic.com/CD 安装教程:(此CD代码仅有效一次,一旦此代码被使用,您将收到一封包含你账户信息的电子邮件.请把那封电子邮件保存在你的记录里.) ...
- Java8新特性一点通 | 回顾功能接口Functional Interface
Functional Interface Functional Interface是什么? 功能接口是java 8中的新增功能,它们只允许一个抽象方法.这些接口也称为单抽象方法接口(SAM接口).这些 ...
- Java8新特性一点通 | 回顾文件操作和watchService文件变更监视操作
文件操作 WatchService 文件操作 今天重温了一些文件操作: - Files.list() 遍历文件和目录 //List all files and sub-directories usin ...
- Java8新特性一点通 | 回顾字符转日期&JoinArray使用
StringToDate日期转换 Join Array使用 StringToDate日期转换 Convert string to date in ISO8601 format 利用LocalDate. ...
- Sqoop 一点通
sqoop 是什么? sqoop 主要用于异构数据: 1. 将数据从hadoop,hive 导入.导出到关系型数据库mysql 等; 2. 将关系型数据库 mysql 中数据导入.导出到 hadoop ...
随机推荐
- IOS真机测试(已拥有个人开发者证书)
创建真机调试证书并进行真机测试 步骤1 在启动台中点击其他,找到钥匙串访问. 步骤2 在打开的界面中点击右边的系统根证书,然后点击左上角的钥匙串访问,然后是证书助理,最后点击从证书颁发机构申请证书. ...
- 【遗传编程/基因规划】Genetic Programming
目录 背景介绍 程序表示 初始化 (Initialization) Depth定义 Grow方法 Full方法 Ramped half-and-half方法 适应度(Fitness)与选择(Selec ...
- 爬虫之图片懒加载技术、selenium工具与PhantomJS无头浏览器
图片懒加载技术 selenium爬虫简单使用 2.1 selenium简介 2.2 selenium安装 2.3 selenium简单使用 2.3.1 selenium使用案例 2.3.2 selen ...
- Spring 中基于 AOP 的 XML架构
Spring 中基于 AOP 的 XML架构 为了使用 aop 命名空间标签,你需要导入 spring-aop j架构,如下所述: <?xml version="1.0" e ...
- 决策树purity/基尼系数/信息增益 Decision Trees
目录 决策树简单描述 衡量purity的三种方法 Gini Coefficient Entropy熵 决策树简单描述 决策树的样子大概是这个样子的: 选择一个特征作为根节点,把这个特征划分成两个孩子节 ...
- [Objective-C] 001_Hello Objective-C
"Hello Word"从来都是经典中的经典!今天我们就来个"Hello Objective-C"吧. 启动Xcode(6.3.1),从File菜单中选择New ...
- JavaScript 简版-菜鸟中的菜鸟
JavaScript 简介 JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. JavaScrip ...
- 05 . Nginx的反向代理与负载均衡
Nginx负载均衡 客户端的访问都被代理到后端的一台服务器上,最终会出现性能瓶颈,从而导致效率降低,前端用户的访问速度急速下降,要解决这个问题就需要添加多台httpd,同时承受大量并发连接,每台服务器 ...
- 循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用
在我们开发BS页面的时候,往往需要了解常规界面组件的使用,小到最普通的单文本输入框.多文本框.下拉列表,以及按钮.图片展示.弹出对话框.表单处理.条码二维码等等,本篇随笔基于普通表格业务的展示录入的场 ...
- Chisel3 - Tutorial - Stack
https://mp.weixin.qq.com/s/-AVJD1IfvNIJhmZM40DemA 实现后入先出(last in, first out)的栈. 参考链接: https://gi ...