2011-03-18 60 views
3

我正在爲在JBoss上運行的文檔協作開發網站/在線服務。在使用2.5Ghz cpu和2GB RAM的Linux計算機上進行測試期間,頁面響應非常快,我們正在考慮使用此計算機啓動。在Java J2EE服務器上平衡CPU /內存資源的線程使用情況

問題出現在文檔處理過程中。在用戶上傳文檔後,會啓動一個新線程以轉換文檔,從文檔中提取文本和圖像,並通過另一臺服務器上的https上載文檔。用戶可以一次上傳多個文檔,並且處理它們的線程可以同時工作。在此處理完成之前,網站變得幾乎沒有響應。

你可以給我一些建議,告訴我如何以某種方式在處理文檔的線程上分配一定比例的CPU /內存(例如最大40%)?如果這是不可能的,請告訴我一個方法/模式,它會以某種方式共享JBoss響應頁面請求和處理文檔的線程之間的負載。

問候

回答

3

有沒有真正的方式來分配的CPU /內存時間的一定比例用於給定線程。你可以降低線程的優先級,因此不會飽和的所有資源:

int oldPriority = Thread.currentThread().getPriority(); 
Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 
// process your documents here 
Thread.currentThread().setPriority(oldPriority); 

一個更好的辦法,將可能讓你更接近指定百分比將使用一個ExecutorService具有固定數量的線程和運行所有通過它處理文檔處理。如果您將服務器中的處理器數量減半,那麼它將有效地將文檔處理限制爲服務器CPU時間的50%。你想要一個單獨的服務,建立一個線程池這樣的:

int threads = Runtime.getRuntime().availableProcessors()/2; 
ExecutorService service = Executors.newFixedThreadPool(threads); 

然後在你的Web請求,你可以通過一個Callable實現文檔處理服務和塊,直到它完成:

Callable<Result> callable = new DocumentProcessorCallable<Object>(doc); 
Result result = service.submit(callable).get(); 

或者你可能更願意不阻止,並通過提供你傳遞給service.execute(runnable)Runnable實現立即返回。有關更多示例和文檔,請參見ExecutorService

+1

+1與執行者解決方案一致,並提出警告。一旦開始使用執行程序服務進行資源管理,您就已經本地化了一個問題,這實際上是一個系統範圍的策略。爲了使這個可管理,你需要有一個策略,把你的執行者(和任何其他線程產生)放在一個地方來跟蹤它們。如果您在系統中的其他位置隨機添加/刪除線程,則會隱式更改全局資源分配決策。另一種方法可能是將JVM固定到單個/一個處理器子集。 – andersoj 2011-03-19 00:11:16

+0

@andersoj:好點。 – WhiteFang34 2011-03-19 01:14:47

2

在用戶提交了文檔之後,您可以將它們全部提交到只有單個MDB實例正在監聽的JMS隊列中。因此,文檔處理將是串行的,因此只能使用一個線程(仍然可以使用大量的CPU)。

如果此解決方案不夠,可以將遠程MDB放在不同的服務器上以處理文檔,並基本上卸載文檔處理。這裏的美妙之處在於,這種改變基本上只是配置改變,並不需要重新編譯你的應用。

+0

感謝您的推薦。這是未來一段時間的一個很好的選擇,但現在我們想從一臺服務器開始。 – Alex 2011-03-20 15:23:57

+1

這也只適用於一臺服務器:-) – 2011-03-20 17:12:49

相關問題