博客
关于我
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 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
MySQL 数据库设计总结
查看>>
Mysql 数据库重置ID排序
查看>>
Mysql 数据类型一日期
查看>>
MySQL 数据类型和属性
查看>>
mysql 敲错命令 想取消怎么办?
查看>>
Mysql 整形列的字节与存储范围
查看>>
mysql 断电数据损坏,无法启动
查看>>
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>