web-dev-qa-db-ja.com

bashコマンドでCPUスパイクを作成する方法

Linuxマシンに100%近い負荷をかけたいです。それはクアッドコアシステムであり、私はすべてのコアをフルスピードにしたいです。理想的には、CPU負荷は指定された時間持続してから停止します。 bashにトリックがあることを願っています。私はある種の無限ループを考えています。

245
User1

またすることができます

dd if=/dev/zero of=/dev/null

より多くのコアに負荷をかけるためにこれらをもっと実行するには、フォークしてみてください。

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

生成したいスレッドの数(ここでは4スレッド)と同じ回数だけ、中括弧内のコマンドを繰り返します。単純なエンターヒットはそれを止めるでしょう(ただこのユーザーで他のddが走っていないことを確かめるか、あなたもそれを殺してください)。

250
dimba

私はこのようなことに stress を使っています。メモリとディスクにもストレスをかけることができます。

2コアに60秒間ストレスをかける例

stress --cpu 2 --timeout 60

326
David

これはもっと簡単だと思います。ターミナルを開き、次のように入力してEnterを押します。

yes > /dev/null &

最新のCPUを十分に活用するには、1行では不十分です。コマンドを繰り返して、すべてのCPUの電力を使い果たす必要があるかもしれません。

これをすべて終了するには、単純に

killall yes

このアイデアはもともとここで発見されました 、ただしMacユーザーを対象としていましたが、これは* nixでも機能するはずです。

108
user1147015

1つのコア(外部プロセスを呼び出さない)

while true; do true; done

2つのコア:

while true; do /bin/true; done

後者は、私の両方を〜50%にするだけです...

これは両方を100%にするでしょう:

while true; do echo; done

これはあなたがダウンロードできるプログラムです ここ

Linuxシステムに簡単にインストール

./configure
make
make install

そして簡単なコマンドラインで起動する

stress -c 40

すべてのCPUに負荷をかけるため(ただし、使用している場合)は、それぞれがランダムに生成された数値に対して複雑なsqrt計算を実行する40スレッドを使用します。

あなたもプログラムのタイムアウトを定義することができます

stress -c 40 -timeout 10s

ddコマンドを使用した提案されたソリューションとは異なり、これは基本的にIOを処理します。したがって、データを処理するので実際にシステムを過負荷にしません。

ストレス処理プログラムは、計算を扱うため、システムに多大な負担をかけます。

17

私はパーティーに遅れていますが、この投稿はGoogle検索の「Generate load in linux」のトップ結果の1つです。

解決策としてマークされた結果はシステム負荷を生成するために使用することができます、私はCPUコアに負荷を課すためにsha1sum /dev/zeroを使用することを好みます。

アイデアは無限のデータストリーム(例えば/ dev/zero、/ dev/urandom、...)からハッシュ合計を計算することです。このプロセスはプロセスが中止されるまでCPUコアを最大化しようとします。より多くのコアに負荷をかけるために、複数のコマンドを一緒にパイプ処理することができます。

例えば。 2コアロードを生成します。sha1sum /dev/zero | sha1sum /dev/zero

17
Mitms

5秒間3コアをロードするには:

seq 3 | xargs -P0 -n1 timeout 5 yes > /dev/null

これは多くのwrite()システムコールから高いカーネル(sys)負荷をもたらします。

あなたが主にuserland cpu loadを好むなら:

seq 3 | xargs -P0 -n1 timeout 5 md5sum /dev/zero

Ctrl-Cを押すまでロードを続けたいだけの場合は、次のようにします。

seq 3 | xargs -P0 -n1 md5sum /dev/zero
14
James Scriven

無限ループは私も持っていたアイデアです。気が変に見えるものは:

while :; do :; done

:trueと同じで、何もしないでゼロで終了します)

これをサブシェルで呼び出してバックグラウンドで実行できます。 $num_cores回実行すれば十分です。あなたがそれらすべてを殺すことができる望ましい時間を眠った後、あなたはjobs -pでPIDを得る(ヒント:xargs

10
Marian
:(){ :|:& };:

このフォーク爆弾はCPUに大損害を与え、おそらくあなたのコンピュータをクラッシュさせるでしょう。

10
Jeff Goldstein

このことを2つのスクリプトに分けます。

infinite_loop.bash:

#!/bin/bash
while [ 1 ] ; do
    # Force some computation even if it is useless to actually work the CPU
    echo $((13**99)) 1>/dev/null 2>&1
done

cpu_spike.bash:

#!/bin/bash
# Either use environment variables for NUM_CPU and DURATION, or define them here
for i in `seq ${NUM_CPU}` : do
    # Put an infinite loop on each CPU
    infinite_loop.bash &
done

# Wait DURATION seconds then stop the loops and quit
sleep ${DURATION}
killall infinite_loop.bash
10
Fred
cat /dev/urandom > /dev/null
7
Evgeny

私はbcバイナリ計算機)を使って、たくさんの小数をつけてPIを求めました。

$ for ((i=0;i<$NUMCPU;i++));do
    echo 'scale=100000;pi=4*a(1);0' | bc -l &
    done ;\
    sleep 4; \
    killall bc

nUMCPU(Linux)の場合

$ NUMCPU=$(grep $'^processor\t*:' /proc/cpuinfo |wc -l)

私はこれを使ってシステムをクラッシュさせたことがないので、この方法は強力ですが、システムに優しいようです。

4
F. Hauri
#!/bin/bash
duration=120    # seconds
instances=4     # cpus
endtime=$(($(date +%s) + $duration))
for ((i=0; i<instances; i++))
do
    while (($(date +%s) < $endtime)); do :; done &
done
4
#!/bin/bash
while [ 1 ]
do
        #Your code goes here
done
3
Secko

ここで考えを利用して、設定された期間の後に自動的に終了するコードを作成しました、プロセスを殺す必要はありません -

#!/bin/bash
echo "Usage : ./killproc_ds.sh 6 60  (6 threads for 60 secs)"

# Define variables
NUM_PROCS=${1:-6} #How much scaling you want to do
duration=${2:-20}    # seconds

function infinite_loop {
endtime=$(($(date +%s) + $duration))
while (($(date +%s) < $endtime)); do
    #echo $(date +%s)
    echo $((13**99)) 1>/dev/null 2>&1
    $(dd if=/dev/urandom count=10000 status=none| bzip2 -9 >> /dev/null) 2>&1 >&/dev/null
done
echo "Done Stressing the system - for thread $1"
}


echo Running for duration $duration secs, spawning $NUM_PROCS threads in background
for i in `seq ${NUM_PROCS}` ;
do
# Put an infinite loop
    infinite_loop $i  &
done
2
Dhiraj

私はそのようなものを見つけるためにインターネットを通って行き、そしてこの非常に便利なcpuハンマースクリプトを見つけました。

#!/bin/sh

# unixfoo.blogspot.com

if [ $1 ]; then
    NUM_PROC=$1
else
    NUM_PROC=10
fi

for i in `seq 0 $((NUM_PROC-1))`; do
    awk 'BEGIN {for(i=0;i<10000;i++)for(j=0;j<10000;j++);}' &
done
2
Ishtiaq Ahmed

ここで述べた例を使ってIRCの助けを借りて、私は自分自身のCPUストレステストスクリプトを開発しました。スレッドごとのサブシェルと無限ループの手法を使用します。対話式にスレッド数と時間を指定することもできます。

#!/bin/bash
# Simple CPU stress test script

# Read the user's input
echo -n "Number of CPU threads to test: "
read cpu_threads
echo -n "Duration of the test (in seconds): "
read cpu_time

# Run an endless loop on each thread to generate 100% CPU
echo -e "\E[32mStressing ${cpu_threads} threads for ${cpu_time} seconds...\E[37m"
for i in $(seq ${cpu_threads}); do
    let thread=${i}-1
    (taskset -cp ${thread} $BASHPID; while true; do true; done) &
done

# Once the time runs out, kill all of the loops
sleep ${cpu_time}
echo -e "\E[32mStressing complete.\E[37m"
kill 0
2
MirceaKitsune

Dimbaの答えを高め、もっとプラグイン可能なものを提供するために(私は似たようなものが必要だったので)。私は次のようにddロードアップの概念を使って書きました。

現在のコアをチェックし、その数のddスレッドを作成します。 Enterでコアロードの開始と終了

#!/bin/bash

load_dd() {
    dd if=/dev/zero of=/dev/null
}

fulload() {
    unset LOAD_ME_UP_SCOTTY
    export cores="$(grep proc /proc/cpuinfo -c)"
    for i in $( seq 1 $( expr $cores - 1 ) )
      do
    export LOAD_ME_UP_SCOTTY="${LOAD_ME_UP_SCOTTY}$(echo 'load_dd | ')"
  done
        export LOAD_ME_UP_SCOTTY="${LOAD_ME_UP_SCOTTY}$(echo 'load_dd &')"
    eval ${LOAD_ME_UP_SCOTTY}
}

echo press return to begin and stop fullload of cores
  read
  fulload
  read
  killall -9 dd
1
knope

これは私にとってトリックです:

bash -c 'for (( I=100000000000000000000 ; I>=0 ; I++ )) ; do echo $(( I+I*I )) & echo $(( I*I-I )) & echo $(( I-I*I*I )) & echo $(( I+I*I*I )) ; done' &>/dev/null

そしてそれはbash以外は何も使いません。

1
ZyX

Dimbaのdd if=/dev/zero of=/dev/nullは間違いなく正しいですが、言及する価値があるのは、CPU使用率が100%になるまで検証することです。あなたはこれを行うことができます

ps -axro pcpu | awk '{sum+=$1} END {print sum}'

これは、各プロセスによるCPU使用率の1分平均のps出力を要求し、それからそれらをawkで合計します。平均1分ですが、psは、プロセスが数秒程度しかなかったかどうかを判断するのに十分スマートで、それに応じて時間枠を調整します。したがって、このコマンドを使用して結果をすぐに確認できます。

0
jeremysprofile

私はいくつかの答えを組み合わせて、利用可能なすべてのCPUに対するストレスを調整する方法を追加しました。

#!/bin/bash

function infinite_loop { 
    while [ 1 ] ; do
        # Force some computation even if it is useless to actually work the CPU
        echo $((13**99)) 1>/dev/null 2>&1
    done
}

# Either use environment variables for DURATION, or define them here
NUM_CPU=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
PIDS=()
for i in `seq ${NUM_CPU}` ;
do
# Put an infinite loop on each CPU
    infinite_loop &
    PIDS+=("$!")
done

# Wait DURATION seconds then stop the loops and quit
sleep ${DURATION}

# Parent kills its children 
for pid in "${PIDS[@]}"
do
    kill $pid
done
0
joecks