当前位置: 首页>>技术教程>>正文


使程序运行缓慢

, , , ,

问题描述

有什么方法可以通过更改Linux中的任何OS参数来减慢C++程序的运行速度?这样,我想模拟一下,如果该特定程序恰好在速度较慢的计算机上运行,​​将会发生什么。

换句话说,对于该特定程序,速度更快的计算机应表现为速度较慢的计算机。

最佳方法

  • 使用nice(和/或renice)降低优先级。您也可以使用nice()系统调用以编程方式执行此操作。这本身不会降低执行速度,但是会使Linux调度程序分配更少(可能更短)的执行时间帧,更频繁地抢占,等等。有关调度的更多详细信息,请参见Process Scheduling (Chapter 10) of Understanding the Linux Kernel

  • 您可能希望increase the timer interrupt frequency在内核上增加更多负载,这反过来会减慢一切。这需要内核重建。

  • 您可以使用CPU Frequency Scaling机制(需要内核模块)并通过cpufreq-set命令控制(减速,加速)CPU。

  • 另一种可能性是调用sched_yield(),它将在程序的性能关键部分(需要代码更改)产生量子给其他进程。

  • 您可以使用LD_PRELOAD钩住malloc()free()clock_gettime()等常用功能,并做一些愚蠢的事情,例如用rep; hop;消耗数百万个CPU周期,插入内存屏障等。这肯定会减慢程序的速度。 (有关如何执行此操作的示例,请参见this answer)。

  • 如@Bill所述,您始终可以在虚拟化软件中运行Linux,该软件可以限制分配的CPU资源,内存等的数量。

  • 如果您确实希望您的程序运行缓慢,请在Valgrind下运行它(可能还会帮助您在应用程序中发现一些问题,例如内存泄漏,错误的内存引用等)。

  • 通过使用禁用的优化功能(即-O0和启用断言(即-DDEBUG))重新编译二进制文件,可以实现一定的速度。

  • 您总是可以用较慢的CPU来购买旧PC或便宜的上网本(例如One Laptop Per Child,并且一旦完成测试,别忘了将其捐赠给孩子)并运行程序。

希望能帮助到你。

次佳方法

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;

您没有说是否需要图形,文件和/或网络I /O?您是否了解所要寻找的错误类别?是竞争条件,还是代码只是在客户现场表现不佳?

编辑:您还可以使用STOP和CONT之类的信号来启动和停止程序。调试器也可以这样做。问题是代码以全速运行,然后停止。 Linux调度程序的大多数解决方案都会出现此问题。有一种来自Intel afair的线程分析器。我看到Vtune Release Notes。这是Vtune,但我很确定还有另一种分析线程竞争的工具。请参阅:Intel Thread Checker,它可以检查某些线程竞争条件。但是我们不知道该应用程序是否为multi-threaded?

第三种方法

使用cpulimit

Cpulimit is a tool which limits the CPU usage of a process (expressed in percentage, not in CPU time). It is useful to control batch jobs, when you don’t want them to eat too many CPU cycles. The goal is prevent a process from running for more than a specified time ratio. It does not change the nice value or other scheduling priority settings, but the real CPU usage. Also, it is able to adapt itself to the overall system load, dynamically and quickly.

The control of the used cpu amount is done sending SIGSTOP and SIGCONT POSIX signals to processes.

All the children processes and threads of the specified process will share the same percent of CPU.

在Ubuntu仓库中。只是

apt-get install cpulimit

以下是一些有关如何在already-running程序上使用它的示例:

Limit the process ‘bigloop’ by executable name to 40% CPU:

cpulimit --exe bigloop --limit 40 cpulimit --exe /usr/local/bin/bigloop --limit 40  

Limit a process by PID to 55% CPU:

cpulimit --pid 2960 --limit 55 

第四种方法

  1. 换一台旧电脑

  2. VPS托管程序包往往运行缓慢,有很多中断,并且延迟也千差万别。您越便宜,硬件就会越差。与真正的旧硬件不同,它们很有可能会包含通常在旧硬件上找不到的指令集(SSE4)。不过,如果您希望系统缓慢行走且经常关闭,那么便宜的VPS主机将是最快的启动方式。

第五种方法

如果您只是想模拟程序以分析其在非常慢的计算机上的行为,则可以尝试使整个程序作为其他主程序的thread运行。

通过这种方式,您可以一次在几个线程中对具有不同优先级的相同代码进行优先级排序,并收集分析数据。我已在游戏开发中将此用于frame-processing分析。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/8659.html,未经允许,请勿转载。