java并行流 阻塞主线程_记一次使用Java8并行流导致的服务瓶颈问题排查

本文记录了一次由于使用Java8并行流导致服务出现性能瓶颈的问题,详细介绍了问题背景、服务架构、问题描述以及解决方法。在排查过程中,发现大量业务线程因并行流的限制被阻塞,最终通过修改代码,将并行流替换为普通流,提高了系统并发性和CPU利用率,解决了问题。
摘要由CSDN通过智能技术生成

一、业务背景#

二、服务架构#

服务使用线程池对请求进行业务处理,corePoolSize=32,maximumPoolSize=128。

三、问题描述#

服务部署到测试环境,将线上流量通过tcp-copy打到服务上后,测试反馈出现丢失消息的情况。查看服务日志,发现了

service overload discard msg

即业务线程处理缓慢造成消息堆积队列超限,后续消息被ExecutorService的Reject策略主动丢弃。

查询服务请求QPS为500/s,不算高。理论上业务处理流程没有很重很慢的操作,监控外部依赖接口的响应速度也在ms级别,所以很奇怪为什么服务的性能瓶颈这么低。

四、问题查解#

1、系统监控####

查询系统监控指标,包括CPU使用率(18%)、网卡流量、内存使用率和IO时间等,未发现异常。

查询jvm 内存使用及GC情况,未发现异常。

2、jvm 线程堆栈####

jstack pid >pid.txt打印服务进程线程栈信息:

c8e116d5b29f

线程堆栈信息

发现异常:

128个业务线程中有126个线程状态为java.lang.Thread.State: WAITING (on object monitor),只有2个线程状态为正常RUNNABLE。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值