为了提高单机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);//在线程池中提交处理任务 } }
相关推荐
java框架应用,以及优化使用。Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和简化了TCP和UDP套接字服务器等网络编程。 “快速简便”并不意味着最终的...
(1)\day01;目录中文件数:25个 ├─(1) 第1章_01_nio三大组件-channel-buffer.mp4 ├─(2) 第1章_02_nio三大组件-服务器设计-多线程版.mp4 ├─(3) 第1章_03_nio三大组件-服务器设计-线程池版.mp4 ...
5. **Netty优化** - **序列化算法**:Netty可以扩展不同的序列化算法以提高数据交换效率。 - **参数调优**:涉及连接超时、连接队列大小、FD限制、Nagle算法禁用以及发送和接收缓冲区大小的调整。 - **PRC框架**...
此外,还介绍了ByteBuf作为Netty自定义的字节缓冲区,它是Netty优化性能的关键工具。 安全方面,Netty支持SSL/TLS加密,提供了安全的网络通信。同时,书中还会涵盖故障处理和日志记录,帮助开发者构建健壮的应用。 ...
**Netty优化与源码解析** “Netty04-优化与源码.md”将深入探讨如何优化Netty应用性能,这可能包括减少内存拷贝、选择合适的线程模型、配置合适的缓冲区大小等。同时,源码分析可以帮助理解Netty内部的工作机制,...
零拷贝技术则是Netty优化I/O性能的重要手段,减少了数据在内存层次间的复制,提升了系统效率。Pipeline机制则是Netty的核心设计,它允许开发者定义和组织处理链,实现了请求的灵活路由和过滤。 除此之外,《Netty...
4. **高性能**:Netty优化了内存管理和线程模型,减少了不必要的对象创建和系统调用,提升了系统性能。 5. **易用性**:Netty提供了简单易用的API,降低了学习曲线,并且有详细的文档和丰富的示例代码,方便开发者...
- **聚合与分散操作**:Netty优化了NIO中的缓冲区聚合和分散操作,降低了因频繁操作引起的内存泄漏风险。 - **解决Epoll Bug**:针对Java NIO中存在的著名Epoll bug,Netty进行了特别的处理,确保在使用Epoll作为...
6. **性能优化**:Netty的性能优化策略,如内存管理、线程模型调整、缓冲区复用等,以提高系统的吞吐量和响应速度。 7. **Netty底层原理**:探讨Netty如何利用Java NIO实现异步非阻塞I/O,以及零拷贝技术的工作机制...
分享课程——【完整版15章】...性能优化的N种企业级解决方案,囊括了【数据库优化】、【Tomcat优化】、【JVM优化】、【垃圾回收】、【Netty优化】、【Nginx优化】、【性能优化高频面试集锦】6大专题+1项面试调优复盘。
通过学习和实践这个项目,你可以掌握SpringBoot的实战应用,了解WebSocket如何与服务器通信,以及如何利用Netty优化性能。同时,这也是一个很好的机会去探索前后端分离、数据库设计、安全性策略等相关知识。
书中的实战部分会指导读者如何从零开始构建一个Netty应用,包括设置项目、编写服务器和客户端代码,以及进行性能优化。读者将学会如何处理网络连接的建立、断开,如何处理不同类型的网络数据,以及如何调试和监控...
书中会详细解析这些概念,并指导如何正确配置线程池以优化性能。 此外,书中还会探讨Netty的安全性,包括SSL/TLS加密通信的实现,以及如何配置和管理证书,保障网络通信的安全。 最后,实战部分会介绍如何将Netty...
- 通过配置合适的缓冲区大小、线程池大小等参数,以及使用零拷贝技术,可以进一步优化 Netty 应用的性能。 7. **实战演练** - 创建一个简单的 WebSocket 服务器,监听特定端口,并向连接的客户端发送实时数据,如...
2. **高效性**:Netty通过减少对象创建和内存复制来优化性能,例如,它的ByteBuf类提供了高效的字节缓冲区管理。 3. **灵活性**:Netty支持多种网络协议,如TCP、UDP、HTTP、WebSocket、FTP等,以及自定义协议。它...
Netty 4.1.6版本引入了许多改进和优化。例如,性能提升、内存管理优化、错误处理的增强以及对新协议的支持等。此外,Netty的API设计易于理解和使用,使得开发者可以专注于业务逻辑,而无需过多关注底层网络通信的...
5. **Netty的性能优化** - **零拷贝技术**:通过Buffer直接内存映射和FileRegion,减少数据在用户空间和内核空间之间的复制。 - **池化技术**:对象池和ByteBuf池减少对象创建和销毁的开销。 6. **Netty的实战...
总的来说,SpringBoot整合Netty的实践涉及到SpringBoot的应用构建、Netty的服务器和客户端创建、响应式编程模型、以及两者的交互和配置优化等多个层面。通过这个Demo,开发者能够更好地理解和掌握如何在SpringBoot...
Netty 4.1.19.Final 版本包含了多个优化和改进,例如更好的内存管理、性能提升以及对新协议的支持。其中,ByteBuf是Netty自定义的缓冲区,它比Java的ByteBuffer更高效,支持零拷贝,有助于减少内存开销和提高网络I/O...
通过查看源码,开发者可以更好地掌握如何利用Netty的特性来优化自己的网络应用。 Netty的核心特点包括: 1. **异步事件驱动**:Netty使用非阻塞I/O模型,基于Java NIO(Non-blocking I/O)实现,能够处理大量的...