Linuxサーバで高CPU負荷を出すにはどうすればいいですか?
私は現在 Cactiインストールのデバッグを行っており、CPU使用率のグラフをデバッグするためにCPU負荷を作成したいと考えています。
負荷時にシステムリソースをテスト/最大化する良い方法はありますか?
0x1&
関連。Windowsで高いCPU負荷を出すにはどうすればいいですか?
私は現在 Cactiインストールのデバッグを行っており、CPU使用率のグラフをデバッグするためにCPU負荷を作成したいと考えています。
負荷時にシステムリソースをテスト/最大化する良い方法はありますか?
0x1&
関連。Windowsで高いCPU負荷を出すにはどうすればいいですか?
試しに stress
Windows の consume.exe
:
oliver$ ./stress --cpu 3
stress: info: [18472] dispatching hogs: 3 cpu, 0 io, 0 vm, 0 hdd
``` を試してみてください。
余分なパッケージをインストールする必要はありません。それぞれがヌル命令(:
)を繰り返しています。各ループは100%でCPUコアをロードすることができます。
もし、bash
やksh93
や他のシェルが範囲をサポートしている場合(つまり、dash
やそれより古いksh
ではない場合)、この非ポータブル構文を使うことができます:
for i in 1 2 3 4; do while : ; do : ; done & done
もし4
と異なる場合は、4
をロードしたいCPUの数で置き換えてください。
これらのループの1つを起動したときにバックグラウンドジョブがすでに実行されていなかったと仮定すると、そのコマンドで負荷の生成を停止することができます:
for i in {1..4}; do ...
@underscore_dのコメントに答えて、ここでは、負荷を停止する多くのことを単純化し、またタイムアウト(デフォルト60秒)を指定することができます強化されたバージョンがあります。このシェル機能は、少なくとも bash
, ksh
以下では動作します。その場合、負荷の動作は実装に依存します(各スレッドが100%ビジーであるかどうかが報告される場合があります)。
同じことをするシンプルな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))
ターミナルからこのスクリプトを実行してください。終わったらスクリプトを kill する必要があります。
これは、3つのコアをロードしたときのCPU消費量です。
Linuxシステムの様々な側面にストレスを与えることができるストレスツールの更新版である stress-ng を開発してきました。詳細は 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
``` と似ています。
私は通常 cpuburn スイートを使っています:
sudo apt-get install cpuburn
for i in {1..4}; do burnK7 & done
4 をあなたが持っている、またはストレスをかけたいコア/HTスレッドの数に置き換えてください。
注意: これは同時に可能な限り多くのチップ面積にストレスをかけます。この投稿は2回目ですが、なぜか私のマシンはそれを好きではありませんでした :-(
あなたはまた、連続してcpuburnを行うことができます:
burnP6 & burnP6 & burnP6 & burnP6 &
[1] 28520
[2] 28521
[3] 28522
[4] 28523
そして、あなたがそれらを停止したいとき:
killall burnP6
あなたはまた、あなたのシステム上のCPUコアの数に一致するようにburnP6 &
を乗算することができます。
このコマンドは何度でも実行することができ、毎回異なるコアを使用します:
$ CORES=1
$ for i in `seq 1 $CORES`; do cat /dev/zero > /dev/null &
> done
[1] 8388
https://github.com/GaetanoCarlucci/CPULoadGenerator
かなりシンプルで科学的なソリューションです。
ここでは、50%の負荷がCPUコア0に発生しているダイナミクスの例を見ることができます:
他のコアで同時にプロセスを実行することができます。
pxz
は xz
の並列実装です。
pxz -9e /dev/zero --stdout >/dev/null
は非常に CPU を消費するので、これでうまくいくはずです。
もし /dev/zero
が十分に速くない場合 (pxz
が I/O スロットルされていることに気づくでしょう) は、pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null
を使うことができます。
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 $@
``` &001
@jlliagreさんのコメントに追記したかったのですが、評価が足りません。複数のサーバでこのコードを使用する場合で、CPU数が異なる場合は
for ((i=1; i<=`nproc --all`; i++)); do while : ; do : ; done & done
これは何個あってもサーバ上の全てのコアを利用することになります。コマンド nproc
は coreutils の一部なので、ほとんどの Linux インストールで使用できます。