我们可以在C#应用程序中创建300000个线程并在PC上运行吗

本文关键字:线程 PC 运行 300000个 创建 应用程序 我们 | 更新日期: 2023-09-27 17:58:46

我正在尝试模拟一个场景,其中300000个消费者正在访问服务器。因此,我试图通过从并发线程重复查询服务器来创建伪客户端。

但要清除的第一个障碍是,是否有可能在PC上运行300000个线程?下面是一段代码,我正在使用它来初步查看我可以获得多少个最大线程,然后用实际函数替换测试函数:

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

现在我正在尝试的可能是不现实的,但如果有办法做到这一点,你知道,那么请帮助我。

我们可以在C#应用程序中创建300000个线程并在PC上运行吗

每个线程都会创建自己的堆栈和本地存储,在32位操作系统上,每个线程大约有512k的堆栈空间,我认为在64位操作系统中,堆栈空间会翻倍。快速返回电子表格计算,为您的30万客户提供146.484375吉格的堆栈空间。

所以,不,不要创建300k个线程,而是使用线程池来模拟300k个请求,尽管我认为有几个测试客户端通过网络接口向服务器发送垃圾邮件会更好。

有很多可用的web负载测试工具。良好的起点:http://www.webperformance.com/library/reports/TestingAspDotNet/

您可以通过调用ThreadPool.SetMaxThreads方法来更改线程的最大数量。300000个线程可能会让你的电脑爆炸*

*这可能是一个夸张的

语言不可知答案:

更好的方法可能是使用Reactor模式,每个核心最多有1或2个并发线程。

As.net为每个clr线程提交整个堆栈(1MB);正如本所说,你的电脑可能真的会爆炸。或者可能是OoM。

那么,当您尝试创建300K线程时,测试的结果是什么?我不会在我身上试试的!

无论如何,你都无法同时连接30万个客户端,因为一台服务器上没有足够的套接字可用(因此是农业)。

我已经做了一些服务器测试,通过调整注册表以使更多的套接字可用,我已经有24K个套接字连接到服务器,所有这些都是一个盒子。这在某种程度上是我所期望的,因为服务器<>客户端连接要求每端有一个套接字对象,并且只有64K个套接字可用。我没有尝试为我的测试创建24K线程,我使用了一个客户端线程类来打开/关闭列表中多个客户端套接字对象的连接。

Rgds,Martin