2013-03-27 43 views
0

對於我們的項目,開發網絡壓力測試工具,我們是洪水包到整個子網。我們有一個Runnable類,它接收一個端口和廣播地址,並在一段時間(!Thread.currentThread()。isInterrupted)循環中發送一個特定的數據包。然後我們有一個主類,遍歷每個網絡接口和每個可能的端口,並將Runnable類添加到具有1000個線程固定池的ExecutorService。問題是,如果ExecutorService等待當前的1000個線程完成處理,他們永遠不會因爲它們處於while循環。但是,啓動每個線程(65536 *個接口)會佔用太多的內存。我們正在尋找一種在線程中循環的方式,這樣他們都有機會運行一段時間並節省內存,同時仍然保持較高的網絡輸出。如何通過多線程週期中的Java

+3

你是否正在邪惡? – pamphlet 2013-03-27 20:31:27

+0

我不認爲我會爲這項工作做出貢獻。 – Randy 2013-03-27 20:35:58

回答

0

我想你可能會從更多的線程總是給人更高的吞吐量的誤解是痛苦。通常情況並非如此。

您的應用程序很可能會是CPU綁定,或網卡的吞吐量的約束。強制OS兼顧線程對這些資源的競爭數以萬計是會增加你的吞吐量。大量的線程只有在線程花費大部分時間等待一些高容量的外部資源(例如數據庫)時纔有用。既然你只是爆炸包裝,並且(大概)對任何反應都不感興趣,那麼就沒有自然的等待點。

我會建議你有處理器和/或網絡卡(取小者),你只爲多線程。

+0

因此,它會同樣使用一個線程?我認爲更多的線程會更快,因爲當我創建了一個端口掃描程序,每個端口有一個超時時間時,多線程可以大大加快程序的速度。 – Samuel 2013-03-27 20:52:45

+0

這可能仍然是多線程的,特別是因爲單個線程的進展速度會更慢,阻塞等待來自網絡的回覆。單線程是一個很好的考慮因素(因爲線程經常被濫用),但是這裏仍然有一個有效的用例... – Krease 2013-03-27 20:57:12

+1

您使用TCP數據包還是單播?如果你正在等待ACK,多線程將提供一些好處。但僅限於一個極限。他們很快就會相互對抗。嘗試1,5,10,50等數字,找到最佳位置。 – pamphlet 2013-03-27 21:05:12

0

而不是使每個線程始終運行完成或「永遠」,使線程執行一個小的,定義明確的工作集,然後將它們重新添加到執行程序。這種高層次的管理可以通過一個'控制器'風格的對象來完成,該對象通過一系列新的步驟來執行向執行器隊列重新添加任務。

例如,如果每個任務都有1000步,以重複執行: - 任務1運行步驟1-100,然後通過加入本身回用於步驟101-200的執行程序隊列完成 - 任務2得到機會同樣執行(並完成) - 任務1現在位於隊列中,因此它執行101-200,然後返回到201-300的執行器隊列。 - 等到任務1到達結尾 - 901-1000 - 然後如果它想繼續執行,則返回到1-100。

就你而言,不同的步驟可能是端口,不同的線程代表不同的廣播地址 - 按照你認爲合適的方式分解它。