2010-10-29 21 views
0

我正在計劃製作一個有很多對等網絡連接的軟件。通常我會爲每個連接創建一個自己的線程來發送和接收數據,但在這種情況下,使用300-500以上的連接將意味着不斷創建和銷燬很多線程,這將是一個很大的開銷,我猜。然後讓一個線程順序處理所有的連接可能會減慢一些事情的速度。 (我對此並不確定)如何找出最佳的線程數量?

問題是:有多少線程可以優化來處理這類問題?是否有可能在軟件中計算它,以便它可以決定自己在舊計算機上創建更少的線程,而不是使用更多的資源,更多的使用新線程?

這是一個理論問題,我不想讓它的實現或語言相關。然而,我認爲很多人會建議像「只使用ThreadPool,它會處理這樣的東西」,所以我們說它不會是一個.NET應用程序。 (我可能必須使用代碼的其他一些地方在老德爾福的項目,這樣的語言很可能是德爾福或許C++,但它尚未決定。)

+2

請參閱http://stackoverflow.com/questions/481970/how-many-threads-is-too-many/481979#481979 – paxdiablo 2010-10-29 06:29:06

+0

什麼是您的操作系統?視窗? – 2010-10-29 14:13:58

+0

是的,它是Windows。 – ytg 2010-10-29 16:18:02

回答

2

如果這是Windows(您提到了.Net?),那麼您應該使用I/O completion ports來明確實現這一點。這是做Windows套接字I/O最有效的方法。在該文檔鏈接處有關於線程池大小的I/O特定討論。

的I/O 完成端口的慎重考慮 最重要的屬性是併發值。通過 NumberOfConcurrentThreads參數創建的 CreateIoCompletionPort創建完成端口 的 併發值。 該值限制與 完成端口關聯的 可運行線程的數量。當總數量與 相關聯的可運行線程的 完成端口到達 併發值,則系統塊 與 完成端口相關聯的任何後續 線程的執行,直到 可運行的線程的數目下降到低於 併發值。

基本上,您的讀寫操作都是異步的,並且由可修改大小的線程池提供服務。但首先使用默認值進行嘗試。

如何做到這一點的一個不錯的例子是the Free Framework。有一些陷入工作代碼的問題可能會幫助你短路。

0
  1. 使線程的數量配置。
  2. 針對您期望支持的最常見的幾種特定配置。
  3. 獲得一個好的性能分析器/儀器的代碼,然後嚴格測試不同的值爲1.對於所有不同的類型2.直到你找到一個適用於每個配置的最佳值。

我知道,這似乎是一個不那麼聰明的方式來做事,但我認爲,當涉及到性能,基準通過測試的結果是唯一可靠的方式來真正懂得好/不好它會工作。

編輯:對該鏈接由paxDiablo發佈以上評論的問題+1。它的問題和信息幾乎相同,其中包括paxDiablo本人的非常詳細的答覆。

0

你可以做基於CPU速度,核心和內存空間,在計算你的安裝和設置固定的地方,告訴你的應用程序有多少線程使用。想起信號量和線程池。

就我個人而言,我會將偵聽套接字與發送套接字分開,並在運行時打開發送套接字,而不是將它們作爲守護進程運行;偵聽套接字可以作爲守護進程運行。

多線程可以是自己的頭痛,並引入許多錯誤。要做的最好的事情是讓線程做一件事,並在處理時阻止,以避免不希望的和不可預知的結果。

0

每個CPU有一個線程處理多個(數百個)連接。

9

瞭解負載下應用程序的性能是關鍵,正如前面提到的分析,測量和重新測試是要走的路。

作爲一般的指導關於具有

線程= CPU數Goetz會談+ 1

爲CPU結合應用,和

數量的CPU *(1 +等待時間/服務時間)

對於IO綁定上下文