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


161

現在、Cactiのインストールデバッグしていますが、CPU負荷を作成してCPU使用率グラフをデバッグしたいと思っています。

私は単に実行しようとしましたがcat /dev/zero > /dev/null、これはうまく機能しますが、1つのコアのみを利用します:

ここに画像の説明を入力してください

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

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


1
の複数のインスタンスをcat同時に実行することは可能ですか?
ネイトコッペ

@NateKoppenhaver:はい、それをscreenセッションでラップするときに可能だと思われます。しかし、可能であれば、より洗練されたソリューションを好むでしょう。
デアホッホステープラー

1
へー、私はいつも使っていましたcat /dev/random > /dev/null。推測も/dev/zero機能します。:-)
オクトーシ

8
@oKtosiTe cat / dev / randomには、/ dev / randomのエントロピーが枯渇するという副作用があります。エントロピーを節約する必要がある場合がありますが、CPUを独り占めするときはこれはありません。
リッチホモルカ

4
@oKtosiTe Rich Homolkaが言ったことは正しいが、それは悪いことだけでなく、ほとんど即座にブロックしてCPUの消費を停止するので役に立たない。
リュック14

回答:


187

試しstress てみてくださいWindowsとほぼ同じですconsume.exe

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

22
Ubuntuの上で、あなたがインストールすることができますsudo apt-get install stress
ベン

14
debian wheezyでも。
enapupe

10
Fedoraでsudo yum install stress
クリストファーマルキエータ14年

16
アーチ:sudo pacman -S stress
das_j

9
brew install stressOS Xで
クリスチャンロング

95

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

このワンライナーは、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と異なる場合は、ロードするCPUの数に置き換えます4

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

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

@のunderscore_dさんのコメントに答えて、ここで多くの負荷を停止簡素化し、それはまた、タイムアウト(デフォルト60秒)Aを指定できるように強化されたバージョンである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
  )
}

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


感謝&しますが、別のスレッドまたは別のコアでコマンドを実行しますか?私は混乱しています。
mmdemirbas

3
@mmdemirbas:アンパサンドにより、コマンドは別のプロセスとして実行されます。スケジューラは、すべてのアクティブなプロセスをすべての利用可能なコアにディスパッチします。
jlliagre

1
killall bash念のため、発行することでこのテストを停止できます-その時点で他の重要なスクリプトが実行されていないことを確認してください。
コーダー

1
@acoderループを終了する方法を提案してくれてありがとう。しかし、私は避けkillall bashます。より安全なメソッドを追加して負荷生成を終了するように編集された回答。
-jlliagre

1
lcシェル関数の+1
山本明

20

同じことを行う単純なpythonスクリプトを作成しました。ロードするCPUコアの数を制御できます。これの良い点は、CPU以外のリソースを消費しないことです。(マークジョンソンのアイデアは多くの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消費量の出力です。

スクリプトtemp1.pyは3つのプロセス(PID-9377、9378、9379)を作成し、3つのコアをロードします


3
このようなCPU使用率を表示するには、どのプログラムを使用しましたか?トップを思い出させますが、CPUの「チャート」は思い出せません。
jftuga

13
@jftugaはおそらくhtopでtopのよりきれいな兄弟です。
BoppreH

2
はい、そのトップ。Linux向けの最高のリアルタイムでカラフルなインタラクティブプロセスビューアー-htop.sourceforge.net
Pushpak Dagade

3
注意を払っていなかったため、これをWindowsボックスで実行しました。非常に悪いこと
デリック

13

1つの代替方法は

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

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

openssl speed -multi $(nproc --all)

OpenSSLは、最近のディストリビューションにほぼ常に存在するため、追加のパッケージは必要ありません。


8

開始2

sha1sum /dev/zero &

システムのすべてのコアのコマンド。

止まる

killall sha1sum

または

kill sha1sum

7

通常、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

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


6

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

使用法はストレスに似ています

$ 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
ソフトウェアを推奨する方法については、ソフトウェアを推奨する方法をご覧ください。少なくとも、少なくとも1つ以上のリンクを提供する必要があります。たとえば、ソフトウェア自体に関する追加情報や、質問の問題を解決するためにどのように使用できるかなどです。
DavidPostill

3

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

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

1
それはプロセスの終了を少し面倒にしませんか?
-oktosiTe

1
killall catそれを行う必要があります。
クリスチャン・マン

1
他のcatプロセスを実行しているかどうかによって異なります(通常は実行します)。
オクトーシット


1

+ 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

次を使用できます。

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

dd if=/dev/zero of=/dev/nullCPUコアについても繰り返します。

キーを押してテストを停止します。


1

pxzはの並列実装ですxz

pxz -9e /dev/zero --stdout >/dev/null これはかなりCPUを集中的に使用するため、トリックを行う必要があります。

/dev/zero十分に高速でない場合(pxzI / Oが抑制されることに気づいた場合) pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null

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


1

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

たとえば、4つのプロセスで開始するには、

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

上記のオプション「-P」によってプロセスの数を変更できます。


0

シンプルなコマンドラインでもできます:

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

1
これはより単純です:while : ; do : ; done
jlliagre

ユアーズloadavg 1の上方に行くwön't@jlliagre
ott--

ループは主にCPUをロードするのではなく、メモリをいっぱいにします。最終的にはメモリ不足エラーでクラッシュします。
jlliagre

@jlliagre Mineはメモリとスワップ(存在する場合)を満たし、メモリが不足するため、強制終了する前に3の負荷を生成します。
-ott--

4
それが問題です。サーバーに高いCPU負荷をかける方法である質問に答えていません。スクリプトにより、システムがすぐに応答しなくなり、クラッシュします。3のloadavgを取得するためのはるかに信頼性の高い方法があります。例:for i in 1 2 3; do while : ; do : ; done & ; done
jlliagre

0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.