Frage Wie kann ich eine hohe CPU-Last auf einem Linux-Server erzeugen?


Ich bin gerade dabei Debug einer Cacti-Installation und möchte CPU-Last erzeugen, um meine CPU-Auslastung zu debuggen.

Ich versuchte einfach zu rennen cat /dev/zero > /dev/null, die gut funktioniert, aber nur 1 Kern verwendet:

enter image description here

Gibt es eine bessere Methode zum Testen / Ausschließen von Systemressourcen unter Last?

Verbunden: Wie kann ich unter Windows eine hohe CPU-Last erzeugen?


138
2018-06-30 17:13


Ursprung


ist es möglich, mehrere Instanzen von cat gleichzeitig? - Nate Koppenhaver
@NateKoppenhaver: Ja, das scheint möglich zu sein, wenn man sie einpackt screen Sitzungen. Aber ich würde lieber eine anspruchsvollere Lösung bevorzugen. - Der Hochstapler
Heh, ich habe immer gebraucht cat /dev/random > /dev/null. Vermuten /dev/zero funktioniert auch. :-) - oKtosiTe
@oKtosiTe cat / dev / random hat den Nebeneffekt, die Entropie in / dev / random zu reduzieren. Es gibt Zeiten, in denen du Entropie bewahren musst, ich würde das nicht haben, weil ich zum CPU-Schwein gehe. - Rich Homolka
@oKtosiTe Was Rich Homolka sagte, ist richtig, aber es ist nicht nur, dass es eine schlechte Sache zu tun ist, es ist auch nutzlos, weil es fast sofort blockiert und aufhören wird, CPU zu verbrauchen. - Luc


Antworten:


Versuchen stress Es ist so ziemlich das Äquivalent von Windows consume.exe:

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

158
2018-06-30 17:27



auf Ubuntu können Sie mit installieren sudo apt-get install stress - ben
auf Debian Wheezy auch. - enapupe
Auf Fedora, sudo yum install stress - Christopher Markieta
Bogen: sudo pacman -S stress - das_j
brew install stress auf OS X - Christian Long


Keine Notwendigkeit, irgendein Extrapaket zu installieren, Ihre gute alte Schale ist in der Lage, es alleine zu tun.

Dieser Einzeiler lädt Ihre vier Kerne zu 100%:

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

Wie es funktioniert, ist ziemlich einfach, es beginnt vier endlose Schleifen. Jeder von ihnen wiederholt die Null-Anweisung (:). Jede Schleife kann einen CPU-Kern zu 100% laden.

Wenn du benutzt bash, ksh93 und andere Schalen, die Bereiche unterstützen (d. h. nicht dash oder älter ksh), können Sie diese nicht portable Syntax verwenden:

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

Ersetzen 4 mit der Anzahl der CPUs, die Sie laden möchten, wenn sie nicht übereinstimmen 4.

Angenommen, Sie hatten bereits einen Hintergrundjob ausgeführt, als Sie eine dieser Schleifen gestartet haben, können Sie die Ladegenerierung mit diesem Befehl stoppen:

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

Mit dem Kommentar von @ subscore_d gibt es hier eine erweiterte Version, die das Beenden des Ladevorgangs erheblich vereinfacht und außerdem das Festlegen eines Zeitlimits ermöglicht (standardmäßig 60 Sekunden) Steuerung-C wird alle außer Kontrolle geratenen Schleifen auch töten. Diese Shell-Funktion funktioniert zumindest unter bash und 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
2017-07-01 14:55



Danke aber & bewirkt, dass ein Befehl in einem separaten Befehl ausgeführt wird Faden oder trennen Ader? Ich bin verwirrt. - mmdemirbas
@mmdemirbas: Das Und-Zeichen bewirkt, dass der Befehl als separater Prozess ausgeführt wird. Der Scheduler sendet dann alle aktiven Prozesse an alle verfügbaren Kerne. - jlliagre
Zur Erinnerung können Sie diesen Test durch Ausstellen stoppen killall bash - Achte nur darauf, dass zu diesem Zeitpunkt kein anderes wichtiges Skript läuft. - a coder
Danke, dass Sie einen Weg vorgeschlagen haben, die Schleife zu beenden. Ich würde es jedoch vermeiden killall bash. Antwort bearbeitet, um eine sicherere Methode zum Beenden der Ladegenerierung hinzuzufügen. - jlliagre
oder beende sie einfach mit fg Strg + C, 4 mal. - Blauhirn


Ich habe ein einfaches Python-Skript erstellt, das dasselbe tut. Sie können die Anzahl der CPU-Kerne steuern, die Sie laden möchten. Das Gute daran ist, dass es außer der CPU keine andere Ressource verbraucht. (Ich denke, dass die Idee von Mark Johnson viel E / A-Ressourcen verbrauchen würde, was hier unerwünscht ist.)

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))

Führen Sie dieses Skript einfach über das Terminal aus $ python temp1.py. Sie müssen das Skript beenden, wenn Sie fertig sind.

Hier ist meine CPU-Ausgabe, wenn ich 3 meiner Kerne lade.

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


18
2018-06-30 17:56



Mit welchem ​​Programm verwendest du die CPU-Auslastung? Es erinnert mich an Spitze, aber ich erinnere mich nicht an die CPU-Charts. - jftuga
@ Jftuga wahrscheinlich htop, oben's hübscher Bruder. - BoppreH
Ja, es ist htop. Bester Echtzeit, farbenfroher interaktiver Prozess-Viewer für Linux - htop.sourceforge.net - Pushpak Dagade
Hab nicht aufgepasst und das auf einer Windows-Box ausgeführt. Sehr schlechte Dinge ... - Derrick


Ein alternativer Weg wäre

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

oder (wenn nproc vorhanden ist)

openssl speed -multi $(nproc --all)

OpenSSL ist fast immer in heutigen Distributionen vorhanden, so dass keine zusätzlichen Pakete benötigt werden.


12
2017-09-08 11:19





Beginne zwei

sha1sum /dev/zero &

Befehle für jeden Kern in Ihrem System.

Stoppen

killall sha1sum

oder

kill sha1sum

8
2017-11-01 21:31





Normalerweise nehme ich die Cuburn-Suite:

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

Ersetzen Sie 4 durch die Anzahl der Kerne / HT-Threads, die Sie haben oder betonen möchten.

Hinweis: Dies beansprucht so viel Chipfläche wie möglich gleichzeitig, es ist programmiert, um maximale Verlustleistung zu erzeugen. Ich musste diesen Beitrag ein zweites Mal schreiben, irgendwie hat es meiner Maschine nicht gefallen :-(

Sie könnten auch in Sequenzen cpuburn:

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

Und wenn du sie aufhalten willst:

killall burnP6

Du könntest auch multiplizieren burnP6 & um die Anzahl der CPU-Kerne in Ihrem System zu erreichen.


7
2017-07-25 21:33





Ich habe Stress-ng entwickelt, ein aktualisiertes Stress-Tool, das eine Vielzahl von Aspekten eines Linux-Systems hervorheben kann. Weitere Informationen finden Sie unter http://kernel.ubuntu.com/~cking/stress-ng/

Die Verwendung ist ähnlich wie Stress

$ 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

Installieren mit

sudo apt-get install stress-ng

5
2017-09-06 20:11



Bitte lesen Sie Wie empfehle ich Software? für einige Tipps, wie Sie über die Empfehlung von Software gehen sollten. Zumindest sollten Sie mehr als nur / mindestens einen Link angeben, zum Beispiel einige zusätzliche Informationen über die Software selbst, und wie sie verwendet werden können, um das Problem in der Frage zu lösen. - DavidPostill♦


Sie können diesen Befehl so oft ausführen, wie Sie möchten, und jedes Mal wird ein anderer Kern verwendet:

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

2
2017-07-01 02:09



Wäre das nicht ein Grund, die Prozesse zu beenden? - oKtosiTe
killall cat Sollte es tun. - Christian Mann
Je nachdem, ob Sie andere haben cat Prozesse laufen (normalerweise). - oKtosiTe