我的作業是使用Apache Tomcat運行的Java Web應用程式。Tomcat 執行緒池的最大執行緒數為 800,最小備用執行緒數為 25。當它運行時,它通常在給定的時間內停留在 400 個運行執行緒左右。
假設我有一個計算成本很高的非阻塞任務,我必須在我的 Tomcat 應用程式中完成,其中 ForkJoinPool.commonPool 被用來更有效地解決該任務。
由于我的 Apache Tomcat 應用程式中已經有一個大型執行緒池,Tomcat 執行緒池是否會減少我在 Tomcat 應用程式中使用 ForkJoinPool(或任何執行緒池)所獲得的性能提升?在 ForkJoinPool 中運行 Tomcat 執行緒池的性能成本是否會抵消使用 ForkJoinPool 的性能收益,因為現在執行緒的數量將遠遠超過 CPU 的數量?
在Apache Tomcat應用中添加任何額外的執行緒池對整個應用的性能都是不利的嗎?
uj5u.com熱心網友回復:
這個問題很難給出一個籠統的答案,因為這在很大程度上取決于具體的作業負載。對你自己的應用程式進行測驗和分析是無可替代的。然而,這里有一些需要考慮的事情。
在獨立的執行緒池中運行受 CPU 限制的任務并不能保證為您帶來任何性能優勢。有兩個主要的原因,它可能是有益的:
- 當一個執行緒將一個任務提交給執行器,讓它在一個單獨的執行緒上運行時,它就可以繼續并發地做其他作業。
- 如果任務可以被分解成多個子任務,每個子任務都在不同的執行緒上運行,那么您可以利用多個 CPU 內核的并行處理來更快地完成任務。
擁有更多執行緒的成本是:
Tomcat請求執行緒池大小的默認值是基于以下常見情況:執行緒在I/O上花費大量時間進行阻塞:通過網路讀取請求,進行資料庫查詢和更新,并將回應寫回給客戶端。這意味著這些執行緒無法利用所有可用的 CPU 時間,擁有比 CPU 內核多得多的執行緒是有益的,這樣被阻塞的執行緒就可以被需要 CPU 時間的執行緒所搶占。
因此,一個大問題是什么在呼叫這些任務:它是一個請求執行緒嗎?如果是的話,在任務進行中,該請求執行緒會做什么?它是否在進行阻塞式 I/O 呼叫?它是否只是在等待任務的完成?
如果您的大多數請求都在呼叫這些 CPU 密集型任務中的一個,然后阻塞地等待其完成,并且如果這些任務沒有被拆分以在多個內核上并行運行,那么您可能無法從在獨立執行緒池中運行任務中獲得任何好處。避免背景關系切換的開銷,在請求執行緒上運行這些任務可能會更好。如果你的服務處理的大多數請求都運行這種型別的任務,那么你可能想減少Tomcat執行緒池中的請求執行緒數量,因為你的實際并發性將受到可用CPU時間的限制。你可能最終會有大量的等待執行緒和高回應延遲。然后,這些請求可能會在客戶端超時,在最終失敗的請求上浪費了大量的服務器資源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/319422.html
標籤:
上一篇:如何用影片生成一個影片曲線?
