2011-06-07 65 views
7

我試圖模仿一個場景,其中有30萬消費者正在訪問服務器。所以我試圖通過從併發線程反覆查詢服務器來創建僞客戶端。我們可以在C#應用程序中創建300,000個線程並在PC上運行它嗎?

但是要清除的第一個障礙是,是否可以在PC上運行300,000個線程?下面是我使用的,看我intially多少最大線程數可以得到的,後來再與實際的函數替換測試功能代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace CheckThread 
{ 
    class Program 
    { 
     static int count; 

     public static void TestThread(int i) 
     { 
      while (true) 
      { 
       Console.Write("\rThread Executing : {0}", i); 
       Thread.Sleep(500); 
      } 
     } 

     static void Main(string[] args) 
     { 
      count = 0; 
      int limit = 0; 
      if (args.Length != 1) 
      { 
       Console.WriteLine("Usage CheckThread <number of threads>"); 
       return; 
      } 
      else 
      { 
       limit = Convert.ToInt32(args[0]); 
      } 
      Console.WriteLine(); 
      while (count < limit) 
      { 
       ThreadStart newThread = new ThreadStart(delegate { TestThread(count); }); 
       Thread mythread = new Thread(newThread); 
       mythread.Start(); 
       Console.WriteLine("Thread # {0}", count++); 
      } 

      while (true) 
      { 
       Thread.Sleep(30*1000); 
      } 
     } // end of main 
    } // end of CheckThread class 
} // end of namespace 

現在我想做可能是不現實的,但儘管如此,如果有辦法做到這一點,你知道,那麼請幫助我。

+2

貌似http://stackoverflow.com/questions/145312/maximum-number-of-threads-in-a-net-app – holtavolt 2011-06-07 14:18:01

+5

的副本如果 「跑」 你意味着線程之間的顛簸...... hehe – 2011-06-07 14:19:13

+0

我很抱歉,我沒有澄清目的太好。我的設置是服務器 - 客戶端設置。我想強調客戶端而不是服務器。在設置中,進程向客戶端進程發出請求,客戶端進程將依次將請求轉發給要服務的服務器。 但我明白了我們都在接受的觀點,即在一臺機器上創建這些多線程是不現實的,不推薦使用。 此外,我打算讓這些線程每1分鐘至少執行一次,從而給客戶端造成壓力的動機似乎是太想要了! :( – 2011-06-07 17:30:33

回答

6

每個線程將創建其自己的堆棧和本地存儲,你每線程32位OS看着大致堆棧空間的512K,我認爲64位操作系統上的堆棧空間增加了一倍。電子表格calc的快速返回爲我們的300k客戶端提供了146.484375個棧空間的演出。

所以,不,不要創建300k線程,而是使用線程池來模擬300k請求,雖然tbh我認爲如果有多個測試客戶端通過網絡接口發送垃圾郵件到您的服務器會更好。

有很多web負載測試工具可用。良好的起點:http://www.webperformance.com/library/reports/TestingAspDotNet/

4

您可以通過調用ThreadPool.SetMaxThreads方法來更改線程的最大數量。 300000個線程將可能使你的電腦爆炸*

*這可能是一種誇張

+0

這與問題無關,因爲他沒有使用ThreadPool。 – Sven 2011-06-07 14:30:30

+1

可能是一種誇張,但他需要類似於300內存的內存來保持內存中的許多線程 – 2011-06-07 14:30:37

1

由於.net提交整個堆棧(1MB)爲每個clr線程;正如本說的那樣,你的電腦實際上可能會爆炸。或者可能是OoM。

3

語言無關的答案:

更好的方式可能去這是使用反應堆模式,最多每核心1個或2個併發線程。

+0

如果您打算使用反應堆模式這可能是有幫助的:http://www.robertsindall.co.uk/blog/the-reactor-pattern-using-c-sharp/ – Robs 2011-06-12 17:44:12

0

那麼,當您嘗試創建300K個線程時,測試的結果是什麼?我不會嘗試我的!

無論如何,您無法一次連接300K客戶端,因爲單個服務器上沒有足夠的套接字(因此不能在農場中)。

我已經做了一些服務器測試,並通過調整註冊表以使更多的套接字可用,我有24K套接字連接到服務器,所有的一個框。這是我所期望的,因爲服務器端的客戶端連接在每一端都需要一個套接字對象,並且只有64K套接字可用。我沒有嘗試爲我的測試創建24K線程,我使用了一個客戶端線程類來打開/關閉列表中多個客戶端套接字對象上的連接。

RGDS, 馬丁

+0

其實坦率地告訴你..我甚至不能去任何地方附近的標記!我增加了間隔的線程數量。所以我達到的最大值是大約5k線程。 – 2011-06-07 16:47:17

相關問題