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

时间:2013-07-05 13:23:46

标签: java multithreading spring tomcat

我正在使用托管在Tomcat 7上的Spring 3开发一个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。

5 个答案:

答案 0 :(得分:7)

即使您没有显式执行任何多线程,您的应用程序服务器也会隐式地将每个请求分派给它自己的线程,因此您已经在CPU上同时加载了。

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

如果通过处理大量内存数据来处理每个请求,如果每秒请求数量较少,那么它可以获得回报在几个线程之间仔细划分工作,不超过实际的CPU核心数。

因此,由于您的服务器负载很重,因此通过将工作分派给多个线程几乎肯定无法提高其性能。请注意,通过多线程破坏性能非常容易。

答案 1 :(得分:5)

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

在应用程序服务器或Web容器内部进行多线程并不总是明智的。

应用程序服务器或Web容器已对请求进行多线程处理。

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

答案 2 :(得分:3)

  

它会改善表现吗?

也许。你每秒有2.5k的请求。如果每个请求花费1秒的CPU时间并且你有一个CPU那么它就不会。如果你有2个CPU,那么是。如果每个请求都与远程池化网络资源进行了对话,则为是。如果每个请求都与同一网络资源(即未汇集)进行通信,则为no。

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

答案 3 :(得分:2)

简短回答:是的。

每次请求进入时,如果您只使用1个线程来执行此方法,则意味着下一个请求必须等到处理前一个请求。

如果每次请求进入时都创建一个新线程,只要系统上有可用资源,您就会处理所有请求。无论如何,你的线程在完成后都会被清理干净。

答案 4 :(得分:1)

简短的答案是:你必须自己测量它。

更长的答案是:如果您将工作分配到后台的单个线程,并且HTTP请求处理器等待该后台线程的完成(它还会做什么?)您只需要增加了应用程序的开销

  • 衡量是否有影响
  • 如果您有积极的影响:检查您衡量的影响,并确定增加的复杂性是否值得交易可维护性与性能

或者,更一般地说:

  • 编写具有优化可维护性的代码
  • 对应用程序进行压力测试直至其中断
  • 如果它比您预期的更早破裂:
    • 识别瓶颈(内存,cpu,i / o,其他)
    • 修复已发现的问题#1
    • 继续第2步
  • 祝贺。您的应用程序提供您期望的负载代码处于最佳可维护状态,以满足其性能要求