Come creare un picco della CPU con un comando bash


281

Voglio creare un carico quasi al 100% su una macchina Linux. È un sistema quad core e voglio che tutti i core vadano a tutta velocità. Idealmente, il carico della CPU dovrebbe durare un determinato periodo di tempo e quindi arrestarsi. Spero che ci sia qualche trucco a Bash. Sto pensando a una sorta di ciclo infinito.


Risposte:


283

Puoi anche fare

dd if=/dev/zero of=/dev/null

Per eseguire più di questi per caricare più core, prova a biforcarlo:

fulload() { dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null & }; fulload; read; killall dd

Ripeti il ​​comando tra parentesi graffe quante volte il numero di thread che vuoi produrre (qui 4 thread). Il semplice tasto Invio lo interromperà (assicurati solo che nessun altro dd sia in esecuzione su questo utente o lo uccidi anche tu).


35
dd si occupa più dell'I / O che dell'utilizzo della CPU
Fred,

2
Questo in realtà ha funzionato al meglio per la mia situazione. Funzionava anche in Cygwin. Per qualche ragione, le altre soluzioni non aumenterebbero del tutto la CPU. L'aggiunta di un conteggio e la realizzazione di quattro processi in parallelo ha funzionato perfettamente. Ha aumentato la CPU al 100% nella parte superiore e quindi riportato a zero senza alcun aiuto. Solo quattro righe di codice e un "attesa".
Utente 1

62
Leggere /dev/zeroe scrivere su /dev/nullnon è un ottimo generatore di carico: devi eseguirne molti per generare un carico significativo. Meglio fare qualcosa del genere dd if=/dev/urandom | bzip2 -9 >> /dev/null. /dev/urandomrichiede uno sforzo significativamente maggiore per generare output e bzip2spenderà molto per cercare di comprimerlo, quindi l'utilizzo complessivo della CPU è molto più alto di "riempire un blocco di zeri e poi buttarlo via".
twalberg,

4
Utilizzare jobs -p | xargs killper uccidere solo i processi che hai creato.
Marian,

5
@twalberg, dovresti trasformare il tuo commento in una risposta.
Aaron McDaid il

363

Uso lo stress per questo tipo di cose, puoi dirgli quanti core massimizzare .. consente anche di stressare memoria e disco.

Esempio per sollecitare 2 core per 60 secondi

stress --cpu 2 --timeout 60


6
Su Fedora,sudo yum install stress
Christopher Markieta,

3
Devi fare un EPELrepository per CentOSwget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Satish

4
brew install stresssu OS X. Anche per qualche motivo ho dovuto specificare 8 core su un MBPr quad-core
fregante

1
@ bfred.it I tuoi core possono utilizzare l'hyperthreading, raddoppiando efficacemente la quantità di core (4 fisici e 4 virtuali). Ti consigliamo anche di sottolineare quelli virtuali per un test a pieno carico.
Albero

6
sudo apt-get install stresssu sistemi basati su debian, per completezza. Utilizzato questo per testare una mod di raffreddamento sul kit Intel i7 NUC .
onmylemon,

133

Penso che questo sia più semplice. Apri Terminale e digita quanto segue e premi Invio.

yes > /dev/null &

Per utilizzare pienamente le moderne CPU, una riga non è sufficiente, potrebbe essere necessario ripetere il comando per esaurire tutta la potenza della CPU.

Per finire tutto questo, semplicemente

killall yes

L'idea è stata originariamente trovata qui , sebbene fosse destinata agli utenti Mac, ma dovrebbe funzionare anche per * nix.


7
+1 Funziona come un incantesimo, grazie! Vale la pena aggiungere : questo comando massimizzerà un hyperthread per core CPU. Quindi una CPU dual core (ogni core con 2 thread) otterrà un carico totale del 25% per yescomando (supponendo che il sistema fosse altrimenti inattivo).
GitaarLAB,

Solo per aggiungere a questo, ogni iterazione di questo comando aggiunge un carico del 25 percento sulla CPU (Android) fino a 4 iterazioni e il resto non ha alcun effetto (anche in termini di frequenza di clock).
user3188978

31

Anche se sono in ritardo alla festa, questo post è tra i migliori risultati nella ricerca di Google "genera carico in Linux".

Il risultato contrassegnato come soluzione potrebbe essere utilizzato per generare un carico di sistema, preferisco utilizzare sha1sum /dev/zero per imporre un carico su un core della CPU.

L'idea è di calcolare una somma hash da un flusso di dati infinito (es. / Dev / zero, / dev / urandom, ...) questo processo tenterà di massimizzare un core cpu fino a quando il processo non viene interrotto. Per generare un carico per più core, è possibile eseguire il piping di più comandi insieme.

per esempio. generare un carico di 2 core: sha1sum /dev/zero | sha1sum /dev/zero


Vedendo, questo è meglio di dd per il carico della CPU. Ottengo un carico massimo della cpu del 44% su dd (6 volte) e dell'86% + su sha1sum. Thx ~!
AAI

26

Un core (non invoca il processo esterno):

while true; do true; done

Due core:

while true; do /bin/true; done

Quest'ultimo fa sì che entrambi i miei vadano solo al 50% circa ...

Questo farà andare entrambi al 100%:

while true; do echo; done

su eco, perdiamo l'accesso a linux. come mettere quel 3o comando in background?
AAI

2
Perché l'eco rende tutti i core della CPU al 100%?
Haoyuan Ge,

@HaoyuanGe Tutti i cpus sono al 100% solo quando si fa eco "niente". Sostituisci l'eco do; con do echo "una stringa molto molto lunga"; per vedere <100% sul cpus. Quindi, credo, riecheggiare nulla ha molti meno salti e quindi più codice da eseguire (a causa di mentre è vero;) i core sono ~ 100% occupati
talekeDskobeDa

Se vuoi mantenere un server reattivo mentre esegui un test del genere, fallo in una shell separata (un'altra finestra tmux / screen, o sessione ssh), e prima rinnova quella shell, ad esempio in bash: renice 19 -p $$ . Massimerà comunque le CPU, ma non interferirà con altri processi.
Walf

23

Per caricare 3 core per 5 secondi:

seq 3 | xargs -P0 -n1 timeout 5 yes > /dev/null

Ciò comporta un carico elevato del kernel (sys) dalle numerose chiamate di sistema write ().

Se si preferisce il caricamento della cpu prevalentemente userland:

seq 3 | xargs -P0 -n1 timeout 5 md5sum /dev/zero

Se vuoi solo che il caricamento continui fino a quando premi Ctrl-C:

seq 3 | xargs -P0 -n1 md5sum /dev/zero

1
È possibile da tinycore? xargs: opzione non valida - 'P'
conman253

bella opzione nativa
iscriviti

18

Ecco un programma che puoi scaricare qui

Installa facilmente sul tuo sistema Linux

./configure
make
make install

e avviarlo in una semplice riga di comando

stress -c 40

stressare tutte le tue CPU (comunque tu abbia) con 40 thread ciascuno con un complesso sqrt calcolo su numeri generati ramdomly.

È anche possibile definire il timeout del programma

stress -c 40 -timeout 10s

a differenza della soluzione proposta con il ddcomando, che si occupa essenzialmente di IOe quindi non sovraccarica il sistema perché si lavora con i dati.

Il programma di stress sovraccarica davvero il sistema perché ha a che fare con il calcolo.


4
C'è già una risposta sopra per il stresscomando. Come dice questa risposta, puoi semplicemente installarlo tramite yum / apt / etc.
Asfand Qazi,

1
Sito web non in buone condizioni (503 proibito) ma disponibile sui
repository

11
:(){ :|:& };:

Questa bomba a forcella causerà il caos alla CPU e probabilmente farà schiantare il computer.


13
Aiuterà se renderò più semplice la lettura di fork_bomb () {fork_bomb | fork_bomb &}; forkbomb
Jeff Goldstein,

17
Quello fallisce sul criterio "ultimo un determinato periodo di tempo e poi stop";)
Marian,

14
sembra un mucchio di faccine.
Ponkadoodle,

2
Questa bomba a forcella ha rotto il mio computer, ho dovuto fare un duro ciclo di accensione.
Elijah Lynn,

2
Da: cyberciti.biz/faq/understanding-bash-fork-bomb ATTENZIONE! Questi esempi potrebbero causare l'arresto anomalo del computer se eseguito. "Una volta che una bomba a forcella è stata attivata con successo in un sistema, potrebbe non essere possibile riprendere il normale funzionamento senza riavviare il sistema poiché l'unica soluzione a una bomba a forcella è quella di distruggere tutte le istanze di essa."
Elijah Lynn,

11

Un ciclo infinito è anche l'idea che ho avuto. Un aspetto bizzarro è:

while :; do :; done

( :è uguale a true, non fa nulla ed esce con zero)

Puoi chiamarlo in una subshell ed eseguire in background. In questo modo i $num_corestempi dovrebbero essere sufficienti. Dopo aver dormito il tempo desiderato da poterli uccidere tutti, si ottiene il PID con jobs -p(suggerimento: xargs)


10

Dividerei la cosa in 2 script:

infinite_loop.bash:

#!/bin/bash
while [ 1 ] ; do
    # Force some computation even if it is useless to actually work the CPU
    echo $((13**99)) 1>/dev/null 2>&1
done

cpu_spike.bash:

#!/bin/bash
# Either use environment variables for NUM_CPU and DURATION, or define them here
for i in `seq ${NUM_CPU}` : do
    # Put an infinite loop on each CPU
    infinite_loop.bash &
done

# Wait DURATION seconds then stop the loops and quit
sleep ${DURATION}
killall infinite_loop.bash


4
#!/bin/bash
duration=120    # seconds
instances=4     # cpus
endtime=$(($(date +%s) + $duration))
for ((i=0; i<instances; i++))
do
    while (($(date +%s) < $endtime)); do :; done &
done

4

Ho usato bc( calcolatrice binaria ), chiedendo loro di PI con un sacco di decimali.

$ for ((i=0;i<$NUMCPU;i++));do
    echo 'scale=100000;pi=4*a(1);0' | bc -l &
    done ;\
    sleep 4; \
    killall bc

con NUMCPU (sotto Linux):

$ NUMCPU=$(grep $'^processor\t*:' /proc/cpuinfo |wc -l)

Questo metodo è efficace ma sembra amichevole per il sistema , poiché non ho mai avuto un crash con un sistema che lo utilizzava.


3
#!/bin/bash
while [ 1 ]
do
        #Your code goes here
done

1
Eh, no. Dormire non è quel tipo di compito che mette un sacco di fatiche sulla CPU:-)
Marian,

2

Sono andato su Internet per trovare qualcosa del genere e ho trovato questo script di cpu hammer molto utile.

#!/bin/sh

# unixfoo.blogspot.com

if [ $1 ]; then
    NUM_PROC=$1
else
    NUM_PROC=10
fi

for i in `seq 0 $((NUM_PROC-1))`; do
    awk 'BEGIN {for(i=0;i<10000;i++)for(j=0;j<10000;j++);}' &
done

Deve davvero essere così lungo? Mi piace il one-liner migliore per questo tipo di attività ...
Nikana Reklawyks,

1
La clausola if-then-else può essere sostituito da: NUM_PROC=${1:-10}.
Thor,

2

Usando gli esempi citati qui, ma anche l'aiuto di IRC, ho sviluppato il mio script di stress test della CPU. Usa una subshell per thread e la tecnica loop infinita. Puoi anche specificare il numero di thread e la quantità di tempo in modo interattivo.

#!/bin/bash
# Simple CPU stress test script

# Read the user's input
echo -n "Number of CPU threads to test: "
read cpu_threads
echo -n "Duration of the test (in seconds): "
read cpu_time

# Run an endless loop on each thread to generate 100% CPU
echo -e "\E[32mStressing ${cpu_threads} threads for ${cpu_time} seconds...\E[37m"
for i in $(seq ${cpu_threads}); do
    let thread=${i}-1
    (taskset -cp ${thread} $BASHPID; while true; do true; done) &
done

# Once the time runs out, kill all of the loops
sleep ${cpu_time}
echo -e "\E[32mStressing complete.\E[37m"
kill 0

errore "riga 14: tasket: comando non trovato" nel tuo script! qualche idea?
user2912312

2

Utilizzando qui le idee, il codice creato che esce automaticamente dopo una durata prestabilita, non è necessario interrompere i processi -

#!/bin/bash
echo "Usage : ./killproc_ds.sh 6 60  (6 threads for 60 secs)"

# Define variables
NUM_PROCS=${1:-6} #How much scaling you want to do
duration=${2:-20}    # seconds

function infinite_loop {
endtime=$(($(date +%s) + $duration))
while (($(date +%s) < $endtime)); do
    #echo $(date +%s)
    echo $((13**99)) 1>/dev/null 2>&1
    $(dd if=/dev/urandom count=10000 status=none| bzip2 -9 >> /dev/null) 2>&1 >&/dev/null
done
echo "Done Stressing the system - for thread $1"
}


echo Running for duration $duration secs, spawning $NUM_PROCS threads in background
for i in `seq ${NUM_PROCS}` ;
do
# Put an infinite loop
    infinite_loop $i  &
done

1

Questo fa un trucco per me:

bash -c 'for (( I=100000000000000000000 ; I>=0 ; I++ )) ; do echo $(( I+I*I )) & echo $(( I*I-I )) & echo $(( I-I*I*I )) & echo $(( I+I*I*I )) ; done' &>/dev/null

e non usa altro che bash.


1

Per migliorare la risposta di Dimba e fornire qualcosa di più collegabile (perché avevo bisogno di qualcosa di simile). Ho scritto quanto segue usando il concetto di caricamento di dd: D

Controllerà i core attuali e creerà molti thread dd. Avvia e termina il carico principale con Invio

#!/bin/bash

load_dd() {
    dd if=/dev/zero of=/dev/null
}

fulload() {
    unset LOAD_ME_UP_SCOTTY
    export cores="$(grep proc /proc/cpuinfo -c)"
    for i in $( seq 1 $( expr $cores - 1 ) )
      do
    export LOAD_ME_UP_SCOTTY="${LOAD_ME_UP_SCOTTY}$(echo 'load_dd | ')"
  done
        export LOAD_ME_UP_SCOTTY="${LOAD_ME_UP_SCOTTY}$(echo 'load_dd &')"
    eval ${LOAD_ME_UP_SCOTTY}
}

echo press return to begin and stop fullload of cores
  read
  fulload
  read
  killall -9 dd

0

Ho combinato alcune delle risposte e aggiunto un modo per ridimensionare lo stress a tutti i cpus disponibili:

#!/bin/bash

function infinite_loop { 
    while [ 1 ] ; do
        # Force some computation even if it is useless to actually work the CPU
        echo $((13**99)) 1>/dev/null 2>&1
    done
}

# Either use environment variables for DURATION, or define them here
NUM_CPU=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
PIDS=()
for i in `seq ${NUM_CPU}` ;
do
# Put an infinite loop on each CPU
    infinite_loop &
    PIDS+=("$!")
done

# Wait DURATION seconds then stop the loops and quit
sleep ${DURATION}

# Parent kills its children 
for pid in "${PIDS[@]}"
do
    kill $pid
done

0

Dimba's dd if=/dev/zero of=/dev/nullè sicuramente corretto, ma vale anche la pena ricordare che è stato verificato un maxing della CPU al 100% di utilizzo. Puoi farlo con

ps -axro pcpu | awk '{sum+=$1} END {print sum}'

Ciò richiede l'output ps di una media di 1 minuto dell'utilizzo della cpu da parte di ciascun processo, quindi li somma con awk. Sebbene sia una media di 1 minuto, ps è abbastanza intelligente da sapere se un processo dura solo pochi secondi e regola di conseguenza la finestra temporale. Quindi puoi usare questo comando per vedere immediatamente il risultato.


0

aumentare il carico o consumare la CPU al 100%

sha1sum /dev/zero &

allora puoi vedere gli usi della CPU digitando command

top

per rilasciare il carico

killall sha1sum

-1

Basta incollare questo cattivo ragazzo in SSH o console di qualsiasi server che esegue Linux. Puoi terminare i processi manualmente, ma ho appena chiuso il server più velocemente.

Modifica: ho aggiornato questo script per avere ora una funzione timer in modo che non sia necessario interrompere i processi.

read -p "Please enter the number of minutes for test >" MINTEST && [[ $MINTEST == ?(-)+([0-9]) ]]; NCPU="$(grep -c ^processor /proc/cpuinfo)";  ((endtime=$(date +%s) + ($MINTEST*60))); NCPU=$((NCPU-1)); for ((i=1; i<=$NCPU; i++)); do while (($(date +%s) < $endtime)); do : ; done & done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.