以较低的 CPU 速度运行程序?

以较低的 CPU 速度运行程序?

runat 400mhz ./my-program --argument-of="my program"对于我来说,在具有固定(较低)CPU 时钟速度(例如,为了获得该时钟速度)的 Linux 环境中运行特定程序非常有用。

我需要它在程序的每个汇编指令之间生成延迟,如果延迟不准确(例如,如果它取决于操作系统调度程序,因为它几乎肯定会),它不会杀死我。

目标是在学校编写不太繁重的应用程序时使算法效率非常明确(拥有 3GHz CPU 使得很难注意到运行时间短且可以真正优化的缓慢算法)。此外,它也许对于实时发现竞争条件很有用。

你知道有这样的工具吗?有什么类型的解释器可以让我破解来实现此目的吗? gdb 可以以相对简单的方式帮助我吗?我认为这是我所知道的最接近控制 Linux 程序执行的东西。

在 CPU 上限的虚拟机中运行漏洞系统可能是另一种选择,因为它给我带来了一种错觉 - 速度较低的 CPU - 但最好还是运行单个程序。

答案1

我认为您正在寻找的应用程序称为cpulimit。这不是系统中通常包含的命令,因此您必须通过发行版包管理器 (Ubuntu/Debian) 或从源代码安装它。

Ubuntu/Debian

$ apt-cache search cpulimit
cpulimit - tool for limiting the CPU usage of a process

所以安装会像这样:

$ sudo apt-get install cpulimit

从源头

像这样下载:

$ wget https://github.com/opsengine/cpulimit/archive/master.zip \
       -O cpulimit-master.zip

解压并构建:

$ unzip cpulimit-master.zip ; cd cpulimit-master ; make

用法

您可以使用 a 安装它make install,但现在我们只需从构建它的目录中使用它:

$ pwd
/home/saml/tst/96387/cpulimit-master
$ src/cpulimit -e firefox -l 30

这会将调用的进程限制firefox为可用 CPU 使用率的 30%。

您还可以在调用进程后将其应用于正在运行的进程:

$ pgrep firefox
1234

$ src/cpulimit -p 1234 -l 30

您可以看到其余的用法cpulimit

$ src/cpulimit 
Error: You must specify a cpu limit percentage
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 400 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --ignore-children  don't limit children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Report bugs to <[email protected]>.

cyberciti.biz 上还有一个关于其使用的很好的教程,标题为:Linux 限制每个进程的 CPU 使用率

笔记:请记住,它以百分比形式限制 CPU 使用率,因此如果您有四核机箱(4 个 cpu),那么您需要将其限制在 0% - 400% 之间。

答案2

您也许可以设置处理器的时钟,但是是全局设置,而不是针对特定程序。处理器不是这样工作的。适用于功率有限环境(尤其是笔记本电脑和其他移动设备)的处理器往往支持多种速度。

原则上,您可以安排在调度进程时更改处理器速度(如果支持),并在调度另一个进程时重置处理器速度。我不知道有任何软件支持这一点,它可能需要对内核进行相当大的修改。

您可以在速度较慢的虚拟机中运行您的程序,例如 Qemu(没有 KVM,因此您可以获得纯软件模拟)或 Bochs。

以较低的 CPU 速度运行不太可能会暴露更多的竞争条件。

如果您的程序是多线程的,您可以强制它使用单个处理器或带有 的一组特定处理器taskset,例如taskset 3 myprogram仅在 CPU #0 和 #1 上运行。强制程序在单个 CPU 上运行可能会出现更少的竞争条件。

对于您的用例,与其运行速度较慢,不如运行几次。例如,如果您希望程序在比计算机慢大约 10 倍的设备上具有一定的速度,请通过连续运行程序 10 次来测试它。多次运行程序会增加遇到竞争条件的可能性。

答案3

另一种选择是使用速度较慢的硬件 - 某种廉价的基于 ARM 的板,例如树莓派或(稍微强大一点)Compulab修剪切片应该做。它们的内存量有限,CPU 速度慢,但可以运行完整的 Linux 系统 - Fedora、Debian 和其他一些发行版都有 ARM 版本。

答案4

您可以使用 cpufreq-info 查找您的 cpu 支持的所有 CPU 时钟速度。您可以使用 cpufreq-set 选择 cpu 时钟速度。

相关内容