2011-06-07 70 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

相关问题