Hacer que un programa se ejecute lentamente

102

¿Hay alguna forma 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 realmente más lenta.

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

RoboAlex
fuente
5
Puede usar 'agradable' para darle una prioridad muy baja, no es algo definitivo, ¡pero puede ayudar!
John3136
7
ejecútelo dentro de una máquina virtual con otro programa que hace girar el procesador.
Thang
12
nicees un comando que reduce la prioridad de programación. Varían antiguos, relativamente toscos. Puede mirar las prioridades de programación, pero si la máquina no está ocupada haciendo otras cosas, su programa seguirá funcionando rápido. Por lo tanto, probablemente no ayudará lo suficiente.
Jonathan Leffler
9
Debe tener en cuenta que las computadoras tienen muchos procesos en ejecución en cualquier momento, por lo que hacer que su aplicación se ejecute más lentamente no será particularmente útil. Si desea ver cómo funciona su aplicación en un hardware de mala calidad, entonces debe obtener dicho hardware de mala calidad o cambiar temporalmente la configuración de BIOS de su hardware para hacerlo malo. Algunas BIOS le permitirán deshabilitar núcleos adicionales y reducir el tiempo de la CPU.
Mike Trusov
23
¡Desactive el botón "Turbo"!
SoftDev

Respuestas:

145
  • Reduzca la prioridad usando nice(y / o renice). También puede hacerlo mediante programación utilizando la nice()llamada al sistema. Esto no ralentizará la velocidad de ejecución per se, pero hará que el programador de Linux asigne menos (y posiblemente más cortos) marcos de tiempo de ejecución, se adelanta con más frecuencia, etc. Consulte Programación de procesos (Capítulo 10) de Comprensión del kernel de Linux para obtener más detalles sobre la programación. .
  • Es posible que desee aumentar la frecuencia de interrupción del temporizador para cargar más el kernel, lo que a su vez ralentizará todo. Esto requiere una reconstrucción del kernel.
  • Puede utilizar el mecanismo de escalado de frecuencia de la CPU (requiere un módulo del kernel) y controlar (ralentizar, acelerar) la CPU mediante el cpufreq-setcomando.
  • Otra posibilidad es llamar sched_yield(), que cederá cuántica a otros procesos, en partes críticas de rendimiento de su programa (requiere cambio de código).
  • Usted puede conectar funciones comunes como malloc(), free(), clock_gettime()etc., utilizando LD_PRELOAD , y hacer algunas cosas tontas como quemar unos pocos millones de ciclos de CPU con rep; hop;, inserción de las barreras de memoria, etc. Esto ralentizará el programa de seguro. (Vea esta respuesta para ver un ejemplo de cómo hacer algunas de estas cosas).
  • Como mencionó @Bill, siempre puede ejecutar Linux en un software de virtualización que le permite limitar la cantidad de recursos de CPU asignados, memoria, etc.
  • Si realmente desea que su programa sea lento, ejecútelo con Valgrind (también puede ayudarlo a encontrar algunos problemas en su aplicación como pérdidas de memoria, referencias erróneas de memoria, etc.).
  • Se puede lograr algo de lentitud al recompilar su binario con optimizaciones deshabilitadas (es decir, -O0y habilitar aserciones (es decir -DDEBUG).
  • Siempre puede comprar una PC vieja o una netbook barata (como Una computadora portátil por niño , y no se olvide de donarla a un niño una vez que haya terminado de probar) con una CPU lenta y ejecute su programa.

Espero eso ayude.

Comunidad
fuente
15
+1: conjunto variado de sugerencias, incluidos los requisitos básicos para cada una
lxop
4
Habilitar los símbolos de depuración ( -ggdb3) no ralentiza la ejecución del binario. Simplemente lo hace más grande.
caf
11
+1 especialmente, para "... comprar una PC vieja o una netbook barata ..., y no te olvides de donarla a un niño una vez que hayas terminado de probar"
Kris
3
¿Podría editar su respuesta para mostrar cómo simular diferentes tipos de "lentos"? Hay una diferencia entre lo lento de E / S, CPU lenta, memoria lenta, golear memoria, etc
parasietje
3
+1 para Vlad. Probablemente cpufreq sea fácil de hacer, si tiene una CPU y un kernel de Linux con soporte. Esto debe tener granularidad a nivel de instrucción. Esta es probablemente la mejor respuesta genérica sin comprar hardware nuevo; no simula una red, disco, video, etc. más lento, lo que también puede causar carreras.
ruido sin arte
36

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

Alternativamente, puede realizar una compilación cruzada en otra CPU-linux (arm-none-gnueabi-linux, etc.) y luego hacer que QEMU traduzca ese código para ejecutarlo.

La buena sugerencia es simple y puede funcionar si la combina con otro proceso que consumirá cpu.

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

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

Editar: también puede usar señales como STOP y CONT para iniciar y detener su programa. Un depurador también puede hacer esto. El problema es que el código se ejecuta a toda velocidad y luego se detiene. La mayoría de las soluciones con el programador de Linux tendrán este problema. Había una especie de analizador de hilos de Intel. Veo Notas de la versión de Vtune . Esto es Vtune, pero estaba bastante seguro de que hay otra herramienta para analizar carreras de hilos. Consulte: Intel Thread Checker , que puede verificar algunas condiciones de carrera de subprocesos. ¿Pero no sabemos si la aplicación es multiproceso?

ruido ingenuo
fuente
1
y bochs es un emulador de CPU más antiguo y lento (solo x86).
osgx
22

Utilizar 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 intervalo de tiempo especificado. No cambia el valor agradable u otras configuraciones de prioridad de programación, sino el uso real de la CPU . Además, es capaz de adaptarse a la carga general del sistema , de forma 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 los subprocesos del proceso especificado compartirán el mismo porcentaje de CPU.

Está en los repositorios de Ubuntu. Sólo

apt-get install cpulimit

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

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

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

Limite un proceso por PID al 55% de CPU:

cpulimit --pid 2960 --limit 55
Izkata
fuente
Todavía no he probado cpulimit, pero parece ser la mejor respuesta para preguntas similares en los sitios SE. ¿Existe alguna diferencia notable entre un programa que se ejecuta con limitaciones impuestas por cpulimit y un programa que se ejecuta en hardware más lento? Mi objetivo es probar una aplicación para asegurarme de que responda lo suficiente en las máquinas más lentas (y ajustar los gráficos para las máquinas más lentas).
trusktr
@trusktr Eso depende en gran medida de lo que esté haciendo ese programa. De improviso con el hardware más antiguo, puedo pensar en las velocidades de disco y la memoria disponible (RAM) que también afectan el rendimiento, y en la parte sobre gráficos, GPU también. Puede haber más. Si la CPU es realmente el cuello de botella, probablemente valga la pena probar cpulimit. (Esta respuesta tiene 7 años, y en ese entonces esos éxitos de rendimiento no estaban en lo más alto de mi mente)
Izkata
Interesante. Tienes razón, no consideré HDD o GPU. Supongo que probar con hardware más lento es la mejor manera de hacerlo, pero por el momento solo tengo una estación de trabajo potente, aunque me gustaría publicar incluso para teléfonos de gama baja (aplicación JS + WebGL).
trusktr
13
  1. Consigue una computadora vieja
  2. Los paquetes de alojamiento VPS tienden a ejecutarse lentamente, tienen muchas interrupciones y latencias muy variables. Cuanto más barato vaya, peor será el hardware. A diferencia del hardware realmente antiguo, es muy probable que contengan conjuntos de instrucciones (SSE4) que normalmente no se encuentran en hardware antiguo. Sin embargo, si desea un sistema que camine lentamente y se cierre con frecuencia, un host VPS barato será el comienzo más rápido.
Mikhail
fuente
3

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 threadotro programa principal .

De esta manera, puede priorizar el mismo código con diferentes prioridades en pocos hilos a la vez y recopilar datos de su análisis. Lo he usado en el desarrollo de juegos para el análisis de procesamiento de cuadros.

Pervez Alam
fuente
2

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

Alper
fuente
2

La forma más sencilla posible de hacerlo sería envolver su código ejecutable principal en un bucle while con un sueño al final.

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.

Kalail
fuente