我希望在某些CPU使用条件下测试几台机器上的系统响应能力等。不幸的是,我只能创建~100%的使用率(无限循环)或CPU使用率不足(我正在使用C#)。
在粗略的近似中,有没有办法在系统上运行其他任务,以20,30,40%(等等)的步骤人为地创建CPU使用率?
我知道系统之间存在差异,显然,CPU会有所不同。它更多地是关于可自定义的CPU密集型计算的算法/想法,这些算法/想法在当前CPU上创建了足够的使用而没有最大化它我可以调整它们然后以某种方式调整它们以创建所需的百分比。
答案 0 :(得分:5)
DateTime lastSleep = DateTime.Now;
while (true)
{
TimeSpan span = DateTime.Now - lastSleep;
if (span.TotalMilliseconds > 700)
{
Thread.Sleep(300);
lastSleep = DateTime.Now;
}
}
您可以使用较小的数字来获得更稳定的负载....只要比率是您想要的任何值。这只会使用一个核心,因此您可能必须在多个线程中执行此操作。
答案 1 :(得分:4)
你可以添加一个间隔唤醒的线程计时器并完成一些工作。然后调整间隔和工作量,直到您接近所需的负载。
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%和满载。它将使用额外的线程扩展多个内核,以实现更均匀的负载。
答案 2 :(得分:1)
答案 3 :(得分:0)
没有这样做 - 但你可以尝试计算在多个程序中运行的优先级线程。
答案 4 :(得分:0)
当你尝试使用睡眠时,你是这样做的还是只是把睡眠放在实际的循环中? 我认为这会奏效。
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
}
}
答案 5 :(得分:0)
这是一个利用所有可用处理器/内核达到可自定义百分比的功能,可以随时通过调用代码取消。
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();
结果: