让程序运行缓慢

Rob*_*lex 102 c c++ unix linux ubuntu

有没有办法通过改变Linux中的任何操作系统参数来慢慢运行C++程序?通过这种方式,我想模拟如果特定程序碰巧在真正较慢的机器上运行会发生什么.

换句话说,更快的机器应该表现为该特定程序的较慢机器.

小智 145

  • 使用nice(和/或renice)降低优先级.您也可以使用nice()系统调用以编程方式执行此操作.这不会降低执行速度本身,但会使Linux调度程序分配更少(也可能更短)的执行时间帧,更频繁地抢占等等.有关调度的更多详细信息,请参阅了解Linux内核的进程调度(第10章).
  • 您可能希望增加定时器中断频率增加内核的负载,从而减慢所有内容的速度.这需要内核重建.
  • 您可以使用CPU Frequency Scaling机制(需要内核模块)并使用该cpufreq-set命令控制(减慢,加速)CPU .
  • 另一种可能性是在sched_yield()程序的性能关键部分调用(这将为其他进程提供量子)(需要代码更改).
  • 您可以钩状常用功能malloc(),free(),clock_gettime()使用等LD_PRELOAD,并做一些愚蠢的东西一样烧了几百万的CPU周期rep; hop;,插入记忆障碍等,这会拖慢程序是肯定的.(有关如何执行此操作的示例,请参阅此答案).
  • 正如@Bill所提到的,你总是可以在虚拟化软件中运行Linux,它允许你限制分配的CPU资源,内存等.
  • 如果你真的希望你的程序运行缓慢,可以在Valgrind下运行它(也可以帮助你在应用程序中找到一些问题,比如内存泄漏,坏内存引用等).
  • 通过使用禁用的优化重新编译二进制文件(即-O0启用断言(即-DDEBUG))可以实现一些缓慢.
  • 您可以随时购买旧PC或便宜的上网本(例如每个孩子一台笔记本电脑,并且在完成测试后不要忘记将其捐赠给孩子),并使用慢CPU并运行您的程序.

希望能帮助到你.

  • +1:各种建议,包括每项建议的基本要求 (15认同)
  • +1 esp.,用于"...购买一台旧PC或便宜的上网本......,一旦完成测试,不要忘记捐给孩子" (11认同)
  • 启用调试符号(`-ggdb3`)确实*不会减慢二进制文件的执行速度.它只是使它更大. (4认同)
  • 你能编辑你的答案来展示如何模拟不同类型的'慢'吗?缓慢的I/O,慢速CPU,慢速内存,内存抖动等之间存在差异 (3认同)
  • 弗拉德+1.如果你有支持的CPU和Linux内核,可能cpufreq很容易做到.这应该具有指令级粒度.如果不购买新硬件,这可能是最好的通用答案; 它不会模拟较慢的网络,磁盘,视频等,这也可能导致比赛. (3认同)

art*_*ise 36

QEMU 是Linux的CPU模拟器.Debian有它的包(我想大多数发行版都会).您可以在模拟器中运行程序,其中大多数应该支持减慢速度.例如, Miroslav Novak有补丁减缓QEMU.

或者,你可以交叉编译到另一个CPU-linux(arm-none-gnueabi-linux等)然后让QEMU翻译该代码来运行.

漂亮的建议很简单,如果你与另一个进程,这将消耗CPU结合它可能工作.

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;
Run Code Online (Sandbox Code Playgroud)

你没有说你是否需要图形,文件和/或网络I/O?你知道你正在寻找的错误吗?这是竞争条件,还是代码在客户站点表现不佳?

编辑: 您还可以使用STOPCONT等信号来启动和停止程序.调试器也可以这样做.问题是代码运行全速然后停止.使用Linux调度程序的大多数解决方案都会遇到此问题. 英特尔公司提供了某种线程分析器.我看到了Vtune发行说明.这是Vtune,但我很确定还有另一种工具来分析线程竞赛. 请参阅:英特尔线程检查器,可以检查某些线程争用情况.但我们不知道应用程序是否是多线程的?


Izk*_*ata 20

用途cpulimit:

Cpulimit是一个限制进程CPU使用率的工具(以百分比表示,而不是以CPU时间表示).当您不希望它们吃太多CPU周期时,控制批处理作业很有用.目标是防止进程运行超过指定的时间比率.它不会更改nice值或其他调度优先级设置,而是更改实际的CPU使用率.此外,它能够动态,快速地适应整个系统负载.

使用的cpu量的控制完成了向进程发送SIGSTOP和SIGCONT POSIX信号.

所有子进程和指定进程的线程将共享相同的CPU百分比.

它在Ubuntu回购中.只是

apt-get install cpulimit
Run Code Online (Sandbox Code Playgroud)

以下是一些如何在已经运行的程序中使用它的示例:

通过可执行名称将进程'bigloop'限制为40%CPU:

cpulimit --exe bigloop --limit 40
cpulimit --exe /usr/local/bin/bigloop --limit 40 
Run Code Online (Sandbox Code Playgroud)

通过PID将进程限制为55%CPU:

cpulimit --pid 2960 --limit 55
Run Code Online (Sandbox Code Playgroud)


Mik*_*ail 13

  1. 得到一台旧电脑
  2. VPS托管软件包往往运行缓慢,中断很多,延迟时间也各不相同.你的硬件越便宜越硬.与真正的旧硬件不同,它们很可能包含通常在旧硬件上找不到的指令集(SSE4).毫无疑问,如果你想要一个经常慢慢行走和快门的系统,便宜的VPS主机将是最快的开始.