C#:以自定义百分比创建 CPU 使用率

Posted

技术标签:

【中文标题】C#:以自定义百分比创建 CPU 使用率【英文标题】:C#: Create CPU Usage at Custom Percentage 【发布时间】:2009-08-22 10:10:32 【问题描述】:

我希望在某些 CPU 使用条件下在几台机器上测试系统响应能力等。不幸的是,我只能创建 ~100% 的使用率(无限循环)或没有足够的 CPU 使用率(我正在使用 C#)。

有什么方法可以粗略地估算,因为其他任务也在系统上运行,以 20%、30%、40%(等等)的步长人为地创建 CPU 使用率?

我了解系统之间存在差异,显然,因为 CPU 的不同。它更多的是关于可定制 CPU 密集型计算的算法/想法,这些计算在当前 CPU 上创造足够的使用率,而不会最大化它,我可以对其进行调整,然后以某种方式调整它们以创建所需的百分比。

【问题讨论】:

【参考方案1】:

然后呢?

    DateTime lastSleep = DateTime.Now;            
    while (true)
    
        TimeSpan span = DateTime.Now - lastSleep;
        if (span.TotalMilliseconds > 700)
        
            Thread.Sleep(300);
            lastSleep = DateTime.Now;
        
    

您可以使用较小的数字来获得更稳定的负载....只要比率是您想要的。但这确实只使用一个内核,因此您可能必须在多个线程中执行此操作。

【讨论】:

【参考方案2】:

您可以添加一个线程定时器,它会在一定时间间隔内唤醒并执行一些工作。然后调整工作间隔和工作量,直到接近所需的负载。

    private void button1_Click(object sender, EventArgs e)
    
        m_timer = new Timer(DoWork);
        m_timer.Change(TimeSpan.Zero, TimeSpan.FromMilliseconds(10));
    

    private static void DoWork(object state)
    
        long j = 0;
        for (int i = 0; i < 2000000; i++)
        
            j += 1;
        
        Console.WriteLine(j);
    

通过调整循环的值,我能够为我的系统增加 20%、60% 和满负荷。它将使用额外的线程扩展到多个内核以实现更均匀的负载。

【讨论】:

【参考方案3】:

The utility provides a simple slider bar user interface that allows you to place an arbitrary load on the processor(s) in your system. Automatically detects and handles multiple processors.

今天早上下载它时对我来说效果很好。

【讨论】:

【参考方案4】:

这是一个函数,它利用所有可用的处理器/内核达到可自定义的百分比,并且可以随时被调用代码取消。

private static CancellationTokenSource StressCPU(int percent)

    if (percent < 0 || percent > 100) throw new ArgumentException(nameof(percent));
    var cts = new CancellationTokenSource();
    for (int i = 0; i < Environment.ProcessorCount; i++)
    
        new Thread(() =>
        
            var stopwatch = new Stopwatch();
            while (!cts.IsCancellationRequested)
            
                stopwatch.Restart();
                while (stopwatch.ElapsedMilliseconds < percent)   // hard work
                Thread.Sleep(100 - percent); // chill out
            
        ).Start();
    
    return cts;

使用示例:

var cts = StressCPU(50);
Thread.Sleep(15000);
cts.Cancel();

结果:

【讨论】:

【参考方案5】:

没有这样做 - 但您可以尝试计算在多个程序中运行的优先线程。

【讨论】:

【参考方案6】:

当您尝试使用睡眠时,您是这样做还是只是将睡眠放入实际循环中? 我认为这会奏效。

while(true)

  Thread.Sleep(0);
  for(int i=0;i<veryLargeNumber; i++)
  
      //maybe add more loops here if looping to veryLargeNumber goes to quickly
      //also maybe add some dummy operation so the compiler doesn't optimize the loop away
  

【讨论】:

以上是关于C#:以自定义百分比创建 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

性能计数器将 cpuUsage 保持在一定百分比 C#

C# - 以百分比形式获取 GPU 的总使用量

Zabbix3.0.4监控Windows的CPU使用百分比

Zabbix3.0.4监控Windows的CPU使用百分比并在CPU使用率超过90%触发报警

使用 Telegraf 的 influxDB 数据在 Grafana 上绘制 CPU 使用率百分比

从 QTime 继承以自定义时间格式