如何在 C# 中生成稳定的 CPU 负载,在特定时间内低于 100%?我还希望能够在一段时间后更改负载量。您建议如何在很短的时间内产生使用高峰?
最佳答案
首先,您必须了解 CPU 使用率始终是特定时间段内的平均值。在任何给定时间,CPU 要么工作要么不工作。 CPU 永远不会使用 40%。
但是,我们可以通过让 CPU 工作 0.4 秒并休眠 0.6 秒来模拟 40% 的负载超过一秒。这使得那一秒的平均利用率为 40%。
将它减少到小于一秒,比如 100 毫秒的 block 应该会提供更稳定的利用率。
以下方法将采用所需利用率的参数,然后将单个 CPU/核心利用率提高到该程度:
public static void ConsumeCPU(int percentage)
{
if (percentage < 0 || percentage > 100)
throw new ArgumentException("percentage");
Stopwatch watch = new Stopwatch();
watch.Start();
while (true)
{
// Make the loop go on for "percentage" milliseconds then sleep the
// remaining percentage milliseconds. So 40% utilization means work 40ms and sleep 60ms
if (watch.ElapsedMilliseconds > percentage)
{
Thread.Sleep(100 - percentage);
watch.Reset();
watch.Start();
}
}
}
我正在使用 stopwatch在这里是因为它比 TickCount 更准确属性,但您同样可以使用它并使用减法来检查您是否运行了足够长的时间。
要记住两点:
- 在多核系统上,您必须为每个核心生成一个线程。否则,您将看到只有一个 CPU/内核正在运行,给出大致的“百分比/内核数”利用率。
- Thread.Sleep 不是很准确。它永远不会保证时间精确到毫秒,因此您会看到结果有些变化
要回答您的第二个问题,关于在特定时间后更改利用率,我建议您在一个或多个线程(取决于核心数量)上运行此方法,然后当您想要更改利用率时,您只需停止这些线程并使用新的百分比值生成新的。这样,您不必实现线程通信来更改正在运行的线程的 percentage
。
关于c# - 模拟稳定的 CPU 负载和峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2514544/