web-dev-qa-db-ja.com

Linuxサーバーで高いCPU負荷を発生させるにはどうすればいいですか?

私は現在、 Cactiインストールのデバッグ をしており、CPU使用率グラフをデバッグするためのCPU負荷を作成したいと考えています。

私は単純にcat /dev/zero > /dev/nullを実行しようとしました。

enter image description here

負荷のかかるシステムリソースをテスト/最大化するためのより良い方法はありますか?

関連: Windowsで高いCPU負荷を生み出すにはどうすればいいですか?

154
Der Hochstapler

試してみてください stress これは、Windowsのconsume.exeとほぼ同じです。

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

余分なパッケージをインストールする必要はありません。古き良きシェルは単独でそれを行うことができます。

このワンライナーは4つのコアをロードします1 100%で:

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

仕組みは非常に簡単で、4つの無限ループを開始します。それぞれがヌル命令(:)を繰り返しています。各ループは、CPUコアを100%でロードできます。

bashksh93、および範囲をサポートする他のシェル(つまり、dash以前のkshではない)を使用する場合、次の移植性のない構文を使用できます。

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

4と異なる場合は、4をロードするCPUの数に置き換えます。

これらのループの1つを起動したときに、バックグラウンドジョブが既に実行されていないと仮定すると、そのコマンドで負荷生成を停止できます。

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

@underscore_dのコメントに答えて、ロードの停止を大幅に簡略化し、タイムアウト(デフォルトは60秒)を指定できる拡張バージョンを示します。 Control-C すべての暴走ループも殺します。このシェル関数は、少なくともbashおよび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
  )
}

1CPUがコアごとに複数のスレッドをサポートする(ハイパースレッディング)場合、OSはすべての仮想CPUに負荷をディスパッチすることに注意してください。その場合、ロード動作は実装に依存します(各スレッドが100%ビジーであるかどうかを報告する場合があります)。

93
jlliagre

私は同じことをする簡単なpythonスクリプトを作りました。あなたがロードしたいCPUコアの数を制御することができます。これについての良いところは、それがCPU以外に他のどのリソースも消費しないということです。 (Mark johnsonのアイデアは多くのI/Oリソースを消費することになると私は思う。ここでは望ましくない。)

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

このスクリプトを端末$ python temp1.pyから実行するだけです。完了したらスクリプトを終了する必要があります。

これは、3つのコアをロードしたときのCPU消費量の出力です。

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

19
Pushpak Dagade

1つの代替方法は

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

または(nprocが存在する場合)

openssl speed -multi $(nproc --all)

OpenSSLは最近のディストリビューションではほとんどいつも存在しているので、追加のパッケージは必要ありません。

13
rkosegi

スタート2

sha1sum /dev/zero &

システム内のすべてのコアに対するコマンド。

止まる

killall sha1sum

または

kill sha1sum
8
ecabuk

私は通常cpuburnスイートを取ります:

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

4を、持っている、または強調したいコア/ HTスレッドの数に置き換えます。

注:これは同時に可能な限り多くのチップ面積を圧迫し、それは最大の電力消費を生成するようにプログラムされています。私はこの記事をもう一度書かなければならなかった、どういうわけか私のマシンはそれを好まなかった:-(

Cpuburnを順番に実行することもできます。

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

そして、あなたがそれらを止めたいときは:

killall burnP6

システムのCPUコアの数に合わせてburnP6 &を増やすこともできます。

7
ce4

私はstress-ngを開発しています。これは、Linuxシステムのさまざまな側面にストレスをかけることができる最新のストレスツールです。詳細については、 http://kernel.ubuntu.com/~cking/stress-ng/ を参照してください。

使い方は 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

と一緒にインストール

Sudo apt-get install stress-ng
6
Colin King

このコマンドは何度でも実行できます。毎回異なるコアを使用します。

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

https://github.com/GaetanoCarlucci/CPULoadGenerator

非常にシンプルで科学的な解決策。

ここでは、CPUコア0に50%の負荷が発生するダイナミクスの例を見ることができます。

enter image description here

同時に他のコアでプロセスを実行できます。

2
user

あなたが使用することができます:

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

あなたのCPUコアに対してdd if=/dev/zero of=/dev/nullを繰り返してください。

テストを中止するには任意のキーを押してください。

1
Lyma Lyma

これが私の使用方法です。追加のものをインストールする必要はありません。

たとえば4つのプロセスから始めると、

nproc | xargs seq | xargs -n1 -P4 md5sum /dev/zero

上記の "-P"オプションでプロセス数を変更できます。

1
yichun

私は+ jlliagreと+ 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
TJR

簡単なコマンドラインでも可能です。

x="x" ; while : ; do x=$x$x ; echo -n "." ; done
0
ott--

これを@ jlliagreのコメントに追加したいと思いましたが、私は十分な評判がありません。このコードを複数のサーバーで使用する予定で、CPU数が変わる場合は、次のコマンドを使用できます。

for ((i=1; i<=`nproc --all`; i++)); do while : ; do : ; done & done

これにより、サーバの数に関係なく、サーバ上のすべてのコアが利用されます。コマンドnprocはcoreutilsの一部なので、ほとんどのLinuxインストールで使用する必要があります。

0
AndreasKralj

pxzxzの並列実装です。

これはかなりCPU集約的なので、pxz -9e /dev/zero --stdout >/dev/nullがトリックをするべきです。

/dev/zeroの速度が十分ではない(pxzがI/Oを抑制していることに気付いた)場合は、pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/nullを実行できます。

新しいバージョンのxzには、pxzの代わりになる--threadsオプションがあります。

0
styrofoam fly