`
iaiai
  • 浏览: 2195737 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Netty4底层用对象池和不用对象池实践优化

 
阅读更多
随着JVM虚拟机和JIT即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制。性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关)。

在4.x版本中,UnpooledByteBufAllocator是默认的allocator,尽管其存在某些限制。现在PooledByteBufAllocator已经广泛使用一段时间,并且我们有了增强的缓冲区泄漏追踪机制,所以是时候让PooledByteBufAllocator成为默认了。
优化前:

在玩家达到1100左右时直接内存迅速升高,CPU占用也飙高,
在最高峰时,服务器堆内存总共 3993 M,占用堆内存 3476 M,直接内存总共 2048 M,占用直接内存 715.8125 M。

发现netty底层的对象占用了很多


Class NameShallow HeapRetained Heap
class com.lingyu.game.service.stage.StageManager @ 0x738778950 »8166,381,728
com.lingyu.game.service.equip.EquipDataTemplateManager @ 0x738051240 »6461,389,640
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7a8a1b698 »4056,363,384
com.lingyu.game.service.map.MapDataTemplateManager @ 0x738709b70 »6448,234,856
com.lingyu.game.service.item.ItemRepository @ 0x7387965e0 »2445,883,384
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7d0b4ad08 »4045,730,344
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7dba870e8 »4043,118,248
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x76289b300 »4041,260,728
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x796226f90 »4033,083,800
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7ec9f19a0 »4032,922,432
io.netty.channel.ChannelOutboundBuffer @ 0x754207b68 »7225,823,800
Total: 11 entries

优化,猜测是因为直接内存不够用,在反复申请空间,导致CPU占用,并且直接内存一直回收不掉!使用对象池后,1380人,CPU占用大概为100/1200,表现很稳定,FULLGC 次数为0
服务器堆内存总共 3993 M,占用堆内存 2150 M,直接内存总共 2048 M,占用直接内存 400.00098 M
S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
  0.00   0.71   8.87  15.05  71.87    175    2.638     0    0.000    2.638

主要是加了以下两句:
bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);//关键是这句

Class NameShallow HeapRetained Heap
class com.lingyu.game.service.stage.StageManager @ 0x738977238 »8126,628,072
com.lingyu.game.service.equip.EquipDataTemplateManager @ 0x7380c53f8 »6461,391,800
com.lingyu.game.service.map.MapDataTemplateManager @ 0x738ce20d8 »6448,234,856
com.xianling.stage.configure.entity.map.PathInfoTemplate @ 0x7389e7c60 »408,975,440
sun.misc.Launcher$AppClassLoader @ 0x738024e80 »808,652,528
com.lmax.disruptor.RingBuffer @ 0x7382e4408 »327,340,056
com.lingyu.game.service.item.ItemDataTemplateManager @ 0x738bc4a30 »565,910,288
com.xianling.stage.configure.entity.map.PathInfoTemplate @ 0x73ac19aa8 »405,231,256
org.springframework.beans.factory.support.DefaultListableBeanFactory @ 0x7381979b8 »2005,172,192
com.xianling.stage.configure.entity.map.PathInfoTemplate @ 0x73addc8b8 »404,572,560
Total: 10 entries

总结:这次优化,内存省下1.7G,直接内存剩下300M,并且表现稳定,在线人数提升了300人(可能受带宽的限制,否则表现应该会更好),CPU从占用100%降到10%。
  • 大小: 29 KB
  • 大小: 110.7 KB
  • 大小: 26.2 KB
分享到:
评论

相关推荐

    Netty权威指南中文版PDF

    Netty广泛应用于分布式系统、游戏服务器、流媒体服务、微服务框架等领域,例如 Dubbo 和 Spring Cloud 的部分组件就采用了Netty作为底层通信框架。 7. **学习Netty的重要性** 掌握Netty能够帮助开发者构建高效率...

    如何用netty写一个自己的PRC框架

    此外,Netty的扩展性允许开发者在必要时进行底层优化,以应对更复杂的场景和性能要求。 在实现远程调用流程时,客户端和服务端需要建立连接、发布和订阅服务、进行服务发现、序列化和反序列化数据以及使用代理模式...

    netty入门到精通.txt

    4. **实战项目**:通过实践项目来加深对Netty的理解,比如实现一个简单的聊天服务器。 5. **进阶优化**:学习如何对Netty进行调优,包括但不限于线程模型选择、内存管理等。 ### 总结 Netty作为一个功能强大且灵活...

    netty-4.1.76

    3. **高性能**:Netty 的设计目标就是提供高性能,它优化了缓冲区管理,减少了对象创建,以及对零拷贝的支持。零拷贝技术在处理大数据传输时能显著提高效率,减少内存压力。 4. **可扩展性**:Netty 的协议处理模块...

    Netty 3.1中文用户手册

    - Netty 为了解决这些问题,提供了一个高效的、面向协议的网络编程框架,允许开发者快速开发出针对特定场景优化的协议服务和客户端,同时保持应用的性能和稳定性。 2. Netty 的关键特性: - 异步和事件驱动:...

    Netty面试专题.pdf

    在准备Java面试时,上述知识点是非常重要的考点,面试者应当熟练掌握BIO、NIO和AIO的区别,了解NIO的Buffer、Channel和Selector等组件的使用和原理,同时对Netty框架的特点和优势有深入的理解和实践,这样才能够在...

    【项目实战】Netty源码剖析&NIO;+Netty5各种RPC架构实战演练三部曲视频教程(未加密)

    - **性能优化实践**:通过参数调整、代码优化等方式提高RPC框架的性能。 - **高级特性探索**:学习Netty中的高级特性,如自定义编解码器、HTTP/2支持等。 #### 五、总结 通过对Netty源码的深入剖析以及NIO技术的...

    dubbo——rpc的原理和netty1

    RPC(Remote Procedure Call)是一种进程间通信机制,允许在分布式环境中像调用本地函数一样调用远程计算机上的函数或方法。...理解这两个技术的原理,对于优化和开发分布式应用程序具有重要的实践意义。

    Netty案例集锦(并发编程篇)有目录

    - **丰富的示例代码**:Netty项目自带了大量的示例代码,这为初学者提供了很好的实践参考,帮助他们更快地理解和掌握Netty的核心概念和技术细节。 - **广泛的社区支持**:Netty拥有一个活跃的社区,不仅有大量的学习...

    Netty In Action中文版

    Netty通过使用池化技术,比如对象池和线程池,大大减少了资源消耗,这既包括CPU也包括内存。在内存拷贝方面,Netty通过零拷贝技术减少了不必要的数据复制,提高了效率。 Netty的高可用性和稳定性也非常重要。Netty...

    netty实战-nettyPlayground.zip

    4. **稳定性**:Netty 经过多年的发展和优化,已经在许多大型项目中得到验证,具有良好的稳定性和健壮性。 5. **灵活性**:Netty 的架构设计允许开发者自定义处理器链,方便地扩展功能。 在 "nettyPlayground-main...

    netty权威指南第2版

    通过阅读《Netty权威指南》第二版,开发者可以深入理解Netty的架构设计、最佳实践以及如何利用其特性来优化网络应用的性能。这本书全面覆盖了Netty的各个方面,对于任何想要掌握Netty的人来说,都是不可或缺的参考...

    Netty之Protobuff

    3. **创建Netty编码解码器**: 在Netty的ChannelPipeline中添加ProtobufDecoder和ProtobufEncoder,它们负责在消息发送前将其转换为ByteBuf,接收到ByteBuf后恢复为原对象。 4. **编写业务逻辑**: 在你的...

    Netty相关文档

    标题 "Netty相关文档" 暗示了我们要探讨...深入学习Netty,你需要掌握如何配置和使用这些组件,理解它们如何协同工作,以及如何通过源码调试和优化。同时,实践项目,结合博客文章和文档,可以加速学习进程,提升技能。

    学习《Netty实战》一书,进行代码实现-NettyInAction.zip

    2. **高性能**:Netty对底层I/O进行了优化,例如使用NIO(非阻塞I/O)和Epoll(Linux下的高性能网络库),并且提供了零拷贝机制,减少了CPU的内存操作,提高了数据传输效率。 3. **易用性**:Netty提供了一系列预...

    Netty:Netty框架的学习

    同时,研究Netty的性能优化技巧,如适当配置内存池,理解并使用水印策略等。 在实际项目中,Netty广泛应用于分布式系统、游戏服务器、流媒体服务、RPC框架等领域。熟练掌握Netty,不仅可以提升开发效率,还能构建出...

    Java高并发编程代码(Netty NIO 实例)

    通过学习和实践"gameNettyDemo-master"这个项目,你可以深入了解Netty如何利用NIO实现高并发,并在实际项目中应用这些技术,提升服务器性能和稳定性。同时,也可以进一步研究Netty的其他高级特性,如零拷贝、线程池...

    一个由 Java 实现基于 Netty 的即时通讯系统,包括服务端和客户端.zip

    本项目包括服务端和客户端两部分,为理解 Netty 在即时通讯中的应用提供了实践基础。 1. **Netty 框架介绍** - Netty 是一个非阻塞的 I/O 框架,它基于 Java NIO(非阻塞 I/O)实现,提供了高性能、低延迟的网络...

Global site tag (gtag.js) - Google Analytics