Como posso produzir alta carga de CPU em um servidor Linux?

142

Atualmente, estou no processo de depuração de uma instalação do Cacti e deseja criar carga da CPU para depurar meus gráficos de utilização da CPU.

Eu tentei simplesmente executar cat /dev/zero > /dev/null , que funciona muito bem, mas utiliza apenas 1 núcleo:

Existeummétodomelhordetestar/maximizarosrecursosdosistemasobcarga?

Related:How can I produce high CPU load on Windows?

    
por Der Hochstapler 30.06.2012 / 19:13

13 respostas

163

Experimente stress É praticamente um equivalente do Windows consume.exe :

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

Não é necessário instalar nenhum pacote extra, seu bom e velho shell é capaz de fazer isso sozinho.

Este one-liner carregará seus quatro núcleos em 100%:

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

Como isso funciona é bem simples, ele inicia quatro loops infinitos. Cada um deles está repetindo a instrução nula ( : ). Cada loop é capaz de carregar um núcleo da CPU em 100%.

Se você usar bash , ksh93 e outros intervalos de suporte de shells, (ou seja, não dash ou mais antigo ksh ), poderá usar esta sintaxe não portátil:

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

Substitua 4 pelo número de CPUs que você deseja carregar se for diferente de 4 .

Supondo que você não tenha executado nenhum job em background quando você executou um desses loops, é possível interromper a geração de carga com esse comando:

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

Respondendo ao comentário do @ underscore_d, aqui está uma versão aprimorada que simplifica muito parando a carga e que também permite especificar um timeout (padrão 60 segundos). A Controle - C matará todos os loops fugitivos também. Esta função do shell funciona pelo menos em bash e 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
  )
}
    
por 01.07.2012 / 16:55
18

Eu fiz um script python simples que faz o mesmo. Você pode controlar o número de núcleos de cpu que deseja carregar. A coisa boa sobre isso é que não vai consumir qualquer outro recurso além da CPU. (Acho que a ideia de Mark Johnson consumiria muitos recursos de E / S, o que é indesejável aqui.)

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

Basta executar esse script no terminal $ python temp1.py . Você precisa matar o script quando terminar.

Aqui está minha saída de consumo da CPU quando eu carrego 3 dos meus núcleos.

    
por 30.06.2012 / 19:56
13

Um caminho alternativo seria

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

ou (se nproc estiver presente)

openssl speed -multi $(nproc --all)

O OpenSSL está quase sempre presente nas distribuições atuais, portanto, nenhum pacote extra é necessário.

    
por 08.09.2016 / 13:19
8

Comece dois

sha1sum /dev/zero &

comandos para cada núcleo no seu sistema.

Para parar

killall sha1sum

ou

kill sha1sum
    
por 01.11.2015 / 22:31
7

Eu geralmente uso a suíte cpuburn:

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

Substitua 4 pelo número de núcleos / threads HT que você tem ou deseja enfatizar.

Nota: Isto enfatiza o máximo de área de cavacos possível ao mesmo tempo, é programado para gerar máxima dissipação de energia. Eu tive que escrever este post uma segunda vez, de alguma forma minha máquina não gostou: - (

Você também pode fazer o cpuburn em sequências:

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

E quando você quiser pará-los:

killall burnP6

Você também pode multiplicar burnP6 & para corresponder ao número de núcleos de CPU em seu sistema.

    
por 25.07.2012 / 23:33
5

Eu tenho desenvolvido o stress-ng, uma ferramenta de estresse atualizada que pode enfatizar uma ampla gama de aspectos de um sistema Linux. Para mais informações, consulte o link

O uso é semelhante ao estresse

$ 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

Instale com

sudo apt-get install stress-ng
    
por 06.09.2015 / 22:11
2

Você pode executar esse comando quantas vezes quiser e ele ocupará um núcleo diferente a cada vez:

$ CORES=1
$ for i in 'seq 1 $CORES'; do cat /dev/zero > /dev/null &
> done
[1] 8388
    
por 01.07.2012 / 04:09
2

link

solução bastante simples e científica.

Aqui você pode ver um exemplo de dinâmica em que 50% da carga é gerada no núcleo da CPU 0:

Você pode executar o processo em outros núcleos ao mesmo tempo.

    
por 28.03.2014 / 16:46
1

Combinei ambos + jlliagre e + 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 $@
    
por 22.06.2016 / 18:47
1

Você pode usar:

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

Repita dd if=/dev/zero of=/dev/null para seus núcleos de CPU.

Pressione qualquer tecla para interromper o teste.

    
por 24.07.2015 / 21:12
0

Uma linha de comando simples também:

x="x" ; while : ; do x=$x$x ; echo -n "." ; done
    
por 30.06.2012 / 21:08
0

pxz é uma implementação paralela de xz .

pxz -9e /dev/zero --stdout >/dev/null deve fazer o truque, pois isso é bastante intensivo em CPU.

Se /dev/zero não for rápido o suficiente (você percebe que pxz obtém E / S acelerado), você pode fazer pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null

As versões mais recentes de xz têm a opção --threads , que é um substituto para pxz .

    
por 07.11.2018 / 21:11