[英]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請求處理器等待該后台線程的完成(它還會做什么?)您剛剛為應用程序增加了開銷
請
或者,更一般地說:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.