Multithreading 使用调度程序时Tomcat和RxJava之间的线程问题

Multithreading 使用调度程序时Tomcat和RxJava之间的线程问题,multithreading,threadpool,spring-boot,rx-java,tomcat8,Multithreading,Threadpool,Spring Boot,Rx Java,Tomcat8,我有一个web应用程序,它只是充当一个前端控制器,使用Spring Boot调用其他远程REST服务,在这里我将Spring的延迟结果与Scheduler.computation()上订阅的观测值相结合 我们还使用JMeter来强调web应用程序,我们注意到当JMeter中调度的并发线程数量从25个增加到25个时,请求开始失败,状态为500,没有响应数据,任何地方都没有日志,这对于Tomcat来说显然是一个非常“可管理”的数字 深入研究使用VisualVM分析如何创建和使用线程的问题,我们意识到

我有一个web应用程序,它只是充当一个前端控制器,使用Spring Boot调用其他远程REST服务,在这里我将Spring的延迟结果与Scheduler.computation()上订阅的观测值相结合

我们还使用JMeter来强调web应用程序,我们注意到当JMeter中调度的并发线程数量从25个增加到25个时,请求开始失败,状态为500,没有响应数据,任何地方都没有日志,这对于Tomcat来说显然是一个非常“可管理”的数字

深入研究使用VisualVM分析如何创建和使用线程的问题,我们意识到使用rx.scheduler在某种程度上影响了Tomcat NIO创建的线程数量。让我总结一下我们基于使用的rx.Scheduler的测试,以及在JMeter中使用100个用户(线程)的测试:

  • SCHEDULERS.COMPUTATION()
  • 由于我们使用的是Schedulers.computation(),并且我的本地机器有4个可用的处理器,因此RxJava(名为RxComputationThreadPool XXX)创建了4个EventLoop线程池,而Tomcat(名为http-nio-8080-exec-XXX)只创建了10个,如VisualVM所示:

  • SCHEDULERS.IO()/SCHEDULERS.NEWTHREAD()
  • 此调度程序基本上充当调度程序.newThread(),因此在需要时总是创建一个新线程。同样,我们可以看到许多由RxJava(名为RxNewThreadScheduler XXX)创建的线程,但对于Tomcat(名为http-nio-8080-exec-XXX)只有10个,如VisualVM所示:

  • SCHEDULERS.IMMEDIATE()/无计划程序
  • 如果我们通过设置Schedulers.immediate()或将其从Observable中删除来禁用RxJava中新线程的创建,那么我们可以看到Tomcat线程的预期行为,即对应于为JMeter测试定义的用户数的100 http-nio-8080-exec:

    因此,根据我们的测试,我们很清楚,RxJava与调度器和Tomcat 8的结合在某种程度上限制了Tomcat创建的线程数量。。。我们不知道这是为什么或如何发生的

    任何帮助都将不胜感激,因为到目前为止,这阻碍了我们的发展


    提前感谢。

    您能调试应用程序并在任何异常上设置断点吗?对于immediate()情况,您的代码可能会减慢/挂起Tomcat的工作线程,这就是为什么您会看到这么多的工作线程。@akarnokd,实际上在immediate()情况下,我确实看到了Tomcat预期的线程数,即100。这是奇数。也许Tomcat会检查有多少其他线程正在运行,并将自身限制为总共10个线程。不过,我从没听说过Tomcat有这样的行为。