2011-05-19 61 views
5

我正在做一個web爬行器,並使用線程來下載頁面。有沒有辦法確定理想的線程數量?

我的程序性能的第一個限制因素是帶寬,我永遠無法下載更多的頁面。

第二件事是我感興趣的。我正在使用線程同時下載許多頁面,但隨着我創建更多線程,更多的處理器共享發生。是否有一些度量/方法/類的測試來確定什麼是理想的線程數量,或者如果在某個數字之後,性能不會改變或降低?

+2

如果您的應用程序受CPU限制,則該數字非常接近您機器上的CPU數量。但是,I/O綁定程序(如網絡爬蟲)最終會阻止I/O,所以您可能會擁有更多。因此,我必須同意@ pst的評論:運行測試,然後找出適合您環境的理想數字。在代碼中檢測這個並不是一個好方法。 (但是,一旦您知道如何檢查「當前平均」帶寬,您就可以編寫自調整代碼。) – 2011-05-19 22:20:05

回答

0

我們開發了一個多線程平行網絡爬蟲。基準測試結果是瞭解野獸如何處理他的工作的最佳方式。對於一個專用的java服務器,每個內核有一個線程是啓動的基礎,然後I/O進入併發生變化。

在一定數量的線程之後,性能會下降。但它取決於你抓取的網站,你使用的操作系統等。嘗試找到一個只有不斷響應時間的網站來做你的第一個基準(如谷歌,但採取不同的服務)

隨着慢速網站,更多的線程傾向於補償I/O阻塞

+0

在完成整個程序並運行測試後,我將準備一個腳本。 – 2011-05-24 14:52:19

-2

我說使用類似Akka的東西管理你的線程。如果我沒有記錯的話,請使用帶有非阻塞IO的Jersey http客戶端庫,並使用回調。這可能是這類任務的理想設置。

0

在這個線程看看我的回答

How to find out the optimal amount of threads?

你的例子可能會被CPU綁定,所以你需要一種方法來制定出爭才能夠制定出正確的號碼線上您的箱子使用,並能夠保持他們都忙。性能分析將幫助那裏,但記住它取決於內核數量(以及已經提到的網絡延遲等),所以使用運行時獲得線程池大小的內核數量。

沒有快速回答恐怕會出現測試,測量,調整,重複的元素恐怕!

0

理想的線程數應該接近硬件提供的核心數量(虛擬核心數量)。這是爲了避免線程上下文切換和線程調度。如果你正在做大量的IO操作,並且有很多阻塞讀取(你的線程塊在套接字上讀取),我建議你重新設計你的代碼來使用非阻塞IO API。通常,這將涉及一個「選擇器」線程,該線程將監視數千個套接字的活動以及將執行處理的少量工作線程。如果你的代碼是Java,那麼API是NIO。當您撥打selector.select()時,唯一阻止呼叫將會是,並且只有在數千個套接字中沒有任何內容需要處理時纔會阻止。像netty.io這樣的事件驅動框架使用這種模式,並且已被證明是非常具有伸縮性的,並能最好地利用系統的硬件資源。

相關問題