`
laolinshi
  • 浏览: 40925 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

netty优化

 
阅读更多

  为了提高单机netty服务器的并发处理能力,可以从以下几个方面对netty进行优化。

 

      首先,在服务器初始化的时候需要设置两个线程池: 一个是用来接收客户端的连接,可以命名为eventLoopGroupBoss, 由于接收连接是非常快速的事情,所以这个线程池的线程数通常设置为1,设置为多个线程时可能会在多个线程之间产生对资源的竞争,反而不利于服务器处理能力的提高;另一个是用来处理客户端的读写操作,命名为eventLoopGroupWorker,由于处理网络IO操作是非常耗时的,为了能够尽可能多的处理客户端的连接,所以这个线程池的线程数通常设为多个,具体需要设置的数量可以根据业务量和CPU核数进行调整,一般设置成CPU核数的两倍到三倍是一个好的选择。在这个过程中,为了方便系统BUG 的解决,可以为每个线程池设置一个自定义的ThreadFactory,这个factory的作用是根据线程池的类型为创建的线程设置一个特殊的名称,如boss线程的名称是NettyBoss_,工作线程的名称是NettyServerSelector_%d_%d,这样可以在以后的问题排除过程中利用这个名称识别不同的线程,分析这些线程的资源占用率,便于找到问题的根源。

 

     此外,如果部署服务器的操作系统是Linux, 在选中worker线程池的时候可以考虑用epoll代替传统的select,前者对应neitty提供的EpollEventLoopGroup,后者对应的是NioEventLoopGroup。之所以要这样做,是因为传统的select基于轮询的方式来进行事件处理,随着fd数量的增加,导致轮询的处理开销增大,实际的事件处理效率就会下降。而epoll是基于通知的方式,每当事件准备就绪的时候,epoll就会通知线程进行处理,这样可以保证及时性的同时也不会随着fd的数量的增加而降低效率。

   

    其次,给netty的运行参数设置一个合理的值,对netty的运行性能会有很大的影响。首先,需要设置的参数是SO_BACKLOG,这个值通常设置1024,意味着当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度。这样就可以服务器处理能力达到饱和的情况下用队列来暂存用户取得请求,等服务器空闲的时候再从队列中取出请求来处理,而不是马上拒接掉。其次,需要设置数据发送和接收缓冲区大小的参数,分别是SO_SNDBUF和SO_RCVBUF,两者可以设置成1048576,即是128K,在性能优化是通常都设置成这样。再次,给netty的内存分配设置一个内存池,需要内存时就从内存池中分配,使用完了再归还给内存池以便可以重复利用。这样就可以避免每次使用内存所带来的内存创建和销毁开销,而且还不容易形成内存碎片。基于这样的目的可以使用netty提供的PooledByteBufAllocator分配器,需要注意的是使用这个分配器分配的内存使用完后必须手动进行释放,否则会造成内存泄漏。最后,还有一个参数在业务量比较大的时候需要进行设置,这就是WRITE_BUFFER_WATER_MARK,他的作用是限制netty向channel写数据时使用的缓冲区边界。当netty需要往channel中写入数据时会先把数据写入一个Buffer缓冲区,这个缓冲区是各个channel独占的,不共享。等到channel空闲的时候就从缓冲区中读取数据进行发送。这样做可以提高网络的吞吐量。但也带来了一个缺点,就是在碰到对端非常慢(对端慢指的是对端处理TCP包的速度变慢,比如对端负载特别高的时候就有可能


是这个情况)的时候就出问题了,这个时候如果还是不断地写数据,这个buffer就会不断地增长,最后就会由于占用大量的内存引起服务器处理缓慢,进而可能引起崩溃。这时WRITE_BUFFER_WATER_MARK就派上用场了,它规定了高低水位线。当Buffer的数据超过高水位线时就停止写入数据,设置channel的isWritable为false。等到buffer中的数据由于被消费而低于低水位线时设置channel的isWritable为true,又可以重新接受写入的数据。所以设置了这个参数之后,对应用的要求是,每次写数据时先判断channel的isWritable,在 true时才进行写入。

 

       最后,在构造netty处理链的时候可以在链的最前边加上一个线程池,它的作用是把之后的handler放在单独的线程中进行处理,如编解码,加解密,具体的业务逻辑处理等。这样可以达到不阻塞I/0线程的目的,让I/0线程可以及时返回来处理新的请求,借此可以极大的提高服务的并发处理能力,相关的代码如下:

ch.pipeline().addLast(
        defaultEventExecutorGroup, //单独的线程池,让之后的handler在这里处理
        new NettyEncoder(), //解码
        new NettyDecoder(), //编码
        new IdleStateHandler(0, 0, nettyServerConfig.getServerChannelMaxIdleTimeSeconds()),
        new NettyConnetManageHandler(),
        new NettyServerHandler());//业务处理Handler
}

 此外,考虑到具体的业务逻辑处理可能涉及到耗时的数据库操作或远程RPC调用,因而在具体的业务处理Handler中启动一个新的线程来处理相关逻辑,如上图的NettyServerHandler。这样可以让这些耗时的操作不阻塞处理Handler的线程,让线程可以及时返回来处理新的操作,同样可以起到提高服务器并发处理能力的目的。相关的代码如下:

class NettyServerHandler extends SimpleChannelInboundHandler<RemotingCommand> {
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, RemotingCommand msg) throws Exception {
            Runnable run = new Runnable() {
                @Override
                public void run() {
                    //具体的业务逻辑处理
                }
            }
            submit(run);//在线程池中提交处理任务
        }
 }

 

   

分享到:
评论

相关推荐

    jvm、nio、netty优化使用.txt

    java框架应用,以及优化使用。Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和简化了TCP和UDP套接字服务器等网络编程。 “快速简便”并不意味着最终的...

    互联网大厂Netty网络编程开发三部曲-Netty优化+进阶+ 入门 Netty协议设计与解析

    (1)\day01;目录中文件数:25个 ├─(1) 第1章_01_nio三大组件-channel-buffer.mp4 ├─(2) 第1章_02_nio三大组件-服务器设计-多线程版.mp4 ├─(3) 第1章_03_nio三大组件-服务器设计-线程池版.mp4 ...

    Netty教程源码资料

    本资源含Netty全系列教程:如NIO、Netty入门、Netty进阶、Netty优化与源码; 分为讲义、大纲、代码三个部分。

    Java性能调优 6步实现项目性能全面升级+面试高频性能问题讲解.rar

    分享课程——【完整版15章】...性能优化的N种企业级解决方案,囊括了【数据库优化】、【Tomcat优化】、【JVM优化】、【垃圾回收】、【Netty优化】、【Nginx优化】、【性能优化高频面试集锦】6大专题+1项面试调优复盘。

    浅析Netty,让高并发来的更猛烈些吧

    netty简单介绍,希望对你有所帮助

    Netty网络编程视频教程

    近百节视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程内容: 一. NIO 基础 1. 三大组件 2. ByteBuffer 3. 文件编程 4. 网络编程 5. NIO vs BIO ...1. 优化 2. 源码分析

    Springboot+netty实现的流媒体服务(可用于直播点播)

    介绍:Springboot、netty实现的http-flv、websocket-flv流媒体服务(可用于直播点播),支持rtsp、h264、h265等、rtmp等多种源,h5纯js播放(不依赖flash),不需要依赖nginx等第三方,低延迟(支持识别h264、aac...

    Netty 入门与实战:仿写微信 IM 即时通讯系统.rar

    Netty 入门与实战:仿写微信 IM 即时通讯系统,掘金小册子,netty教程。章节齐全无缺失,排版非常不错。 1.仿微信IM系统简介 1 ...15.实战:群聊消息的收发及Netty性能优化 23 16.心跳与空闲检测 25

    netty springmvc dubbo 集成实例

    结合原springmvc与netty集成的例子,加上了与dubbo的集成,并优化处理netty获取get/post请求参数获取

    netty4.0.x安装包

    Netty底层对线程,selector做了很多细小的优化,精心设计的reactor线程模型做到非常高效的并发处理 自带各种协议栈让你处理任何一种通用协议都几乎不用亲自动手 Netty社区活跃,遇到问题随时邮件列表或者issue Netty...

    Netty in Action 中文版 源代码

    《Netty in Action》中文版源代码,作者专门为其进行了本地优化

    基于Netty框架的demo项目

    项目中,你可以清晰地看到BIO与NIO模型在Netty中的灵活运用,如何通过Netty的高性能特性来优化网络通信。此外,demo还详细展示了如何通过自定义编解码器处理网络通信中的数据编解码问题,以及如何利用心跳机制确保...

    android-netty:适用于 Android 的 Netty 客户端

    这个库比原来的库小很多(大约279 KB,经过Proguard优化后会缩小到50-100 KB左右)。 该库是适用于 Android 的 Netty ( ) 项目 v3.8 的轻量级版本。 我们从 Netty 内部的代码中删除并清理了 Android 不必要的内容...

    netty+spring服务端-omen-1.3

    omen-1.3 自己基于netty开发的服务端,支持spring配置服务器启动模式:http,tcp,websocket等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用...

    Netty4.1.101稳定版本

    Netty 是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端。  简单地说Netty封装了JDK的NIO,不用再写一大堆复杂...对Selector做了很多细小的优化,reactor线程模型能做到高效的并发处理。

    high_performance_rpc_with_netty

    high_performance_rpc_with_netty 使用netty 编程rpc通讯,需要注意的地方。还,,,,,,,,,有提到一些netty的优化点

    Netty——基本使用介绍

    在对通信模型有了基本的认识时,学习到的仅仅是一个模型,如果想把这些真正的用于实际工作中,那么还需要不断的完善、扩展和优化。比如经典的TCP读包写包问题,或者是数据接收的大小,实际的通信处理与应答的处理...

    http-benchmark-netty:基于Java Netty的HTTP客户端工具 & HTTP高性能测试工具。参数灵活定制、支持邮件报表等。Python Tornado版

    测试工具基于频繁的业务测试不断优化改进,稳定可靠、实用性强。简介:基于netty异步库开发,one epoll per thread模型,性能强悍。支持随机请求、支持配置线程数、客户端个数、支持压力山大发送模式。支持返回结果...

    最佳DNS优化DnsJumper官版.zip

    最佳DNS优化DnsJumper官版,是众多DNS优化小程序当中选择出来,留作本地使用的,看中了DnsJumper官版安全便捷,希望它带给亲们美好的更加顺畅的无线路由网络体验。

Global site tag (gtag.js) - Google Analytics