问题1:edas应用中的tomcat的http线程数,跑压测时全部被打满后,出现了大量的dubbo引起的http线程被blocked,大佬们谁了解这一块? 问题2:tomcat线程数耗尽,应该是io阻塞导致的,因为dubbo调用后,有openfeign的请求,请求到响应之间的时间都比较长,比如20s,但是这个会阻塞openfeign之前的dubbo请求,对吗
针对问题1:
在EDAS应用中的Tomcat中,如果HTTP线程数被打满,而且出现了大量的Dubbo引起的HTTP线程被阻塞的情况,可能是因为Dubbo请求生产者的线程池大小过小或者任务处理时间过长导致的。此时可以考虑调整Dubbo生产者的线程池大小,或者优化Dubbo服务的实现逻辑,减少处理时间。
具体的解决方案包括:
调整Dubbo生产者线程池大小:如果Dubbo生产者线程池的大小不足以满足消费者的请求,那么HTTP线程就会被阻塞等待Dubbo生产者线程执行完毕。可以通过调整dubbo线程池大小,确保足够的线程池大小以处理请求。
优化Dubbo服务的实现逻辑:如果Dubbo服务的实现逻辑比较耗时,可以考虑优化Dubbo服务的代码,减少处理时间,或者使用异步调用方式,将耗时的操作放在异步线程中执行,主线程尽量保持快速响应,避免影响HTTP线程的处理。
针对问题2:
如果在Tomcat中出现线程数耗尽的情况,通常原因是I/O阻塞导致的。在Dubbo调用后,OpenFeign请求的响应时间较长,可能会阻塞之前的Dubbo请求。解决方案:
首先可以优化服务实现逻辑,减少I/O操作的耗时,例如使用缓存来减少数据库访问等。
其次,也可以通过将OpenFeign请求设置为异步请求,避免阻塞同步请求对Tomcat线程池的占用。
另外,为了保证应用的稳定性和性能,建议在开发和测试阶段进行压力测试,并监控应用在不同负载下的性能表现,及时识别和解决问题。
根据您提供的信息,这是一段 Java 程序的线程堆栈信息,其中包含了多个线程的执行状态和调用关系。由于缺乏上下文信息,我无法准确判断具体的问题所在,以下是一些可能的解释:
在等待锁时被阻塞:可以看到某些线程状态为 BLOCKED,正在等待某个对象的锁,可能是由于多个线程同时竞争同一个锁导致的阻塞。需要检查代码中是否存在多个线程同时竞争同一个锁的情况。
依赖项缺失:在堆栈信息中可以看到使用了 Dubbo、Pinpoint 等框架,可能是由于某些依赖项缺失导致的问题。需要检查代码的依赖项是否正确配置,并且是否存在版本冲突的情况。
网络或异步调用超时:可以看到某些线程状态为 WAITING 或者 TIMED_WAITING,可能是由于网络或异步调用超时导致的阻塞。需要检查代码中是否存在网络或异步调用超时的情况,并增加相应的超时处理逻辑。
回答1:这个一般是你们的业务异常。用arthas看一下线程都堵在哪儿了,看看是不是超时时间设置不合理、发生full gc、IO阻塞或者其他问题导致耗尽线程数,再根据业务场景进行调优 回答2:嗯...池子里的没处理完,新的请求来了处理不了,就blocked了 稳定复现吗?看代码defaultAppModel为null才出现这个问题,从代码看,像是某种不清楚的原因导致defaultAppModel为null,你可以尝试社区问下是否有相同案例。https://github.com/apache/dubbo/blob/891277912add64efde92121c6a5428332bb70657/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java ,此回答整理自钉群“EDAS SpringCloud & Dubbo交流二群”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。