图16 G1参数调优后效果
6.线程异步改成 NIO 异步编程
NIO(非阻塞 IO)可以减少线程数量,提高线程的利用率,从而降低线程切换带来的超时。
1)分析:CPU 指标
分析 CPU 相关指标,如果出现 CPU 利用率正常,CPU Load 高需要重点关注(如果是CPU 利用率高的情况,说明 CPU 本身就很繁忙,那 CPU Load 高也比较正常)。
在分析之前,先介绍几个概念:
- CPU时间片
CPU 将时间分成若干个时间片,每个时间片分配给一个线程使用。当一个时间片用完后,CPU 会停止当前线程的执行,进行上下文切换到下一个任务,以此类推。
这样可以让多个任务在同一时间内并发执行,提高系统的效率和响应速度。
下图模拟了单核 CPU 执行的过程,需要注意的进行上下文切换是需要开销的,但实际一次上下文切换需要的时间很短(一般是微秒级别)。
图17 CPU执行线程流程
按时间片维度来理解,假设每次时间片都正好被使用完。
- CPU Load
从上面概念分析,如果出现 CPU 利用率正常,但是 CPU Load 高,那说明 CPU 空闲时间片、等待线程数很多,正在使用的时间片很少,这种情况要减少 CPU Load 需要减少等待线程数。
2)分析:实际案例
我们之前生产遇到过多次 CPU Load 高 CPU 利用率正常的情况。问题出现前后代码没有变动,比较明显的变化是流量有上涨。排查代码发现有使用线程池并发调用接口的地方,调用方式如下图。