背景信息維護具有大量線程的Java應用程序時,我需要知道什麼?
我有一個分佈式處理應用程序,可以進行數據分析。它旨在對多組實時更新的數據進行並行處理。作爲設計的一部分,分析已經分解成分析節點。每個節點獲取源數據並對其進行處理以創建其他數據,然後可以由其他節點使用這些數據。爲了對一個數據集進行當前的全套分析,需要大約200個節點。
在當前的設計中,每個節點都使用自己的線程運行。現在,大多數時候這些線程都睡着了。無論什麼時候更新數據,它們都會像瀑布一樣依次喚醒,然後再回到睡眠狀態。該應用程序目前正在生產運行40組數據,每個數據需要200個節點,使用8000個線程。當沒有數據進入時,服務器上沒有負載。當數據在最繁忙時間進入時,服務器峯值約爲CPU的25%。這完全在項目的設計和生產參數範圍內。
現在爲了下一步,我們將40組數據縮放到200.每組需要200個節點,這意味着總共40000個節點,即40000個線程。這超過了我們服務器的最大PID,所以我要求我們的服務器管理員增加上限。他們這樣做了,應用程序可以工作,但是他們給了我一些關於線程數量的推斷。我並不否認線程的數量是不尋常的,但在我們設計的這個階段,這是預期和保證的。
我正在計劃一些小設計來將線程從節點分開。這將允許我們配置一個線程來運行多個節點,並減少線程數量。對於不經常更新的數據集,只有一個線程在每個節點中執行數據更新的性能影響非常小。對於每秒更新數百次的數據集,我們可以將每個節點配置爲在其自己的線程上運行。事實上,我不懷疑這種設計變更將會發生 - 這只是時間問題。同時,我希望儘可能多地瞭解使用此設計的後果。
問題
什麼是與一臺計算機上超過40,000線程中運行的成本呢?讓JVM/Linux操作系統管理這麼多線程會損失多少性能?請記住,在沒有工作的情況下,它們都已正確配置爲可以睡眠。所以,我只是在討論由於線程數量太多而導致的額外開銷和問題。
請注意 - 我知道我可以減少線程的數量,並且我知道這是改變設計的好主意。我會盡快做到,但必須兼顧其他工作和設計考慮。我正在問這個問題來收集信息,以便作出一個好的決定。你對這種性質的想法和評論非常感謝。
+1,以表示線程過多和使用執行程序服務的好處。 – 2011-04-19 15:42:53
釘牢它。謝謝您的幫助。這不應該是一個難題。現在我明白他們爲什麼說擴展'Thread'是不好的。沒有什麼東西像經驗教訓一樣。 – 2011-04-19 22:38:26