Nety内存池从实现上可以分为两类:堆外直接内存和堆内存 。由于 Byte Buf主要用于网络IO读写,因此采用堆外直接内存会减少一次从用户堆内存到内核态的字节数组拷贝,所以性能更高 。由于 DirectByteBuf的创建成本比较高,因此如果使用 DirectByteBuf,则需要配合内存池使用,否则性价比可能还不如 Heap Byte 。
Netty默认的IO读写操作采用的都是内存池的堆外直接内存模式,如果用户需要额外使用 ByteBuf,建议也采用内存池方式;如果不涉及网络IO操作(只是纯粹的内存操作),可以使用堆内存池,这样内存的创建效率会更高一些 。
5、IO线程和业务线程分离如果服务端不做复杂的业务逻辑操作,仅是简单的内存操作和消息转发,则可以通过调大 NioEventLoop工作线程池的方式,直接在IO线程中执行业务 Channelhandler,这样便减少了一次线程上下文切换,性能反而更高 。
如果有复杂的业务逻辑操作,则建议IO线程和业务线程分离,对于IO线程,由于互相之间不存在锁竞争,可以创建一个大的 NioEvent Loop Group线程组,所有 Channel都共享同一个线程池 。
对于后端的业务线程池,则建议创建多个小的业务线程池,线程池可以与IO线程绑定,这样既减少了锁竞争,又提升了后端的处理性能 。
针对端侧并发连接数的流控
无论服务端的性能优化到多少,都需要考虑流控功能 。当资源成为瓶颈,或者遇到端侧设备的大量接入,需要通过流控对系统做保护 。流控的策略有很多种,比如针对端侧连接数的流控:
在Nety中,可以非常方便地实现流控功能:新增一个FlowControlchannelhandler,然后添加到 ChannelPipeline靠前的位置,覆盖 channelActiveO方法,创建TCP链路后,执行流控逻辑,如果达到流控阈值,则拒绝该连接,调用 ChannelHandler Context的 close(方法关闭连接 。
三、JVM层面相关性能优化当客户端的并发连接数达到数十万或者数百万时,系统一个较小的抖动就会导致很严重的后果,例如服务端的GC,导致应用暂停(STW)的GC持续几秒,就会导致海量的客户端设备掉线或者消息积压,一旦系统恢复,会有海量的设备接入或者海量的数据发送很可能瞬间就把服务端冲垮 。
JVM层面的调优主要涉及GC参数优化,GC参数设置不当会导致频繁GC,甚至OOM异常,对服务端的稳定运行产生重大影响 。
1、确定GC优化目标GC(垃圾收集)有三个主要指标 。
- 吞吐量:是评价GC能力的重要指标,在不考虑GC引起的停顿时间或内存消耗时,吞吐量是GC能支撑应用程序达到的最高性能指标 。
- 延迟:GC能力的最重要指标之一,是由于GC引起的停顿时间,优化目标是缩短延迟时间或完全消除停顿(STW),避免应用程序在运行过程中发生抖动 。
- 内存占用:GC正常时占用的内存量 。
- Minor go回收原则:每次新生代GC回收尽可能多的内存,减少应用程序发生Full gc的频率 。
- GC内存最大化原则:垃圾收集器能够使用的内存越大,垃圾收集效率越高,应用程序运行也越流畅 。但是过大的内存一次 Full go耗时可能较长,如果能够有效避免FullGC,就需要做精细化调优 。
- 3选2原则:吞吐量、延迟和内存占用不能兼得,无法同时做到吞吐量和暂停时间都最优,需要根据业务场景做选择 。对于大多数应用,吞吐量优先,其次是延迟 。当然对于时延敏感型的业务,需要调整次序 。
3、GC优化过程
- GC数据的采集和研读
- 设置合适的JVM堆大小
- 选择合适的垃圾回收器和回收策略
作者:Dark_King_
原文链接:https://blog.csdn.net/b379685397/article/details/104042536
【如何让单机下Netty支持百万长连接?】
推荐阅读
- 招聘|如何面试管理人员
- 高档礼品盒如何设计呢
- 餐厨垃圾应该如何处理
- 如何辨别汽车太阳膜优劣
- 如何选购好普洱茶,如何选购祁门红茶
- 如何开启手机定位 手机怎么开启定位系统?
- 绿茶粉的功效与作用,如何挑选绿茶粉
- 安化黑茶的动人传说,如何鉴别黑茶的优劣
- 如何挑选购物袋呢
- 白毫银针如何储存,白毫银针十不采