簡體   English   中英

如果同時有多個請求,多線程是否會提高性能?

[英]Does multi-threading improve performance if there are many requests at the same time?

我正在使用托管在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。

即使您沒有顯式執行任何多線程,您的應用程序服務器也會隱式地將每個請求分派給它自己的線程,因此您已經在CPU上進行了並發加載。

如果您的請求處理受CPU限制,並發代碼將僅對您有所幫助,這種情況很少發生。 通常,瓶頸是數據庫,或者更一般地說,是與其他后端子系統的接口。

如果通過處理大量內存數據來處理每個請求, 並且如果每秒請求負載較低, 可以在幾個線程之間小心划分工作,而不是超過實際的CPU核心數。

因此,由於您的服務器負載很重,幾乎肯定不可能通過將工作分派給多個線程來提高其性能。 請注意,通過多線程破壞性能非常容易。

請注意,Tomcat已經在進行多線程處理。

在應用程序服務器或Web容器內自行執行多線程並不總是明智的。

應用程序服務器或Web容器已在請求上執行多線程處理。

請閱讀Tomcat的文檔和/或源代碼。

它會改善性能嗎?

也許。 你每秒有2.5k的請求。 如果每個請求花費1秒的CPU時間並且你有一個CPU那么它就不會。 如果你有2個CPU,那么是。 如果每個請求都與遠程池化網絡資源進行了對話,則為是。 如果每個請求都與同一網絡資源(即未匯集)進行通信,則不會。

簡而言之,您需要提供有關您正在做的事情的更多信息,並且(最有用的)使用您的特定環境自行執行測試。

簡短回答:是的。

每次請求進入時,如果您只使用1個線程來執行此方法,則意味着行中的下一個請求必須等到處理前一個請求。

如果每次請求進入時都創建一個新線程,則只要系統上有可用資源,您就會處理所有請求。 無論如何,你的線程在完成后都會被清理干凈。

簡短的回答是:你必須自己測量它。

更長的答案是:如果您將工作分配給后台的單個線程,並且HTTP請求處理器等待該后台線程的完成(它還會做什么?)您剛剛為應用程序增加了開銷

  • 衡量它是否有影響
  • 如果您有積極的影響:檢查您衡量的影響,並確定增加的復雜性是否值得交易可維護性與性能

或者,更一般地說:

  • 編寫具有優化可維護性的代碼
  • 對應用程序進行壓力測試直至其中斷
  • 如果它比你預期的更早破裂:
    • 識別瓶頸(內存,cpu,i / o,其他)
    • 修復你發現的問題#1
    • 繼續第2步
  • 恭喜。 您的應用程序提供您期望的負載, 並且代碼處於可以滿足其性能要求的最佳可維護狀態

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM