0

我正在尝试创建 cpu 负载生成器工具。我的输入将是一个介于 0-100 之间的数字。我正在使用时间函数来计算负载并检查负载。如果负载超过所需值,我会尝试使进程休眠。我面临的问题是我获得了所需的负载,但仅限于 500 毫秒或更长的时间段。不少于那。我正在检查一个名为“top”的工具上的负载。当我尝试减少顶部的时间段时。我观察负载波动。有什么方法可以让进程休眠 1ms 或更短。

4

5 回答 5

3

由于您标记了这个问题 linux-kernel,我将回答有关 Linux 调度程序的具体细节......

简短的回答:不,你不能睡不到 1 毫秒,因为这是调度程序的分辨率。换句话说,内核每毫秒唤醒一次以决定调度哪个进程,因此睡眠时间少于该时间是不可能的。

长答案:为 Linux 设计一个 cpu 负载生成器是一个足够复杂的主题,值得多次发表。您可以在 Google Scholar 上尝试使用术语cpu burnercpu load generator来查找更多信息。现在最有效的方法之一是不这样做:任何最新内核的 cgroups 功能都存在 cpu 带宽限制,这意味着您不必执行代码来限制其他进程可用的 cpu 时间量。

不,nanosleep 不提供任何保证您的进程将停止,只是时钟至少提前了您请求的时间量。

于 2012-10-31T06:45:01.240 回答
1

nanosleep(2)但由于调度,不能保证进程会在请求的确切时间睡眠。您还可以将它与renice(8)结合使用 以将进程设置为更高的优先级。

于 2012-10-31T06:38:31.357 回答
1

使用nanosleep功能。它请求至少在给定的纳秒分辨率持续时间内暂停调用线程。

于 2012-10-31T06:39:36.567 回答
1

操作系统中的计时器总是不像你想要的那样可靠和准确。通常,操作系统计时器非常适合大多数用途。但是如果你想获得一些高分辨率的滴答声,你必须做到这些: 1、检查系统硬件,即是否有任何定时器发生器可以提供硬件定时器中断;2、检查OS系统,没有其他进程/线程或设备会屏蔽硬件定时器中断;如果可能,还可以注册定时器设备中断并将定时器值调整到您想要的时间;3、同时cputime也作为获取设计中断时的参考,检查时间浮动和准确性。最好使用一些技术来做到这一点。Nanosleep 不知何故未能如您所愿。

于 2012-10-31T06:44:02.527 回答
1

我认为不可能在短至 500 毫秒的时间窗口上生成固定的 CPU 负载。考虑到 CPU 是一个动态系统,很难从数学角度建模。您可以做的事情是生成一个平均匹配您想要达到的目标的 CPU 负载。

例如,这个简单的脚本https://github.com/GaetanoCarlucci/CPULoadGenerator通过 PID 调节器控制 CPU 内核的“睡眠时间”,以平均实现所需的 CPU 负载。

在这里您可以看到一个动态示例,其中在 CPU 核心 0 上生成了 50% 的负载:

在此处输入图像描述

您可以注意到瞬态时间大于 500 毫秒。

于 2016-01-12T12:07:11.253 回答