2010-05-28 36 views
0

我有一個數百萬個URL/IP的文件,並且必須編寫一個程序來真正快速地下載頁面。連接速率應至少爲6000/s,文件下載速度至少爲2000,平均值爲。 15kb文件大小。網絡帶寬爲1 Gbps。設計最快的頁面下載

到目前爲止,我的做法是:創建600個套接字線程,每個線程有60個套接字並使用WSAEventSelect等待數據讀取。一旦文件下載完成,將(下載的文件的)內存地址添加到流水線(簡單向量)並激發另一個請求。當所有套接字線程中的總下載量超過50Mb時,寫入下載到磁盤的所有文件並釋放內存。 到目前爲止,這種方法並不是非常成功,我可以在不超過2900個連接/秒的情況下進行拍攝,並且下載數據速率更低。

有人可以提出一種替代方法,可以給我更好的統計數據。另外我正在使用8G內存的windows server 2008機器。另外,我們是否需要破解內核,以便我們可以使用更多的線程和內存。目前我可以創建一個最大值。 1500線程和內存使用不超過2個演出[技術上應該更多,因爲這是一個64位機器]。 而IOCP是沒有問題的,因爲我目前還沒有這方面的經驗,現在必須修復這個應用程序。

謝謝!

+0

如果您需要解決2 GB以上的問題,請將其編譯爲64位(但您的代碼可能尚未準備就緒),或者將32位應用程序與/ LARGEADDRESSAWARE關聯(這會給您4GB的空間64位系統上的32位應用程序) – Patrick 2010-05-28 14:26:22

回答

1

首先,你需要弄清楚什麼是限制你的應用程序。你是CPU綁定,IO綁定,內存綁定,網絡綁定,...?你的線程之間是否存在鎖定爭用?等等...

它不可能從你的描述說。您將需要在探查器中運行您的應用程序,以瞭解瓶頸所在。

0

我沒有看到任何使用額外套接字的性能增益。對於單個CPU處理器,它必須在不同的套接字之間「共享」代碼執行,從而劃分性能。線程太多也是如此。

對於嚴重的性能處理,您將需要額外的硬件支持。您需要將傳入(串行)數據轉換爲多個數據緩衝區(並行)。這不一定會提升你的表現。但是,如果您可以爲每個物理連接下載一個頁面,這可能會提高您的性能。

大部分瓶頸(恕我直言),正在接收數據包和分析他們的目的地。這些分析師越多,你的表現越快;儘管當一個或多個導演想要使用相同的內存區域時(兩位導演正在下載相同的頁面),您可能會遇到性能問題。

如果您可以通過CPU不間斷地下載整個頁面的硬件支持,那將是您看到的最快的性能。

「這只是我的看法,我可能是錯的。」 - Dennis Miller