Netty高性能调优点

netty高性能调优点 netty 关于netty的学习和介绍,可以去github看官方文档,这里良心推荐《netty实战》和《netty权威指南》两本书,前者对于新手更友好,原理和应用都有讲到,多读读会发现很多高性能的优化点。 netty高性能优化点 最近参加了阿里中间价性能比赛,为了提升netty写的servive mesh的网络通信的性能,最近几天查了书、博客(这里强力推荐netty作者的博客,干货真的很... 阅读详情

转自:https://blog.youkuaiyun.com/C_J33/article/details/80737053

首先要明确要netty优化的几个主要的关注点。

  1. 减少线程切换的开销。
  2. 复用channel,可以选择池化channel
  3. zero copy的应用
  4. 减少并发下的竞态情况

1. 尽可能的复用EventLoopGroup。
这里就要涉及netty的线程模型了。netty实战的第七章里有很细致的阐释。简单说EventLoopGroup包含了指定数量(如果没有指定,默认是cpu核数的两倍,可以从源码中看到)的EvenetLoop,EvenetLoop和channel的关系是一对多,一个channel被分配给一个EventLoop,它生命周期中都会使用这个EventLoop,而EventLoop背后就是线程。见下图。

因此不需要每次都new出一个EventLoopGroup,其本质上是线程分配,可以复用同一个EventLoopGroup,减少资源的使用和线程的切换。特别是在服务端引导一个客户端连接的时候。如下:

ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup())
        .channel(NioServerSocketChannel.class)
        .childHandler(new SimpleChannelInboundHandler<ByteBuf>() {
            @Override
            protected void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf) 
                throws Exception {
                Bootstrap bootstrap = new Bootstrap();
                bootstrap.channel(NioSocketChannel.class)
                    .group(ctx.channel().eventLoop())
                    .handler(new SimpleChannelInboundHandler<ByteBuf>() {
                            @Override
                            protected void channelRead0(ChannelHandlerContext ctx, ByteBuf in) 
                                throws Exception {
                                System.out.println("Received data");
                            }
                        });
                ChannelFuture future =  bootstrap.connect(new InetSocketAddress(xxx, 80));
                future.addListener(new ChannelFutureListener() {
                    @Override
                    public void operationComplete(ChannelFuture future) throws Exception {
                        // do something
                    }
                });
            }
        });
bootstrap.bind(new InetSocketAddress(8080)).sync();

2. 使用EventLoop的任务调度

在EventLoop的支持线程外使用channel,用

channel.eventLoop().execute(new Runnable() {
   @Override
    public void run() {
        channel.writeAndFlush(data)
    }

而不是直接使用channel.writeAndFlush(data);

前者会直接放入channel所对应的EventLoop的执行队列,而后者会导致线程的切换。

3. 减少ChannelPipline的调用长度

public class YourHandler extends ChannelInboundHandlerAdapter {
  @Override
  public void channelActive(ChannelHandlerContext ctx) {
    // BAD (most of the times)
    ctx.channel().writeAndFlush(msg); 
    // GOOD
    ctx.writeAndFlush(msg); 
   }
}

前者是将msg从整个ChannelPipline中走一遍,所有的handler都要经过,而后者是从当前handler一直到pipline的尾部,调用更短。同样,为了减少pipline的长度,如果一个handler只需要使用一次,那么可以在使用过之后,将其从pipline中remove。


4. 减少ChannelHandler的创建

如果channelhandler是无状态的(即不需要保存任何状态参数),那么使用Sharable注解,并在bootstrap时只创建一个实例,减少GC。否则每次连接都会new出handler对象。

@ChannelHandler.Shareable 
public class StatelessHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelActive(ChannelHandlerContext ctx) {}
}
public class MyInitializer extends ChannelInitializer<Channel> {
    private static final ChannelHandler INSTANCE = new StatelessHandler();
    @Override
    public void initChannel(Channel ch) {
        ch.pipeline().addLast(INSTANCE);
    }
}

同时需要注意ByteToMessageDecoder之类的编解码器是有状态的,不能使用Sharable注解。

 

5. 减少系统调用(Flush)的调用

flush操作是将消息发送出去,会引起系统调用,应该尽量减少flush操作,减少系统调用的开销。

同时也要减少write的操作, 因为这样消息会流过整个ChannelPipline。

 

6. 利用netty零拷贝,在IO操作时使用池化的DirectBuffer
在bootstrap配置参数的时候,使用.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)来指定一个池化的Allocator,并且使用ByteBuf buf = allocator.directBuffer();来获取Bytebuf。

PooledByteBufAllocator,netty会帮你复用(无需release,除非你后面还需要用到同一个bytebuf)而不是每次都重新分配ByteBuf。在IO操作中,分配直接内存而不是JVM的堆空间,就避免了在发送数据时,从JVM到直接内存的拷贝过程,这也就是zero copy的含义。

 

7. 一些配置参数的设置
ServerBootstrap启动时,通常 bossGroup 只需要设置为 1 即可,因为 ServerSocketChannel 在初始化阶段,只会注册到某一个 eventLoop 上,而这个 eventLoop 只会有一个线程在运行,所以没有必要设置为多线程。而 IO 线程,为了充分利用 CPU,同时考虑减少线上下文切换的开销,通常设置为 CPU 核数的两倍,这也是 Netty 提供的默认值。

在对于响应时间有高要求的场景,使用.childOption(ChannelOption.TCP_NODELAY, true)和.option(ChannelOption.TCP_NODELAY, true)来禁用nagle算法,不等待,立即发送。

8. 小心的使用并发编程技巧
千万不要阻塞EventLoop!包括了Thead.sleep() CountDownLatch 和一些耗时的操作等等,尽量使用netty中的各种future。如果必须尽量减少重量级的锁的的使用。

在使用volatile时,
坏的:

private volatile Selector selector;
public void method() {
  selector.select();
  ....
  selector.selectNow();
}

好的:先将volatile变量保存到方法栈中,jdk源码中大量的使用了这种技巧。

private volatile Selector selector;
public void method() {
  Selector selector = this.selector;
  selector.select();
  ....
  selector.selectNow();
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

【Netty系列】Netty高性能架构设计以及光速入门 关于这个问题,我贴一段官网的阐述:大概意思是:Netty 是一个 NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。具体来说,Netty就是对于Java NIO 的封装。 阅读详情

相关推荐

驾驭并发:Netty 高性能网络通信框架原理与实践

Netty 是一个基于 Java NIO(非阻塞 IO)的高性能、异步事件驱动的网络通信框架。 它极大地简化了 TCP/UDP/HTTP 等协议的开发,屏蔽了底层复杂的 NIO 调度细节。

moton2017的博客 1410

netty的优势

1.介绍 Netty是由JBOSS提供的一个java开源框架。 Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持。作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。 2.Netty的特点 1)高并发 Netty是一款基于NIO(Nonblo...

胜天半子 6204

几率大的网络安全面试题(含答案)

其他篇章:Java校招极大几率出的面试题(含答案)----汇总 本文面试题汇总: 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理 rip协议是什么?rip的工作原理 什么是RARP?工作原理 OSPF协议?OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手? tcp为什么要三次握手? dns是什么?dns的工作原理 一次完整的HTTP请求过程 Cookies和ses...

睶 6万+

netty 总结

重要类说明 线程模型及原理 代码实现 tcp连接 udp连接 websocket连接 单线程 多线程 主从多线程 EventLoopGroup bossGroup=new NioEventLoopGroup(2);//accept线程池 EventLoopGroup workerGroup=new NioEventLoopGroup(2);//具体负责读写及业务处理的工作线程池 ServerBootstrap b = new Server...

FREEDOM 1122

find命令

命令是 Linux/Unix 系统中用于搜索文件和目录的强大工具,支持多种搜索条件组合,并能对搜索结果执行各种操作。以下是其详细说明、常用参数及示例: 搜索路径:指定起始目录(如 、 或 表示当前目录)。 查找条件:基于文件名、类型、大小、时间等属性过滤。 处理动作:对匹配结果执行操作(如打印、删除、执行命令等)。 常用参数及示例 1. 按名称查找 :区分大小写匹配文件名。 :不区分大小写匹配文件名。 2. 按文件类型查找 :指定文件类型。 文件类型: :普通文件 :目录 :符号链接

qiao2458的博客 1134

文石NoteX3国行版安装 Google Play经验分享

文石NoteX3国行版安装 Google Play经验分享。

2301_80693261的博客 7596

前传04 | Netty性能调优

Netty性能调优的一些经典记录

qiushily2030的博客 2284

光伏发电系统模拟及其发电预测开源python工具pvlib

本文介绍光伏发电系统模拟及其发电预测开源python工具pvlib,以及举例介绍获取辐照度方法、光伏发电预测思路。

肖永威的专栏 1万+

Netty 参数调优

文章目录一、CONNECT_TIMEOUT_MILLIS二、SO_BACKLOG三、TCP_NODELAY四、SO_SNDBUF & SO_RCVBUF五、ALLOCATOR六、RCVBUF_ALLOCATOR 一、CONNECT_TIMEOUT_MILLIS 属于 SocketChannal 的参数 用在客户端建立连接时,如果在指定毫秒内无法连接,会抛出 timeout 异常 注意:Netty 中不要用成了SO_TIMEOUT 主要用在阻塞 IO,而 Netty 是非阻塞 IO 示例 publ

weixin_48922154的博客 2084

FFmpeg硬件加速实战:VAAPI驱动配置全攻略(含NVIDIA/Intel避坑指南)

本文详细解析了在Linux环境下配置FFmpeg使用VAAPI接口实现硬件加速的完整流程。针对NVIDIA、Intel等主流显卡,提供了从驱动安装、环境变量设置到多显卡切换的实战指南,并重点解决了闭源驱动冲突、国产系统适配等常见问题,帮助用户有效提升视频处理性能。

weixin_29306011的博客 454

从Demo到产品:基于ADAU1452的ANC方案,硬件选型、性能优化与避坑指南

本文详细解析了基于ADAU1452的主动降噪(ANC)方案从Demo到产品的实现路径,涵盖硬件选型、性能优化与实战避坑指南。重点探讨了ADAU1452与ADAU1466的性能差异、编解码器选型策略,以及MFXLMS算法优化技巧,为工程师提供从理论验证到量产落地的系统级解决方案。

weixin_30542079的博客 451

netty的优点

Netty作为业界最流行的nio框架之一,它的健壮性、功能、性能、可定制性、可扩展性都是首屈一指的,有点总结如下:1,API使用简单,开发门槛低。2,功能强大,预置了多种编解码功能,支持多种主流协议。3,定制能力强,通过channelHandler对通信框架进行灵活扩展。4,性能高。5,成熟,稳定,修复了所有的jdk nio bug.6,社区活跃。7,经历了大规模的商业应用考验,质量得到验证。...

zcbyzcb的专栏 4866

092、Python在芯片验证中的应用:从脚本小子到验证架构师

Python在芯片验证中的高效应用 本文通过实际案例展示了Python在芯片验证中的关键作用。凌晨三点的调试场景揭示了传统方法的局限,Python脚本能在20分钟内分析80GB波形数据定位FIFO指针问题。文章重点介绍了两个核心工具: 智能日志分析系统:通过正则表达式和上下文分析,自动分类百万行验证日志中的错误,生成可视化报告,效率远超传统grep方法。 寄存器模型生成器:将Excel表格自动转换为UVM寄存器模型代码,将原本需要两周的手工工作缩短至两小时,同时保证零错误。 文章还展示了Python与Sys

z534437748的博客 71

一篇关于Netty相关的梳理总结

Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。它简化了 TCP/IP、UDP 协议的实现,并提供了灵活的协议处理和事件驱动机制,广泛应用于高并发、低延迟的网络应用,如实时通信、在线游戏、大数据传输等场景

可乐加.糖 1222

MATLAB应用实战系列(七十七)-基于长时间序列栅格数据的MK检验

1 MK检验介绍 MK检验是曼-肯德尔法,又称Mann—Kenddall 检验法,是一种气候诊断与预测技术,应用Mann-Kendall检验法可以判断气候序列中是否存在气候突变,如果存在,可确定出突变发生的时间。Mann-Kendall检验法也经常用于气候变化影响下的降水、干旱频次趋势检测。目前常用于长时间序列的栅格数据的显著性检验,在植被覆盖度,NDVI,NPP等方面尤为常见。 该检验功能强大,不需要样本遵从一定的分布,部分数据缺失不会对结果造成影响,不受少数异常值的干扰,适用性强。不但可以检验时

wenyusuran的专栏 6290

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Netty 有哪些优点?

不同于之前学的 SSM 框架,Netty 还是需要一定学习成本的,一方面是国内资源太缺乏,另一方面很多重要的概念(比如 NIO)还是要多动手写代码调试才能理解。还是建议先从视频入门,并且不建议在 Netty 上花太多时间,面试的时候一般也就考察一些 Netty 背后的思想(比如 NIO)而非框架本身的语法细节。很多网络框架和服务器程序都用到了 Netty 作为底层,学好 Netty 不仅可以让我们自己实现高性能服务器,也能更好地理解其他的框架应用、阅读源码。

m0_56653160的博客 826

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

告别99%性能损耗:Netty高性能调优实战指南

你是否还在为分布式系统中的网络延迟而头疼?是否遇到过Netty服务在高并发下吞吐量骤降?本文将从源码层面揭示Netty性能调优的核心秘诀,带你掌握从线程模型到内存管理的全链路优化方案。读完本文你将获得: - 3种Reactor线程模型的选型决策指南 - 内存池配置的5个关键参数调优技巧 - FastThreadLocal比JDK ThreadLocal快400%的实现原理 - TCP粘拆包问题的4...

gitblog_00376的博客 1064

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Netty优点

BIO的缺点: public static void main(String[] args) throws FileNotFoundException { try { ServerSocket server = new ServerSocket(5555); while (true) { Socket socket = server.accept(); //这是阻塞的,没有客户端到来,一直停在这里 System

zhengchao1991的博客 566

Netty 入门教程:高性能网络编程框架

Netty 是一个用于构建高性能、可扩展的网络应用的框架。它抽象了 Java 原生的复杂 NIO API,提供了简单易用的 API,使得开发网络应用变得更加简便。Netty 可以用于各种场景,包括 TCP/IP 服务器、HTTP 服务器、WebSocket 服务器等。

Casual_Lei的博客 3462

三、Netty高性能架构设计

文章目录三、Netty高性能架构设计1、Netty概述1.1、原生NIO存在的问题1.2、Netty优点2、I/O线程模型2.1、传统阻塞I/O服务模型2.1.1、模型分析2.1.2、模型实现代码示例2.2、Reactor模型概述2.3、单Reactor单线程模式2.2.1、模型分析2.2.2、模型实现代码示例2.4、单Reactor多线程模型2.4.1、模型分析2.4.2、模型实现代码示例2.5...

qq_35751014的博客 3463

Netty框架详解

Netty是一款基于Java NIO的网络编程、高性能、异步事件驱动的网络应用框架。它的设计目标是提供简单易用、高性能、可扩展的网络编程框架。

qq_33807380的博客 1万+

为什么Netty性能好?深入解析Netty的高性能原因

Netty的高性能得益于其在多个方面的优化和创新。通过基于Reactor模式的高效I/O处理、零拷贝技术、内存池机制、异步非阻塞编程模型以及与epoll/kqueue的集成,Netty在处理高并发、低延迟的网络应用中表现卓越。同时,模块化设计和灵活的扩展性使得Netty能够适应不同的业务需求,成为高性能网络应用开发的首选框架。

一位努力搬砖程序员。在这里,我会分享关于编程技巧、项目实战经验以及对新技术的见解。希望通过我的文章能够帮助你在技术路上更进一步。期待与你共同学习和成长! 1079

Netty 高性能架构设计

Netty 概述 原生 NIO 存在的问题 1.NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 2.需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 3.开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。 4.J

Java硬件工程师的博客 1234

高性能NIO框架Netty入门篇

Netty介绍 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如...

u010889990的专栏 3344

Netty的高性能之道

Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。Netty 现在都在用的是4.x,5.x版本已经废弃,Netty 4.x 需要JDK 6以上版本支持。

zhiyikeji的博客 1870
上一篇: (转)MYSQL order by排序与索引关系总结
下一篇: MQ死信队列的应用场景
AAA821
博客等级 码龄14年 19粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值