【问题标题】:Can we create 300,000 threads in a C# application and run it on a PC?我们可以在 C# 应用程序中创建 300,000 个线程并在 PC 上运行吗?
【发布时间】:2018-06-26 20:32:28
【问题描述】:

我试图模拟 300,000 名消费者访问服务器的场景。所以我试图通过从并发线程重复查询服务器来创建伪客户端。

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

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

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

【问题讨论】:

  • 如果“运行”是指线程之间的颠簸……呵呵
  • 很抱歉我没有很好地阐明目的。我的设置是服务器-客户端设置。我想强调客户端而不是服务器。在设置中,进程向正在运行的客户端进程发出请求,而客户端进程将依次将请求转发给要服务的服务器。但我明白我们都在趋同的一点,在一台机器上创建这么多线程是不现实的,不推荐。此外,我打算让这些线程至少每 1 分钟执行一次来给客户端造成压力的动机似乎太过分了! :(

标签: c# multithreading stress-testing


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    *这可能有点夸张

    【讨论】:

    • 这与问题无关,因为他没有使用线程池。
    • 可能有点夸张,但他需要 300 gigs 的内存才能在内存中保留这么多线程。
    【解决方案3】:

    与语言无关的答案:

    解决这个问题的更好方法可能是使用反应堆模式,每个核心最多有 1 或 2 个并发线程。

    【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      我已经完成了一些服务器测试,通过调整注册表以提供更多可用的套接字,我已经将 24K 套接字连接到服务器,所有这些都是一个盒子。这有点出乎我的意料,因为服务器客户端连接的每一端都需要一个套接字对象,并且只有 64K 套接字可用。我没有尝试为我的测试创建 24K 线程,我使用了一个客户端线程类,它在列表中的多个客户端套接字对象上打开/关闭连接。

      Rgds, 马丁

      【讨论】:

      • 实际上坦率地告诉你.. 我什至无法接近那个标记!我每隔一段时间增加线程数。所以我达到的最大值约为 5k 线程。
      猜你喜欢
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2020-12-03
      相关资源
      最近更新 更多