Java 在tomcat中使用ThreadPool excutor服务加速请求

Java 在tomcat中使用ThreadPool excutor服务加速请求,java,multithreading,tomcat,service,executor,Java,Multithreading,Tomcat,Service,Executor,我有一个tomcat6 servlet应用程序。我的一个请求(平均约10秒)可以通过使用多线程得到显著改进,因为它是一个仅限CPU的任务,并且我有>=8个内核。我只是想知道这样做是明智的,还是仅仅是一种表面上的改变: 对于单用户情况,这当然是一个改进。但是如果负载增加会发生什么呢?我的CPU能力有限,目前在几个HTTP连接器线程之间共享。假设我已经对它们进行了优化配置,我将不得不从http连接器线程池中获取一些线程,并将其放入某个执行器服务器中,以加速这个单一(但很重要)操作 我的假设是,随着负

我有一个tomcat6 servlet应用程序。我的一个请求(平均约10秒)可以通过使用多线程得到显著改进,因为它是一个仅限CPU的任务,并且我有>=8个内核。我只是想知道这样做是明智的,还是仅仅是一种表面上的改变:

对于单用户情况,这当然是一个改进。但是如果负载增加会发生什么呢?我的CPU能力有限,目前在几个HTTP连接器线程之间共享。假设我已经对它们进行了优化配置,我将不得不从http连接器线程池中获取一些线程,并将其放入某个执行器服务器中,以加速这个单一(但很重要)操作

我的假设是,随着负载的增加,如果使用额外的线程执行器服务,我的系统将执行得更差


你看到我的问题了吗?有人有一些最佳实践的想法吗?还是我忽略了什么?

在性能问题上,除了少数例外,最好的答案通常是制定一个基准测试,然后试一试

请记住,有些任务无法并行化。也就是说,尝试这样做要么需要同步,这样就不会获得任何好处,要么根本不可能,因为每个步骤都需要完成前一个步骤。如果您的任务不能并行化,那么将没有任何好处


基于同样的原因,并非所有应用程序的活动都必须并行运行。在某种程度上,应用程序的某些部分将相互阻止文件系统或网络的I/O,甚至可能在数据库中等待请求。所有这些都意味着,仅仅因为您的硬件可能只有8个核心(例如),并不意味着您应该严格限制自己为8或9个线程。当然,你也不想发疯而拥有数百个线程。

据我所知,你想创建一些额外的线程,如果你有一个并发请求,并且你将你的工作(大约需要10秒)拆分为几个较小的工作单元,这些工作单元可以并行化并在以后加入,那么这些线程将受益匪浅

您担心这实际上会降低性能,例如,如果您有100个并发请求,因为您没有备用内核来并行这100个作业中的每一个

理论上,当活动线程的数量等于物理内核的数量时,开销最小。所以你需要问自己一个问题——你最常见的情况是什么(系统有多少用户?),如果用户数量达到峰值,你准备支付什么价格


无论如何,我完全同意蒂姆的观点,你应该做基准测试,从理论上判断这一点几乎是不可能的。例如,如果您的10秒任务是100%CPU限制的,而不是80%CPU限制的,那么您的结果可能会完全不同

为什么您认为多线程可以提高性能?你追求的是CPU或I/O并行化?如果负载增加,你的CPU周期就用完了…@skaffman 10秒的计算时间仅限于CPU。我有多个核。这就是为什么我认为在单用户情况下性能会增加。你有疑问吗@Thorjorn是的。。。如果有更多用户访问servlet,就会发生这种情况。问题不在于负载是否增加,而在于executor配置是否比单线程环境更糟糕。你认为呢?只有当你有更多的cpu可用并且问题可以并行化时,你才能从执行器中受益。如果不是,你需要重新考虑你的解决方案。也许我的问题不够清楚。多线程将有所帮助。但是,如果负载增加,它对我有帮助吗?或者它的性能比没有多线程时更差吗?