Hacer que un programa se ejecute lentamente


¿Hay alguna manera de ejecutar un programa C++ más lento cambiando los parámetros del sistema operativo en Linux? De esta manera me gustaría simular lo que sucederá si ese programa en particular se ejecuta en una máquina más lenta.

En otras palabras, una máquina más rápida debe comportarse como una máquina más lenta para ese programa en particular.

Author: John Roberts, 2013-01-17

7 answers

  • Baje la prioridad usando nice (y / o renice). También puede hacerlo programáticamente usando nice() llamada al sistema. Esto no ralentizará la velocidad de ejecución per se, pero hará que Linux scheduler asigne menos (y posiblemente más cortos) marcos de tiempo de ejecución, se anticipe más a menudo, etc. Vea Programación de procesos (Capítulo 10) de Comprensión del Kernel de Linux para más detalles sobre la programación.
  • puede Que desee aumentar el temporizador frecuencia de interrupción para poner más carga en el núcleo, lo que a su vez ralentizará todo. Esto requiere una reconstrucción del núcleo.
  • Puede utilizar Escalado de Frecuencia de CPU mecanismo (requiere módulo kernel) y controlar (ralentizar, acelerar) la CPU utilizando el cpufreq-set comando.
  • Otra posibilidad es llamar sched_yield(), que dará quantum a otros procesos, en partes críticas de rendimiento de su programa (requiere código cambio).
  • Puede enganchar funciones comunes como malloc(), free(), clock_gettime() etc. usando LD_PRELOAD , y hacer algunas cosas tontas como quemar unos pocos millones de ciclos de CPU con rep; hop;, insertar barreras de memoria, etc. Esto ralentizará el programa con seguridad. (Ver esta respuesta para un ejemplo de cómo hacer algunas de estas cosas).
  • Como @ Bill mencionó, siempre puede ejecutar Linux en un software de virtualización que le permite limitar la cantidad de recursos de CPU asignados, memoria, sucesivamente.
  • Si realmente desea que su programa sea lento, ejecútelo bajo Valgrind (también puede ayudarlo a encontrar algunos problemas en su aplicación como fugas de memoria, referencias de memoria defectuosas, etc.).
  • Se puede lograr cierta lentitud recompilando su binario con optimizaciones deshabilitadas (es decir, -O0 y habilitar aserciones (es decir, -DDEBUG).
  • Siempre puedes comprar una PC vieja o una netbook barata (como Una computadora portátil Por Niño, y no olvides donarla a un niño una vez que se realizan pruebas) con una CPU lenta y ejecutar su programa.

Espero que ayude.

 144
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:29:39

QEMU es un emulador de CPU para Linux. Debian tiene paquetes para ello (imagino que la mayoría distribuciones lo harán). Puede ejecutar un programa en un emulador y la mayoría de ellos deben soportar ralentizar las cosas. Por ejemplo, Miroslav Novak tiene parches para ralentizar QEMU.

Alternativamente, puede compilar a otra CPU-linux (arm-none-gnueabi-linux, etc.) y luego hacer que QEMU traduzca ese código para que se ejecute.

La nice sugerencia es simple y puede funciona si lo combinas con otro proceso que consumirá cpu.

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;

¿No ha dicho si necesita gráficos, archivos y/o E/S de red? ¿Sabes algo sobre la clase de error que estás buscando? ¿Es una condición de carrera, o el código simplemente funciona mal en un sitio del cliente?

Edit: también puede utilizar las señales como DETENER y CONT para iniciar y detener el programa. Un depurador también puede hacer esto. El problema es que el código ejecuta un a toda velocidad y luego se detiene. La mayoría de las soluciones con Linux scheduler tendrán este problema. Hubo una especie de analizador de hilos de Intel afair. Veo Vtune Notas de la versión. Este es Vtune, pero estaba bastante seguro de que hay otra herramienta para analizar las carreras de hilos.Vea: Intel Thread Checker, que puede verificar algunas condiciones de carrera de subprocesos. Pero no sabemos si la aplicación es multi-threaded?

 36
Author: artless noise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-04 02:02:48

Uso cpulimit:

Cpulimit es una herramienta que limita el uso de CPU de un proceso (expresado en porcentaje, no en tiempo de CPU). Es útil para controlar los trabajos por lotes, cuando no desea que consuman demasiados ciclos de CPU. El objetivo es evitar que un proceso se ejecute durante más de un tiempo especificado. No cambia el valor nice u otras configuraciones de prioridad de programación, sino el uso real de la CPU. Además, es capaz de adaptarse a la carga del sistema , dinámica y rápida.

El control de la cantidad de cpu utilizada se realiza enviando señales SIGSTOP y SIGCONT POSIX a los procesos.

Todos los procesos secundarios y subprocesos del proceso especificado compartirán el mismo porcentaje de CPU.

Está en los repositorios de Ubuntu. Solo

apt-get install cpulimit

Aquí hay algunos ejemplos sobre cómo usarlo en un programa que ya está en ejecución:

Limite el proceso 'bigloop' por nombre ejecutable a 40% CPU:

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

Limite un proceso por PID a 55% CPU:

cpulimit --pid 2960 --limit 55
 19
Author: Izkata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-17 19:21:05
  1. Consigue un ordenador viejo
  2. Los paquetes de alojamiento VPS tienden a ejecutarse lentamente, tienen muchas interrupciones y latencias tremendamente variables. Cuanto más barato sea, peor será el hardware. A diferencia del hardware realmente antiguo, hay una buena probabilidad de que contengan conjuntos de instrucciones (SSE4) que no se encuentran generalmente en el hardware antiguo. Sin embargo, si desea un sistema que camine lentamente y se cierre a menudo, un host VPS barato será el inicio más rápido.
 13
Author: Mikhail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-18 04:39:12

Si solo desea simular su programa para analizar su comportamiento en una máquina realmente lenta, puede intentar hacer que todo su programa se ejecute como thread de algún otro programa principal.

De esta manera puede priorizar el mismo código con diferentes prioridades en pocos subprocesos a la vez y recopilar datos de su análisis. He utilizado esto en el desarrollo de juegos para el análisis de procesamiento de marcos.

 3
Author: Pervez Alam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-24 03:29:42

Use sleep o wait dentro de su código. No es la forma más brillante de hacerlo, pero es aceptable en todo tipo de computadoras con diferentes velocidades.

 2
Author: Thats how we roll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-17 03:54:22

La forma más simple posible de hacerlo sería envolver su código ejecutable principal en un bucle while con un sleep al final del mismo.

Por ejemplo:

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

Como la gente mencionará, esta no es la forma más precisa, ya que su código lógico seguirá funcionando a velocidad normal, pero con retrasos entre ejecuciones. Además, asume que su código lógico es algo que se ejecuta en un bucle.

Pero es simple y configurable.

 2
Author: Kalail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-10 06:03:07