图8 HTTP线程数突增
- 总线程数
再看下总线程数是否有增加(排除 HTTP 线程数),如果有,说明有使用多线程导致线程数量增加。这个时候需要 Dump 下线程,看下哪些线程使用的比较多。
2)解决方案
- 统一管理线程池:动态配置参数 监控能力
通过工具类封装统一的线程池,提供动态配置参数和线程池监控能力。
效果:线程池具备监控能力,如下图是最小值(核心线程数)、最大值(最大线程数)和当前线程池中线程数量的监控,可以参考这个来调整线程池参数。
图9 线程池水位线监控
- 异步改同步:小于10ms 的不使用多线程
高并发的场景下线程太多,线程调度时间得不到保障,一次任务需要多个 CPU 时间片,下一次调度的时间无法得到保障。
如下图是一个线程池执行耗时埋点,通过埋点发现 A 在线程池中执行的比较快,平均线和 P95 都在 10ms 以下,没有必要使用线程池,改成同步执行。
图10 优化前执行耗时
效果:接口性能提升明显,平均线从 2.7ms 降低到 1.6ms,P99.9 从 23.7ms 降低到 1.7ms。
之前使用多线程,请求量有波动的时候线程增加比较多,导致线程调度时间得不到保障,体现到 P99.9 就很高。
图11 优化前后耗时对比
另外可以明显看到总线程数也相应减少了很多。