自定義線程池的建議大小是number_of_cores + 1(請參閱here和here)。因此,可以說有一個系統上的應用程序春季用2芯和配置是這樣的線程池的大小應該遠大於內核的數量+ 1
<task:executor id="taskExecutor"
pool-size="#{T(java.lang.Runtime).getRuntime().availableProcessors() + 1}" />
<task:annotation-driven executor="taskExecutor" />
在這種情況下會有多個請求之間共享一個ExecutorService的。所以如果有10個請求到達服務器, 其中只有3個可以在ExecutorService中同時執行。這可能會造成瓶頸,並且結果會隨着請求數量的增加而變差(請記住,默認情況下,tomcat可以處理多達200個併發請求= 200個線程)。該應用程序可以在沒有任何池的情況下執行得更好
通常一個核心可以同時處理多個線程。 例如我創建了一個服務,該服務調用兩次https://httpbin.org/delay/2。每次通話需要2秒鐘執行。所以如果沒有使用線程池,服務平均響應4.5秒(用20個同時請求測試)。 如果使用線程池,則響應會因池大小和硬件而異。我使用不同池大小的4核心機器運行測試。下面是用最小,最大和平均響應時間測試結果以毫秒爲單位
從結果來看,可以得出結論,最好的平均時間與最大池大小。池中有5個(4個核心+ 1)線程的平均時間比沒有池的結果更差。所以在我看來,如果一個請求沒有花費太多CPU時間,那麼將線程池限制爲web應用程序中的核心數+ 1是沒有意義的。
有沒有人發現任何錯誤的設置池大小爲20(或更多)在2或4核心機器上的Web服務是不是CPU要求?
在我看來既不是國家「暢通,CPU密集型任務」。在網絡應用程序(這是當今大多數應用程序)中,很少有代碼只是CPU綁定(DB調用,WS調用...),所以Amdahl法則可以在少數情況下應用。無論如何,謝謝你的清楚解釋 – lolotron