Reduzca la velocidad de un solo proceso para regular la temperatura de la CPU

9
  1. Tengo un programa Cuando se está ejecutando, la temperatura de la CPU aumenta de 50 a 80 Celcius, que es mi mayor preocupación.

    Puedo controlar la frecuencia de la CPU para ralentizarla, pero otros procesos también se ralentizarán, lo que no quiero.

    ¿Es posible ralentizar un proceso en particular sin afectar otros procesos para mantener fría la CPU?

    Mi sistema operativo es Ubuntu 10.10.

  2. Traté de establecer la prioridad del proceso nice -n 15 myprogramy no estoy seguro de si funcionará. La CPU tiene 77 Celcius de altura.

    ¿ niceSolo establece la prioridad relativa de un proceso con otros procesos? Es decir, si otros procesos no se están ejecutando, ¿este rápido proceso se ejecutará rápidamente? Me gustaría configurar el proceso para que se ejecute lentamente todo el tiempo.

Tim
fuente
1
¿Qué hace este proceso: entrada / salida pesada? ¿Cálculos pesados ​​en la CPU principal? ¿Cálculos pesados ​​en la GPU (tarjeta de video) (generalmente pero no limitado a programas que calculan imágenes)?
Gilles 'SO- deja de ser malvado'
El programa es pdf2djvu, que convierte un archivo pdf a djvu. ¿Es pesado IO o CPU pesado o GPU pesado? ¿Tiene diferentes formas para diferentes casos?
Tim
44
80º es muy muy alto. Vivo en un lugar cálido de España y la temperatura máxima de mi procesador es de ~ 60º. Abra la computadora, limpie todas las piezas y cambie los refrigeradores. Creo que tu no es el uso de la CPU.
Rufo El Magufo
Intenta hacer ambas cosas.
stribika
80 ° es realmente alto, pero no se considera extremo dependiendo del modelo de CPU. la mayoría de la CPU admite hasta 90 ° C sin problemas
Kiwy

Respuestas:

16

CPULimit es exactamente lo que necesitas. Inicia el programa, luego ejecuta cpulimit contra el nombre del programa o PID, especificando qué porcentaje desea que esté limitado.

El siguiente comando limita el proceso en PID 7777 al 5% de uso de CPU.

cpulimit -p 7777 -l 5

Alternativamente, puede usar el nombre del ejecutable:

cpulimit -e myprogram -l 5

O la ruta absoluta del ejecutable:

cpulimit -P /path/to/myprogram -l 5

Tenga en cuenta que el porcentaje es de todos los núcleos; así que si tienes 4 núcleos, podrías usar el 400%.

sombreador
fuente
1
¡Gracias! (1) ¿CPULimit solo se usa para el proceso que ya se está ejecutando? ¿No se utiliza al enviar un programa para ejecutar? (2) ¿fija el porcentaje de uso de la CPU por un proceso, o establece el límite superior para el proceso y permite que su uso fluctúe entre 0 y ese límite de acuerdo con otros procesos? (3) También descubrí que después de usar CPULimit en un proceso, no hay forma de que Ctrl + C cancele la ejecución, porque pronto volverá a ejecutarse automáticamente. ¿Preguntarse por qué?
Tim
2
Una pequeña advertencia sobre CPULimit: utiliza SIGSTOP / SIGCONT para limitar la cantidad de tiempo de CPU utilizado por un proceso (los procesos que exceden el uso de CPU objetivo se detienen; cuando ha pasado suficiente tiempo, el proceso se envía un SIGCONT y reanuda la ejecución). Sin embargo, hay casos raros en los que las señales pueden interferir con las llamadas al sistema; consulte el manual de la biblioteca GNU C para obtener más información. Como CPULimit envía estas señales muchas veces por segundo, existe una gran posibilidad de interrupción. No es un gran problema para ejecutar pdftk en un escritorio, aunque.
Riccardo Murri
8

Puede cambiar el tamaño de un proceso en ejecución para darle más o menos prioridad (el llamado "buen valor"). Tenga en cuenta que la escala de prioridad de UNIX es algo contraintuitiva: los valores negativos significan que un proceso se ve favorecido sobre los procesos concurrentes, es decir, tiene "más" prioridad.

Por lo tanto, puede intentar "ralentizar" su proceso dado su PID a través de:

# lower priority of a process
renice +1 "PID"

Cada vez que ejecuta esto, el proceso "buen valor" aumenta en 1; puede usar valores enteros que no sean, +1por supuesto.

El comando nice le permite iniciar un proceso con un ajuste de valor agradable +10 (cambie esto con la opción -n). Por ejemplo:

# start a CPU-intensive task with low priority
nice ./cpu-hog

Sin embargo, el "buen valor" solo afecta cuánto favorece el programador ejecutar un proceso particular sobre otros en el sistema: si su computadora está básicamente inactiva, elevar el "buen valor" de un solo proceso no impedirá que ese proceso tome el 100% UPC. Cito de la página de manual de getpriority (2) : (Énfasis agregado por mí).

El grado en que su valor relativo relativo afecta la programación de procesos varía entre sistemas Unix y, en Linux, entre versiones de kernel. Comenzando con el kernel 2.6.23, Linux adoptó un algoritmo que causa que las diferencias relativas en valores agradables tengan un efecto mucho más fuerte. Esto hace que los valores agradables muy bajos (+19) realmente proporcionen poca CPU a un proceso siempre que haya otra carga de prioridad más alta en el sistema.

La razón de esto reside en la forma en que los procesos se ejecutan en un kernel tipo UNIX: cada vez que el kernel decide ejecutar un proceso, ese proceso tiene el control total de un núcleo de CPU durante un período de tiempo determinado (fijo y corto). El "buen valor" puede influir en la frecuencia con la que el planificador del núcleo está dispuesto a asignar un intervalo de tiempo a un proceso, pero no puede cambiar el hecho de que, una vez programado, un proceso se ejecuta sin interrupciones durante un período fijo de tiempo.

Por lo tanto, a menos de ralentizar su CPU, no hay forma de hacer que un proceso se ejecute más lentamente si no hay otros procesos en el sistema que puedan competir por el acceso de la CPU.

Riccardo Murri
fuente
¡Gracias! ¿Es posible hacer que un proceso se ejecute lentamente desde el principio hasta el final, independientemente de otros procesos?
Tim
@Tim No creo que lo que pidas sea posible; He actualizado la respuesta con más detalles. Espero que eso lo aclare más.
Riccardo Murri
1
La otra respuesta sugirió CPULimit, que parece hacer lo imposible.
Tim
Ah, no sabía sobre CPULimit, definitivamente llena un vacío en mi conjunto de herramientas UNIX.
Riccardo Murri
niceno hará nada para mantener fresco tu procesador. No está diseñado para funcionar así.
Ken Sharp
4

Los cgroups se crearon exactamente por este motivo.

http://www.kernel.org/doc/Documentation/cgroups/ http://www.serverwatch.com/tutorials/article.php/3921001/Setting-Up-Linux-Cgroups.htm

Se necesita un poco de tiempo para familiarizarse con ellos, y creo que necesita acceso root para configurarlos, pero todo puede ser programado. Los nuevos Ubuntus tienen un archivo .conf para que no tenga que escribir su propio script. No estoy seguro acerca de 10.10.

Un buen lugar para comenzar es en esta respuesta: https://askubuntu.com/a/94743/170177

Tenga en cuenta que cgroups todavía está en desarrollo activo, por lo que algunas características pueden no estar disponibles en su núcleo actual.

Usar cpu.shares de cgroups no hace nada que un buen valor no haría. Parece que realmente quiere acelerar los procesos, lo que definitivamente se puede hacer.

Necesitará usar un script o dos, y / o editar /etc/cgconfig.conf para definir los parámetros que desea.

Específicamente, desea editar los valores cpu.cfs_period_us y cpu.cfs_quota_us . El proceso podrá ejecutarse para cpu.cfs_quota_us microsegundos por cpu.cfs_period_us microsegundos.

Por ejemplo:

Si cpu.cfs_period_us = 50000 y cpu.cfs_quota_us = 10000 , el proceso recibirá el 20% del tiempo máximo de CPU, sin importar qué más esté sucediendo.

En esta captura de pantalla le he dado al proceso el 2% del tiempo de CPU:

2% de tiempo de CPU

En lo que respecta al proceso, se está ejecutando al 100%.

La configuración cpu.shares, por otro lado, puede y seguirá utilizando el 100% del tiempo de inactividad de la CPU.

En este ejemplo similar, he dado el proceso cpu.shares = 100 (de 1024):

cpu.shares

Como puede ver, el proceso todavía consume todo el tiempo de inactividad de la CPU.

Referencias

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups .html

Ken Sharp
fuente
Nota: systemdhace las cosas un poco diferentes. Ubuntu Trusty, por ejemplo, parece venir con dos servicios para administrar cgroups. Actualizaré cuando sepa más.
Ken Sharp
Pero puede cambiar el% máximo de CPU cuando el proceso ya se inició, como renice?
Marco Sulla
reniceno cambia la cantidad de CPU utilizada, solo cambia la prioridad del proceso en el planificador. cgroups puede cambiar el límite de la CPU en cualquier momento. Desde que se publicó esta respuesta, cgroups ha agregado todo tipo de ajustes y es muy poderoso.
Ken Sharp
renice does not change the amount of CPU usesLo sé;) Acabo de publicar como un ejemplo de un programa que cambia las cosas en tiempo de ejecución. Gracias por su respuesta, intentaré cgroups.
Marco Sulla