Pregunta ¿Cómo puedo producir una alta carga de CPU en un servidor Linux?


Actualmente estoy en el proceso de depurando una instalación de Cacti y quiero crear carga de CPU para depurar mis gráficos de utilización de CPU.

Intenté simplemente correr cat /dev/zero > /dev/null, que funciona muy bien pero solo utiliza 1 núcleo:

enter image description here

¿Hay algún método mejor para probar / maximizar los recursos del sistema bajo carga?

Relacionado: ¿Cómo puedo producir una alta carga de CPU en Windows?


138


origen


es posible ejecutar múltiples instancias de cat ¿simultaneamente? - Nate Koppenhaver
@NateKoppenhaver: Sí, parece ser posible cuando los envuelve en screen sesiones Pero preferiría una solución más sofisticada si es posible. - Der Hochstapler
Heh, siempre he usado cat /dev/random > /dev/null. Adivinar /dev/zero funciona también :-) - oKtosiTe
@oKtosiTe cat / dev / random tiene el efecto secundario de agotar la entropía en / dev / random. Hay veces que necesitas conservar la entropía, no tendría esto como mi ir a la CPU cerdo. - Rich Homolka
@oKtosiTe Lo que dijo Rich Homolka es correcto, pero no es solo que sea algo malo, también es inútil porque se bloqueará casi de inmediato y dejará de consumir la CPU. - Luc


Respuestas:


Tratar stress Es prácticamente equivalente a Windows consume.exe:

oliver$ ./stress --cpu 3
stress: info: [18472] dispatching hogs: 3 cpu, 0 io, 0 vm, 0 hdd

158



en ubuntu, puedes instalar con sudo apt-get install stress - ben
en Debian wheezy también. - enapupe
En Fedora, sudo yum install stress - Christopher Markieta
Arco: sudo pacman -S stress - das_j
brew install stress en OS X - Christian Long


No es necesario instalar ningún paquete adicional, su caparazón viejo puede hacerlo solo.

Este one-liner cargará tus cuatro núcleos al 100%:

for i in 1 2 3 4; do while : ; do : ; done & done

Cómo funciona es bastante simple, comienza cuatro bucles sin fin. Cada uno de ellos repite la instrucción nula (:) Cada bucle puede cargar un núcleo de CPU al 100%.

Si utiliza bash, ksh93 y otras conchas que admiten rangos, (es decir, no dash o mayor ksh), puede usar esta sintaxis no portátil:

for i in {1..4}; do ...

Reemplazar 4 con la cantidad de CPU que desea cargar si es diferente de 4.

Suponiendo que ya no ejecutaba ningún trabajo en segundo plano cuando lanzó uno de estos bucles, puede detener la generación de carga con ese comando:

for i in 1 2 3 4; do kill %$i; done

Respondiendo @ underscore_d's comment, aquí hay una versión mejorada que simplifica mucho la detención de la carga y que también permite especificar un tiempo de espera (por defecto 60 segundos). Controlar-do matará todos los bucles fuera de control también. Esta función de shell funciona al menos bajo bash y ksh.

# Usage: lc [number_of_cpus_to_load [number_of_seconds] ]
lc() {
  (
    pids=""
    cpus=${1:-1}
    seconds=${2:-60}
    echo loading $cpus CPUs for $seconds seconds
    trap 'for p in $pids; do kill $p; done' 0
    for ((i=0;i<cpus;i++)); do while : ; do : ; done & pids="$pids $!"; done
    sleep $seconds
  )
}

82



Gracias pero & hace que un comando se ejecute de forma separada hilo o separado núcleo? Estoy confundido. - mmdemirbas
@mmdemirbas: El signo comercial hace que el comando se ejecute como un proceso separado. El planificador está distribuyendo todos los procesos activos a todos los núcleos disponibles. - jlliagre
Como recordatorio, puede detener esta prueba emitiendo killall bash - solo asegúrate de no tener ninguna otra secuencia de comandos importante ejecutándose en ese momento. - a coder
@acoder Gracias por sugerir una forma de terminar el ciclo. Sin embargo, evitaría killall bash. Respuesta editada para agregar un método más seguro para finalizar la generación de carga. - jlliagre
o simplemente terminar con ellos fg ctrl + c, 4 veces. - Blauhirn


Hice un script de python simple que hace lo mismo. Puede controlar la cantidad de núcleos de CPU que desea cargar. Lo bueno de esto es que no consumirá ningún otro recurso además de la CPU. (Creo que la idea de Mark Johnson sería consumir una gran cantidad de recursos de E / S, lo que no se desea aquí).

from multiprocessing import Pool

def f(x):
    # Put any cpu (only) consuming operation here. I have given 1 below -
    while True:
        x * x

# decide how many cpus you need to load with.
no_of_cpu_to_be_consumed = 3

p = Pool(processes=no_of_cpu_to_be_consumed)
p.map(f, range(no_of_cpu_to_be_consumed))

Simplemente ejecuta este script desde la terminal $ python temp1.py. Necesitas matar el script cuando hayas terminado.

Aquí está mi salida de consumo de CPU cuando cargo 3 de mis núcleos.

Script temp1.py creates three processes (PIDs - 9377, 9378, 9379) which load 3 of my cores


18



¿Qué programa usaste para mostrar el uso de la CPU de esta manera? Me recuerda a la parte superior, pero no recuerdo los 'cuadros' de la CPU. - jftuga
@jftuga probablemente htop, parte superiores el hermano más guapo. - BoppreH
sí es htop. Mejor visor de procesos interactivos en tiempo real para Linux - htop.sourceforge.net - Pushpak Dagade
No estaba prestando atención y lo ejecuté en una caja de Windows. Cosas muy malas ... - Derrick


Una manera alternativa sería

openssl speed -multi $(grep -ci processor /proc/cpuinfo)

o (si nproc está presente)

openssl speed -multi $(nproc --all)

OpenSSL casi siempre está presente en las distribuciones actuales, por lo que no se necesitan paquetes adicionales.


12





Comience dos

sha1sum /dev/zero &

comandos para cada núcleo en su sistema.

Para detener

killall sha1sum

o

kill sha1sum

8





Suelo tomar la suite cpuburn:

sudo apt-get install cpuburn
for i in {1..4}; do burnK7 & done

Reemplace 4 con la cantidad de núcleos / hilos HT que tiene o desea enfatizar.

Nota: Esto estresa la mayor cantidad de área posible al mismo tiempo, está programado para generar la máxima disipación de potencia. Tuve que escribir esta publicación por segunda vez, de alguna manera mi máquina no me gustó :-(

También puedes hacer cpuburn en secuencias:

burnP6 & burnP6 & burnP6 & burnP6 & 
[1] 28520
[2] 28521
[3] 28522
[4] 28523

Y cuando quieras detenerlos:

killall burnP6

También podrías multiplicar burnP6 & para que coincida con la cantidad de núcleos de CPU en su sistema.


7





He estado desarrollando stress-ng, una herramienta de estrés actualizada que puede enfatizar una amplia gama de aspectos de un sistema Linux. Para más información, ver http://kernel.ubuntu.com/~cking/stress-ng/

El uso es similar a estrés

$ stress-ng --cpu 4 --vm 2 --fork 8 --switch 4 --timeout 1m
stress-ng: info:  [32254] dispatching hogs: 4 cpu, 8 fork, 4 switch, 2 vm
stress-ng: info:  [32254] cache allocate: default cache size: 8192K

Instalar con

sudo apt-get install stress-ng

5



Por favor lee ¿Cómo recomiendo el software? para algunos consejos sobre cómo debe recomendar el software. Por lo menos, debe proporcionar más que solo / al menos un enlace, por ejemplo, información adicional sobre el software en sí, y cómo se puede utilizar para resolver el problema en la pregunta. - DavidPostill♦


Puede ejecutar ese comando tantas veces como desee, y ocupará un núcleo diferente cada vez:

$ CORES=1
$ for i in `seq 1 $CORES`; do cat /dev/zero > /dev/null &
> done
[1] 8388

2



¿No haría eso terminar los procesos un poco molestos? - oKtosiTe
killall cat Deberías hacerlo. - Christian Mann
Dependiendo de si tienes otra cat procesos en ejecución (normalmente lo hago). - oKtosiTe


https://github.com/GaetanoCarlucci/CPULoadGenerator

solución bastante simple y científica.

Aquí puede ver un ejemplo de dinámica en el que se genera una carga del 50% en el núcleo 0 de la CPU:

enter image description here

Puede ejecutar el proceso en otros núcleos al mismo tiempo.


2