Netty线程介绍
在Netty中有两个比较重要的线程概念,一个是BOSS线程,一个是Woker线程。
- Boss线程组: Boss线程组通常负责处理接受客户端连接的工作,即处理ServerSocketChannel的连接事件。 Boss线程会监听并接受客户端的连接请求,然后将连接注册到Worker线程池中的某个Worker线程上。 通常情况下,建议将Boss线程数配置为1,因为在大多数情况下,一个Boss线程足以处理大量的连接请求。
- Worker线程组: Worker线程组负责处理已经被Boss线程接受的连接,处理IO事件、执行业务逻辑等。 Worker线程池中的每个线程都有一个独立的EventLoop,它负责处理多个Channel的事件。 通过配置多个Worker线程,可以实现并发处理多个连接,提高系统的吞吐量。
- 配置建议: Boss线程数: 通常情况下,一个Boss线程足以处理大量的连接请求,因此可以将其配置为1。 可以通过ServerBootstrap的group方法来配置Boss线程组。
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
// ...其他配置
.bind(port);
- Worker线程数: Worker线程的数量应该根据服务器的性能和处理能力来配置。 如果服务器是多核的,通常可以配置多个Worker线程,以充分利用多核处理器的优势。 一般建议配置的线程数为核心数的两倍到四倍之间,具体取决于应用的性能需求和硬件条件。
EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 1 Boss线程
EventLoopGroup workerGroup = new NioEventLoopGroup(4); // 4 Worker线程
线程数的调优: 可以根据应用的性能测试结果来动态调整Boss和Worker线程的数量,以达到最佳的性能表现。 通过监控系统资源利用率、CPU使用率等指标,可以调整线程池大小以平衡吞吐量和资源消耗。
Netty实战配置
上面我们已经简单的讲解了一下Netty中涉及到的两个线程,这里我们开始进行编码,然后使用压测工具JMeter进行测试,我们就能明显的看到修改Netty的线程数量在一定程度上可以提升我们网关的性能。
按照上面的Netty的Worker线程的数量进行配置,然后我们进行1000*1000数量的压测。
吞吐量大概为1.8w。
之后,我们修改我们的Worker线程数量为CPU的核心数量。
吞吐量大概为2.2w。所以合理的配置Worker线程数量可以带来一定的性能提升。
JVM参数与ZGC
JVM提供了许多的参数,我们可以通过合理的配置这些参数来做到性能调优的作用,这里我就不列举出具体的JVM参数了。
其次,我们知道影响Java项目性能的一个点在于垃圾回收器的执行,也就是我们的GC。 比较著名的GC有:G1、ZGC、CMS。 我的项目使用的是JDK19搭建的,所以我的项目支持使用ZGC。 并且ZGC有如下优点:
JVM与ZGC调优
上面讲解了一些理论,接下来我们就基于实际的配置开始对我们的项目进行性能测试。 我们首先进行JVM参数上的调优。 首先设定堆大小。
-Xms10g -Xmx10g
然后,我们知道项目启动的时候,一般都没有进行预热,比如我们的JIT等优化都还没有生效,所以我们先发送少量请求进行预热,防止影响平均值。
之后我们就可以开始配置正常的压测数据,依旧是1000*1000。
这里我先使用的是G1垃圾回收器。
-Xms10g -Xmx10g -Xlog:gc*=info:file=logs/gc.log:time,tags -XX:+UseG1GC
之后,我们换用ZGC
-Xms10g -Xmx10g -Xlog:gc*=info:file=logs/gc.log:time,tags -XX:+UseZGC
给你们看个厉害的
可以发现这个GC的时间相对于G1快了不止一点点。