使用调度程序时,Tomcat和RxJava之间存在线程问题

时间:2015-01-20 10:09:12

标签: multithreading threadpool spring-boot rx-java tomcat8

我有一个Web应用程序,它只是作为Front Controller使用Spring Boot来调用其他远程REST服务,我将Spring的DeferredResult与在Scheduler.computation()上订阅的Observables结合起来。

我们也在使用JMeter来强调Web应用程序,我们注意到当JMeter中调度的并发线程数从25增加时,请求开始失败,状态为500,没有响应数据,也没有任何日志显然是一个非常可管理的#34; Tomcat的编号。

使用VisualVM分析如何创建和使用线程的问题,我们意识到使用rx.Schedulers会以某种方式影响Tomcat NIO创建的线程数。让我总结一下我们基于所使用的rx.Scheduler和在JMeter中测试的测试,包含100个用户(线程):

  1. SCHEDULERS.COMPUTATION()
  2. 由于我们正在使用Schedulers.computation()并且我的本地计算机有4个可用处理器,因此4个EventLoop线程池由RxJava(名为RxComputationThreadPool-XXX)和仅10个Tomcat(名为http-nio)创建-8080-exec-XXX),根据VisualVM:

    http://screencast.com/t/7C9La6K4Kt6

    1. SCHEDULERS.IO()/ SCHEDULERS.NEWTHREAD()
    2. 此调度程序似乎基本上充当Scheduler.newThread(),因此在需要时始终会创建新线程。同样,我们可以看到很多线程由RxJava创建(名为RxNewThreadScheduler-XXX),但只有10个用于Tomcat(名为http-nio-8080-exec-XXX),根据VisualVM:

      http://screencast.com/t/K7VWhkxci09o

      1. SCHEDULERS.IMMEDIATE()/ NO SCHEDULER
      2. 如果我们在RxJava中禁用创建新线程,可以通过设置Schedulers.immediate()或从Observable中删除它,然后我们会看到Tomcat线程的预期行为,即100 http-nio- 8080-exec对应于为JMeter测试定义的用户数:

        http://screencast.com/t/n9TLVZGJ

        因此,基于我们的测试,我们清楚地看到RxJava与Scheduler和Tomcat 8的组合在某种程度上限制了Tomcat创建的线程数...而且我们不知道为什么或如何正在发生。

        任何帮助都会受到赞赏,因为这阻碍了我们迄今为止的发展。

        提前致谢。

0 个答案:

没有答案
相关问题