Question Comment puis-je générer une charge CPU élevée sur un serveur Linux?


Je suis en train de débogage d'une installation Cacti et que vous voulez créer une charge CPU pour déboguer mes graphiques d'utilisation du processeur.

J'ai essayé de courir simplement cat /dev/zero > /dev/null, qui fonctionne très bien mais utilise seulement 1 noyau:

enter image description here

Existe-t-il une meilleure méthode pour tester / optimiser les ressources système sous charge?

En relation: Comment puis-je générer une charge CPU élevée sous Windows?


138
2018-06-30 17:13


origine


est-il possible d'exécuter plusieurs instances de cat simultanément? - Nate Koppenhaver
@NateKoppenhaver: Oui, cela semble être possible en les enveloppant screen sessions. Mais je préférerais une solution plus sophistiquée si possible. - Der Hochstapler
Heh, j'ai toujours utilisé cat /dev/random > /dev/null. Deviner /dev/zero travaille aussi :-) - oKtosiTe
@oKtosiTe cat / dev / random a pour effet secondaire de réduire l'entropie dans / dev / random. Il y a des moments où vous devez conserver l'entropie. - Rich Homolka
@oKtosiTe Ce que Rich Homolka a dit est juste, mais ce n'est pas seulement une mauvaise chose à faire, il est également inutile car il va bloquer presque immédiatement et cesser de consommer des processeurs. - Luc


Réponses:


Essayer stress C'est à peu près l'équivalent de 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



sur Ubuntu, vous pouvez installer avec sudo apt-get install stress - ben
sur Debian Wheezy aussi. - enapupe
Sur Fedora, sudo yum install stress - Christopher Markieta
Cambre: sudo pacman -S stress - das_j
brew install stress sur OS X - Christian Long


Pas besoin d'installer un paquet supplémentaire, votre bon vieux shell est capable de le faire seul.

Ce one-liner chargera vos quatre cœurs à 100%:

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

Comment cela fonctionne est assez simple, il commence quatre boucles sans fin. Chacun d'eux répète l'instruction null (:). Chaque boucle est capable de charger un cœur de processeur à 100%.

Si tu utilises bash, ksh93 et d'autres gammes soutenant les gammes, (c'est-à-dire pas dash ou plus vieux ksh), vous pouvez utiliser cette syntaxe non portable:

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

Remplacer 4 avec le nombre de processeurs que vous souhaitez charger si différent de 4.

En supposant que vous n'aviez pas de tâche en arrière-plan en cours d'exécution lorsque vous avez lancé l'une de ces boucles, vous pouvez arrêter la génération de charge avec cette commande:

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

En réponse au commentaire de @ underscore_d, voici une version améliorée qui simplifie beaucoup l’arrêt du chargement et qui permet également de spécifier un délai (par défaut 60 secondes). Contrôle-C va tuer toutes les boucles emballantes aussi. Cette fonction shell fonctionne au moins sous bash et 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



Merci mais & provoque une commande à exécuter dans un autre fil ou séparé coeur? Je suis confus. - mmdemirbas
@mmdemirbas: l'esperluette entraîne l'exécution de la commande en tant que processus distinct. Le planificateur envoie alors tous les processus actifs à tous les cœurs disponibles. - jlliagre
Pour rappel, vous pouvez arrêter ce test en émettant killall bash - Assurez-vous simplement qu'aucun autre script important n'est en cours d'exécution à ce moment. - a coder
@acoder Merci d'avoir suggéré un moyen de mettre fin à la boucle. J'éviterais cependant killall bash. Réponse modifiée pour ajouter une méthode plus sûre pour mettre fin à la génération de charge. - jlliagre
ou simplement les terminer par fg ctrl + c, 4 fois. - Blauhirn


J'ai fait un simple script python qui fait la même chose. Vous pouvez contrôler le nombre de cœurs de processeurs à charger. La bonne chose à ce sujet est que cela ne consommera aucune autre ressource que le processeur. (Je pense que l’idée de Mark Johnson consomme beaucoup de ressources E / S, ce qui est indésirable ici.)

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

Il suffit de lancer ce script à partir du terminal $ python temp1.py. Vous devez tuer le script lorsque vous avez terminé.

Voici la consommation de mon processeur lorsque je charge 3 de mes cœurs.

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


18
2018-06-30 17:56



Quel programme utilisez-vous pour afficher l'utilisation du processeur comme ceci? Cela me rappelle le top, mais je ne me souviens pas des «graphiques» du CPU. - jftuga
@jftuga probablement htop, Hautle plus joli frère. - BoppreH
oui son htop. Meilleur visualiseur de processus interactif coloré en temps réel pour linux - htop.sourceforge.net - Pushpak Dagade
N'a pas fait attention et a exécuté ceci sur une boîte de Windows. Très mauvaises choses ... - Derrick


Une autre façon serait

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

ou (si nproc est présent)

openssl speed -multi $(nproc --all)

OpenSSL est presque toujours présent sur les distributions actuelles, donc aucun paquet supplémentaire n'est nécessaire.


12
2017-09-08 11:19





Commencez deux

sha1sum /dev/zero &

commandes pour chaque noyau de votre système.

Arrêter

killall sha1sum

ou

kill sha1sum

8
2017-11-01 21:31





Je prends habituellement la suite cpuburn:

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

Remplacez 4 par le nombre de cœurs / threads HT que vous avez ou que vous souhaitez accentuer.

Remarque: Cela met autant de zones de puces que possible en même temps, elles sont programmées pour générer une dissipation de puissance maximale. Je devais écrire ce post une seconde fois, d'une manière ou d'une autre ma machine ne l'aimait pas :-(

Vous pouvez également faire cpuburn en séquences:

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

Et quand vous voulez les arrêter:

killall burnP6

Vous pourriez aussi multiplier burnP6 & pour correspondre au nombre de cœurs de processeur sur votre système.


7
2017-07-25 21:33





J'ai développé stress-ng, un outil de stress mis à jour qui peut mettre en évidence un large éventail d'aspects d'un système Linux. Pour plus d'informations, voir http://kernel.ubuntu.com/~cking/stress-ng/

L'utilisation est similaire à 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

Installer avec

sudo apt-get install stress-ng

5
2017-09-06 20:11



Lisez s'il vous plaît Comment puis-je recommander un logiciel Pour quelques conseils sur la manière de recommander des logiciels. Au minimum, vous devez fournir plus qu'un simple lien, par exemple des informations supplémentaires sur le logiciel lui-même, et comment il peut être utilisé pour résoudre le problème dans la question. - DavidPostill♦


Vous pouvez exécuter cette commande autant de fois que vous le souhaitez et cela prendra un noyau différent à chaque fois:

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

2
2017-07-01 02:09



Est-ce que cela ne compliquerait pas la fin des processus? - oKtosiTe
killall cat devrait le faire. - Christian Mann
Selon que vous avez d'autres cat processus en cours d'exécution (je fais habituellement). - oKtosiTe


https://github.com/GaetanoCarlucci/CPULoadGenerator

solution assez simple et scientifique.

Vous pouvez voir ici un exemple de dynamique dans lequel une charge de 50% est générée sur le cœur du processeur 0:

enter image description here

Vous pouvez exécuter le processus sur d'autres cœurs en même temps.


2
2018-03-28 15:46





J'ai combiné + jlliagre et + ecabuk.

#!/bin/bash
lc() {
    nowMs=$(date +%s)
    (
        pids=""
        cpus=${1:-1}
        seconds=${2:-60}
        echo "[$(date)] loading $cpus CPUs for $seconds seconds"
        echo "[$(date)] Expected completion: [$(date --date=@$(expr $nowMs + $seconds))]"
        trap 'for p in $pids; do kill $p; done' 0
        for ((i=0;i<cpus;i++)); do
            sha1sum /dev/zero &
            pids="$pids $!";
        done
        sleep $seconds
    )
    echo "[$(date)] Done"
}

lc $@

1
2018-06-22 16:47