執行緒池大小設定策略
阿新 • • 發佈:2022-02-07
決策變數
- 有多少個CPU
- 有多大記憶體
- CPU 密集型,還是 I/O 密集型
- 檔案控制代碼數
- 套接字控制代碼數
- 任務是否需要像 JDBC 連線這樣的稀缺資源
執行緒池大小過大、過小存在的問題
如果過大,大量的執行緒競爭相對很少的 CPU 和記憶體資源,導致更高的記憶體使用量,而且還可能耗盡資源。
如果過小,存在空閒的處理器無任務可執行,降低了吞吐量。
計算方法
依據稀缺資源的資源池大小
執行緒池大小上限 = 資源總可用數量 / 每個任務對資源的需求量
依據計算、等待時長
執行緒池大小上限 = CPU核心數 * CPU期望利用率 * (任務執行總時長 / 任務CPU計算時長)
如何估算計算、等待時長
- 通過一些分析或臨近工具來獲得
- 在某個基準負載下,分別設定不同大小的執行緒池來執行應用程式,並觀察CPU利用率
其它事項
- 不同型別的任務,應使用多個執行緒池
- 執行緒池大小可能反過來限制連線池大小,如執行緒池中任務是資料庫連線池的唯一使用者時,小的執行緒池不需要大的連線池
參考書籍:《Java併發程式設計實戰》