【问题标题】:Stressing the CPU by spawning threads通过产生线程对 CPU 施加压力
【发布时间】:2012-02-17 15:18:08
【问题描述】:

我正在开发一个应用程序,我们将用它来模拟用户在系统上工作。目标之一是通过让大量用户执行任务来对应用程序进行压力测试。

此时用户只是后台工作人员。现在,无论我产生多少“用户”,内核的 CPU 负载都不会超过屋顶。

现在,我对线程很陌生,但我最好的猜测是这是由于硬件限制,在这种情况下是 4 个内核。核心开始工作,之后只是时间切片的问题。

有没有办法解决这个问题?我想尽可能地强调所有核心。

【问题讨论】:

  • 您使用的是 Visual Studio Express 吗? express 版本只支持单核应用
  • 这些任务是 CPU 繁重还是执行 IO?一次生成了多少个这样的任务?您看到的 CPU 级别是多少?
  • 基本上它是一个 SOA 应用程序。我们试图通过模拟用户的工作来确定应用程序的各种最大值。您的平均任务将是基本的 CRUD。一切都按预期工作,我只是想弄清楚是否有可能让“CPU 做更多事情”。

标签: c# .net multithreading concurrency


【解决方案1】:

我使用的测试代码如下。

它为系统上报告的每个 CPU 创建一个线程,并让每个线程自旋,除非您将其节流。

loadLevel 变量通常由滚动条设置,范围为 0..100。

Thread[] cpuLoadThread;
public Form1()
{
    InitializeComponent();

    cpuLoadThread = new Thread[Environment.ProcessorCount];

    for(int i = 0; i < cpuLoadThread.Length; i++)
    {
        cpuLoadThread[i] = new Thread(new ThreadStart(cpuLoadProc));

        cpuLoadThread[i].IsBackground = true;
        cpuLoadThread[i].Name = "CPU Load Thread";
        cpuLoadThread[i].Start();
    }

}


void cpuLoadProc()
{
    System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
    stopWatch.Start();

    while (true)
    {
        if (stopWatch.ElapsedMilliseconds > loadLevel)
        {
            Thread.Sleep(100 - loadLevel);
            stopWatch.Reset();
            stopWatch.Start();
        }
    }
}

【讨论】:

  • 像魅力一样工作。非常感谢!
【解决方案2】:

VS2010 有相当不错的负载测试功能。我的一位同事写了一篇关于模拟多个用户here 的博客文章。这样做的基础是围绕用户执行的最常见操作编写一些单元测试,然后让 VS 负载测试为您完成多用户工作。

【讨论】:

    【解决方案3】:

    除了在线程中等待 I/O 操作完成之外,CPU 没有太多工作要做。

    【讨论】:

    • 你在线程中做什么会占用 CPU 资源?
    • 我不知道。我没有问这个问题。我只是指出没有提到用户任务受 I/O 限制。
    • 他描述的是等待服务器响应的模拟客户端。我就是这么解释的。因此,客户不会做太多事情,而是等待响应。
    【解决方案4】:

    这完全取决于操作系统调度算法和 CLR(因为它隐藏了一些底层细节)。为了允许多个线程在所有线程和中断之间运行 OS 切片处理器时间。

    这段代码应该足够强调你的测试,如果没有,你可能需要选择 C++ 或 C

    int nCores = 4;
    for (int i = 0; i < nCores;i++ )
    {
        var t = new Thread(() =>
                            {
                                while (true)
                                {
                                }
                            });
        t.Priority = ThreadPriority.Highest;
        t.Start();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-03
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 2018-07-27
      相关资源
      最近更新 更多