Java 如果同时有多个请求,多线程是否会提高性能?

Java 如果同时有多个请求,多线程是否会提高性能?,java,multithreading,spring,tomcat,Java,Multithreading,Spring,Tomcat,我正在使用托管在Tomcat7上的Spring3开发一个Java web应用程序,它需要每秒处理2.5k以上的请求。我有一个RequestProcesseor类,使用此方法处理每个HTTP请求: @Service public class RequestProcesseor { public void processSomething(int value1, int value2) { // process something... // create

我正在使用托管在Tomcat7上的Spring3开发一个Java web应用程序,它需要每秒处理2.5k以上的请求。我有一个
RequestProcesseor
类,使用此方法处理每个HTTP请求:

@Service
public class RequestProcesseor {

    public void processSomething(int value1, int value2) {
        // process something...
        // create and deep copy some object
        // some BigDecimal calculations
        // maybe some webservice calls
    }

}
同时有超过2.5k个请求,将调用
processSomething
方法。如果我让这个类是多线程的。它会提高性能吗?若有,原因为何?我怎样才能证明呢


服务器有一个4核CPU。

简短回答:是。

每次传入请求时,如果您仅使用1个线程来执行此方法,则意味着行中的下一个请求将不得不等待,直到前一个请求得到处理

如果每次请求传入时都创建一个新线程,那么只要系统上有可用的资源,就可以处理所有请求。你的线程将被清理后,他们完成无论如何

它会提高性能吗

也许吧。您每秒有2.5k请求。如果每个请求占用1s的CPU时间,而您只有一个CPU,那么它就不会。如果您有2个CPU,那么是的。如果每个请求都与远程池化网络资源通信,则为“是”。如果每个请求都与同一网络资源通信(即未共用),则不会


简言之,您需要提供更多关于您正在做什么的信息,并且(最有用的)使用您的特定环境自己执行测试。

即使您没有显式地执行任何多线程处理,您的应用程序服务器也会隐式地将每个请求分派到它自己的线程,因此CPU上已经有并发负载

并发代码只有在请求处理受到CPU限制时才会对您有所帮助,这种情况很少发生。通常,瓶颈是数据库,或者更一般地说,是与其他后端子系统的接口

如果每个请求都是通过处理大量内存数据来处理的,如果每秒的请求负载较低,仔细地将工作分配到几个线程中,不超过实际的CPU核心计数,这是值得的


因此,由于您的服务器负载相当重,几乎肯定不可能通过将工作分配到多个线程来提高其性能。请注意,多线程很容易破坏性能。

请注意,Tomcat已经在进行多线程处理了

在应用服务器或web容器中自行执行多线程并不总是明智的

应用服务器或web容器已经在对请求执行多线程处理

请阅读Tomcat的文档和/或源代码。

简短的回答是:您必须自己测量它

一个较长的答案是:如果您将工作分派到后台的单个线程,而HTTP请求处理器等待该后台线程的完成(它还会做什么?),那么您的应用程序就增加了开销

  • 衡量它是否有影响
  • 如果您有积极的影响:检查您测量的影响,并确定增加的复杂性是否值得用可维护性和性能来权衡
或者,更一般地说:

  • 编写具有优化可维护性的代码
  • 对应用程序进行压力测试,直至其破裂
  • 如果其破裂时间早于您预期的破裂时间:
    • 确定瓶颈(内存、cpu、i/o等)
    • 修复已识别的问题#1
    • 继续执行步骤2
  • 祝贺你。您的应用程序服务于您期望的负载,并且代码处于最佳可维护状态,以满足其性能要求

Wow,一个使用spring的优秀足球运动员。使用servlet 3.0异步支持:我认为每秒2.5k请求可能需要集群:在2500个并发请求上,这是大量的线程创建和销毁开销。并且取决于单个请求处理比内核多得多的线程所需的时间。我建议为此使用线程池。@如果处理位很短,我同意这一点。但是他没有展示他的处理代码,所以我不知道:)问题是关于使这个类成为多线程的。请求处理已经是多线程的。web容器对请求进行多线程处理,但每个请求都可能从进一步的多线程处理中受益。@BrianAgnew说得对,但据我所知,他认为给定的类是单线程的,不需要正确。这取决于应用服务器。也许单个请求可以更快地处理,但我们只能假设。