博客
关于我
Netty系列之Netty高性能之道
阅读量:761 次
发布时间:2019-03-22

本文共 1539 字,大约阅读时间需要 5 分钟。

Netty高性能之道

Netty是一个高性能、异步事件驱动的NIO框架,通过优化传输协议、线程模型和内存管理等多个方面,能够实现高达10万次每秒的跨节点远程服务调caling。以下是Netty高性能的实现细节分析。

1. RPC调用的性能模型分析

传统的RPC框架或基于RMI等方式的远程服务调用采用了同步阻塞IO,当客户端的并发压力或网络时延增大之后,同步阻塞IO会由于频繁的wait导致IO线程经常性的阻塞,由于线程无法高效的工作,IO处理能力自然下降。

BIO通信模型的弊端在于每个TCP连接都占用1个线程,当并发访问量增加后,线程资源会被耗尽,导致系统性能急剧下降。Java序列化存在跨语言支持不足、码流过大、性能差等多重问题,而同步阻塞IO的线程模型同样难以应对高并发场景。

2. Netty高性能之道

Netty通过以下几个方面实现了高性能:

2.1 异步非阻塞通信

Netty采用非阻塞IO模型,通过NIO的多路复用技术( Selector)在单线程内同时处理多个客户端请求,避免了传统多线程模型的线程资源浪费。这种模式在高负载、高并发场景下表现优异,IO线程能够高效处理大量连接和读写操作。

2.2 零拷贝技术

Netty的接收和发送ByteBuffer采用直接内存(Direct Buffers),避免了传统堆内存的二次拷贝。同时,Netty提供了组合Buffer对象,方便地聚合多个ByteBuffer进行操作,进一步提升了读写性能。此外,文件传输采用零拷贝方式,直接将文件缓冲区的数据发送到目标Channel。

2.3 内存池优化

Netty通过内存池管理缓冲区,尽量重用已分配的内存,减少了内存分配和回收的开销。这种机制在性能测试中显示,相比普通缓冲区,内存池实现的性能提升了23倍左右。

2.4 Reactor线程模型

Netty支持三种Reactor线程模型:单线程、多线程和主从多线程。单线程适用于小容量场景,而多线程和主从模型则用于高并发场景。主从模型通过将Acceptor线程池用于客户端连接的接入认证,将链路注册到subReactor线程池中处理,显著提升了服务端的性能。

2.5 串行化设计

Netty采用无锁化的串行设计,避免了多线程竞争带来的性能损耗。NIO线程内部进行串行操作,尽管看起来CPU利用率不高,但通过调整线程池参数,可以同时启动多个串行线程并行运行,性能更优。

2.6 高效的并发编程

Netty支持volatile变量、CAS和原子类等高效并发编程技术,确保在多线程环境下对共享资源的安全访问。同时,通过读写锁机制,进一步提升了并发性能。

2.7 高性能的序列化框架

Netty默认支持Google Protobuf,通过扩展编解码接口还可以使用Thrift的压缩二进制编解码框架。相比Java原生序列化,Protobuf的码流大小只有四分之一,性能显著提升。

2.8灵活的TCP参数配置

Netty允许用户灵活配置TCP参数,如SO_RCVBUF、SO_SNDBUF、SO_TCPNODELAY等,满足不同场景的性能需求。合理设置这些参数可以显著提升网络吞吐量。

3. 总结

通过对Netty架构和性能模型的分析,我们发现Netty的高性能得益于其精心设计的架构和优化代码。Netty支持10W TPS的跨节点服务调用并非易事,但通过非阻塞IO、零拷贝技术、内存池优化、灵活的线程模型和高效的序列化框架,Netty确实做到了这一点。

作者简介

李林锋,东北大学毕业,现于华为公司从事高性能通信软件设计和开发,拥有6年NIO开发经验,精通Netty、Mina等框架。Netty中国社区创始人,《Netty权威指南》作者。

转载地址:http://opzwk.baihongyu.com/

你可能感兴趣的文章
Mysql 脏页 脏读 脏数据
查看>>
mysql 自增id和UUID做主键性能分析,及最优方案
查看>>
Mysql 自定义函数
查看>>
mysql 行转列 列转行
查看>>
Mysql 表分区
查看>>
mysql 表的操作
查看>>
mysql 视图,视图更新删除
查看>>
MySQL 触发器
查看>>
mysql 让所有IP访问数据库
查看>>
mysql 记录的增删改查
查看>>
MySQL 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
Mysql 语句操作索引SQL语句
查看>>
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 通过查看mysql 配置参数、状态来优化你的mysql
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>