通过生成线程来强调CPU

时间:2012-02-17 15:18:08

标签: c# .net multithreading concurrency

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

此时,用户只是一名背景工作者。现在,无论我产生多少“用户”,核心的CPU负载都无法通过屋顶。

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

有什么方法可以解决这个问题吗?我想尽可能地强调所有内核。

4 个答案:

答案 0 :(得分:3)

我使用的测试代码如下。

它为系统上报告的每个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();
        }
    }
}

答案 1 :(得分:0)

除了等待线程中的I / O操作完成外,CPU没有那么多工作。

答案 2 :(得分:0)

VS2010具有非常好的负载测试功能。我的一位同事写了一篇关于模拟多个用户here的博客文章。其基础是针对用户执行的最常见操作编写一些单元测试,然后让VS负载测试为您执行多用户工作。

答案 3 :(得分:0)

这完全取决于OS调度算法和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();
}