bash 명령으로 CPU 스파이크를 만드는 방법


281

Linux 컴퓨터에서 거의 100 %로드를 만들고 싶습니다. 쿼드 코어 시스템이며 모든 코어가 최고 속도로 가고 싶습니다. 이상적으로 CPU로드는 지정된 시간 동안 지속 된 다음 중지됩니다. 나는 bash에 약간의 트릭이 있기를 바라고있다. 나는 일종의 무한 루프를 생각하고 있습니다.


답변:


283

당신은 또한 할 수 있습니다

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 개 스레드)만큼 중괄호 안에 명령을 반복하십시오. 간단한 Enter 키를 누르면 중지됩니다 (이 사용자에서 다른 dd가 실행되고 있지 않은지 확인하십시오).


35
dd는 CPU 사용량보다 I / O를 더 잘 다룹니다
Fred

2
이것은 실제로 내 상황에 가장 효과적이었습니다. Cygwin에서도 일했습니다. 어떤 이유로 든 다른 솔루션은 CPU를 크게 늘리지 않을 것입니다. 카운트를 추가하고 4 개의 프로세스를 병렬로 만드는 것은 완벽하게 작동했습니다. CPU를 100 % 위로 올린 다음 아무런 도움없이 0으로 다시 내려갔습니다. 네 줄의 코드와 "대기".
사용자 1

62
읽고 /dev/zero쓰는 /dev/null것이 좋은로드 생성기는 아닙니다. 상당한로드를 생성하려면 많은로드를 실행해야합니다. 같은 일을하는 것이 dd if=/dev/urandom | bzip2 -9 >> /dev/null좋습니다. /dev/urandom출력을 생성하는 데 훨씬 더 많은 노력이 필요 bzip2하며 압축을 시도하는 데 많은 노력이 필요하므로 전체 CPU 사용량은 "0으로 블록을 채우고 버리는 것"보다 훨씬 높습니다.
twalberg

4
jobs -p | xargs kill생성 한 프로세스 만 종료하는 데 사용하십시오 .
Marian

5
@ twalberg, 당신은 답변에 의견을 말해야합니다.
Aaron McDaid

363

나는 이런 종류의 일에 스트레스 를 사용 합니다. 최대 코어 수를 알려줄 수 있습니다. 메모리와 디스크에 스트레스를 줄 수 있습니다.

60 초 동안 2 개의 코어에 응력을 가하는 예

stress --cpu 2 --timeout 60


6
Fedora에서sudo yum install stress
Christopher Markieta

3
당신은 필요 EPEL에 CentOS에 대한 REPOwget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
사티

4
brew install stressOS X에서 또한 어떤 이유로 나는 쿼드 코어 MBPr에 8 개 코어를 지정했다
fregante

1
@ bfred.it 코어는 하이퍼 스레딩을 사용하여 코어 수를 효과적으로 두 배로 늘릴 수 있습니다 (실제 코어 4 개 및 가상 코어 4 개). 또한 전체 부하 테스트를 위해 가상 스트레스를 원할 것입니다.
돛대

6
sudo apt-get install stress완전성을 위해 데비안 기반 시스템에서. 이를 사용하여 Intel i7 NUC 키트 의 냉각 모드를 테스트합니다 .
onmylemon

133

나는 이것이 더 간단하다고 생각합니다. 터미널을 열고 다음을 입력하고 Enter를 누르십시오.

yes > /dev/null &

최신 CPU를 완전히 활용하려면 한 줄로는 충분하지 않으므로 모든 CPU 전원을 소모하기 위해 명령을 반복해야 할 수도 있습니다.

이 모든 것을 끝내려면 간단히

killall yes

이 아이디어는 Mac 사용자를위한 것이지만 원래 여기 에서 발견 되었지만 * nix에도 적용됩니다.


7
+1 매력처럼 작동합니다. 감사합니다! 추가 가치 :이 명령은 CPU 코어 당 하나의 하이퍼 스레드를 최대로 제한합니다. 따라서 듀얼 코어 CPU (각 코어에 2 개의 스레드가 있음)는 yes명령 당 총 25 %의로드를 얻습니다 (시스템이 유휴 상태 인 경우).
GitaarLAB

이 명령을 추가 할 때마다이 명령을 반복 할 때마다 CPU (Android)에 25 %의 부하가 최대 4 회 반복되고 나머지는 영향을 미치지 않습니다 (클럭 속도 측면에서도).
user3188978

30

나는 파티에 늦었지만이 게시물은 구글 검색에서 "리눅스에서 부하 생성"의 최고 결과 중 하나이다.

솔루션으로 표시된 결과는 시스템 부하를 생성하는 데 사용될 수 있습니다. 나는 sha1sum /dev/zeroCPU 코어에 부하를 가하는 데 선호합니다 .

아이디어는 무한 데이터 스트림 (예 : / dev / zero, / dev / urandom 등)에서 해시 합계를 계산하는 것입니다.이 프로세스는 프로세스가 중단 될 때까지 CPU 코어를 최대한으로 사용하려고 시도합니다. 더 많은 코어에 대한로드를 생성하기 위해 여러 명령을 함께 파이프 할 수 있습니다.

예. 2 코어로드 생성 : sha1sum /dev/zero | sha1sum /dev/zero


CPU로드의 경우 dd보다 낫습니다. dd에서 최대 CPU 부하가 44 %이고 sha1sum에서 86 % +입니다. Thx ~!
AAI

26

하나의 핵심 (외부 프로세스를 호출하지 않음) :

while true; do true; done

두 가지 핵심 :

while true; do /bin/true; done

후자는 내 둘 다 ~ 50 %로 이동합니다 ...

이것은 둘 다 100 %로 만들 것입니다 :

while true; do echo; done

에코에서는 리눅스에 대한 액세스를 느슨하게합니다. 백그라운드에서 그 세 번째 명령을 넣는 방법?
AAI

2
echo가 모든 CPU 코어를 100 %로 만드는 이유는 무엇입니까?
Haoyuan Ge

@HaoyuanGe "아무것도"에코 할 때만 모든 CPU가 100 %입니다. do echo를 교체하십시오. echo "일부 매우 긴 문자열"; CPU에서 <100 %를 볼 수 있습니다. 그래서, 실행 훨씬 덜 점프했다 아무것도 따라서 더 많은 코드를 반향하지, 생각 (때문에 진정한 동안의) 코어가 ~ 100 % 바쁘다
talekeDskobeDa

이러한 테스트를 실행하는 동안 서버의 응답을 유지하려면 별도의 셸 (다른 tmux / 화면 창 또는 ssh 세션)에서 서버를 수행하고 bash에서 셸을 먼저 사용하십시오 (예 : bash :) renice 19 -p $$. 여전히 CPU를 최대로 유지하지만 다른 프로세스에는 영향을 미치지 않습니다.
Walf

23

5 초 동안 3 개의 코어를로드하려면 :

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

이로 인해 많은 write () 시스템 호출에서 높은 커널 (sys)로드가 발생합니다.

대부분 userland CPU로드를 선호하는 경우 :

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

Ctrl-C를 누를 때까지로드를 계속하려면 다음을 수행하십시오.

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

1
tinycore에서 가능합니까? xargs를 : 잘못된 옵션 - 'P'
conman253

멋진 기본 옵션
서명

18

여기에서 다운로드 할 수있는 프로그램입니다 여기에

Linux 시스템에 쉽게 설치

./configure
make
make install

간단한 명령 줄에서 실행

stress -c 40

sqrt무작위로 생성 된 숫자에 대해 복잡한 계산을 실행하는 40 개의 스레드로 모든 CPU에 스트레스를줍니다 .

프로그램의 타임 아웃을 정의 할 수도 있습니다

stress -c 40 -timeout 10s

dd명령을 사용 하여 제안 된 솔루션과 달리 본질적 IO으로 데이터를 처리하기 때문에 시스템을 실제로 오버로드하지는 않습니다.

스트레스 프로그램은 계산을 다루기 때문에 실제로 시스템에 과부하를줍니다.


4
stress명령에 대한 답변이 이미 있습니다 . 그 대답에서 알 수 있듯이 yum / apt / etc를 통해 설치할 수 있습니다.
Asfand Qazi

1
좋지 않은 조건 (503 금지) 만에 웹 사이트 :)이 REPOS 볼 수 있습니다
m3nda

11
:(){ :|:& };:

이 포크 폭탄은 CPU에 혼란을 유발하고 컴퓨터를 손상시킬 수 있습니다.


13
fork_bomb () {쉽게 읽을 수있게하면 도움이됩니다. {fork_bomb | fork_bomb &}; forkbomb
Jeff Goldstein

17
그것은 "지정된 시간 동안 마지막으로 멈추었다"기준에 실패한다;)
Marian

14
웃는 얼굴처럼 보입니다.
Ponkadoodle

2
이 포크 폭탄은 내 컴퓨터를 추락 시켰습니다.
Elijah Lynn

2
보낸 사람 : cyberciti.biz/faq/understanding-bash-fork-bomb 경고! 이러한 예제는 컴퓨터가 실행될 경우 충돌 할 수 있습니다. "포크 폭탄에 대한 유일한 해결책은 시스템에서 재부팅하지 않으면 시스템을 재부팅하지 않고 정상적인 작동을 재개하지 못할 수 있습니다."
Elijah Lynn

11

무한 루프는 내가 가진 아이디어입니다. 이상하게 보이는 것은 :

while :; do :; done

( :와 동일하고 true아무것도하지 않고 0으로 종료합니다)

서브 쉘에서 호출하여 백그라운드에서 실행할 수 있습니다. 그렇게하는 $num_cores것으로 충분합니다. 당신이 그들 모두를 죽일 수 원하는 시간 수면 후와 PID를 얻을 수 jobs -p(힌트 : xargs)


10

나는 두 가지 스크립트로 나눌 것입니다 :

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



4

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

이 방법은 강력하지만 시스템 친화적 인 것처럼 보입니다 .이를 사용하여 시스템을 충돌시킨 적이 없습니다.


3
#!/bin/bash
while [ 1 ]
do
        #Your code goes here
done

1
아뇨 잠자는 것은 CPU에 많은 상쾌함을주는 그런 종류의 일이 아니다:-)
Marian

2

나는 인터넷을 통해 비슷한 것을 발견 했고이 매우 편리한 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

정말 길어야합니까? 나는 작업의 이런 종류의 한 라이너 최고의 ... 같은
Nikana Reklawyks

1
if-then-else 절은 다음으로 대체 될 수 있습니다 NUM_PROC=${1:-10}.
Thor

2

여기에 언급 된 예제를 사용하지만 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

스크립트에서 "행 14 : taskset : 명령을 찾을 수 없습니다"오류가 발생합니다! 어떤 생각?
user2912312

2

여기에서 아이디어를 활용하고 설정된 기간 후에 자동으로 종료되는 코드를 만들면 프로세스를 죽일 필요가 없습니다.

#!/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

1

이것은 나를 위해 속임수를 쓴다 :

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

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

0

나는 몇 가지 답변을 결합하고 사용 가능한 모든 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

Dimba dd if=/dev/zero of=/dev/null는 확실히 정확하지만 언급 할 가치가있는 것은 CPU 사용률을 100 %로 최대화 하는 것입니다. 당신은 이것을 할 수 있습니다

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

이렇게하면 각 프로세스에서 1 분 평균 CPU 사용량의 ps 출력을 요청한 다음 awk와 합산합니다. 평균 1 분이지만 ps는 프로세스가 몇 초 밖에 걸리지 않았는지 알기에 충분히 현명하며 시간 창을 적절히 조정합니다. 따라서이 명령을 사용하여 결과를 즉시 볼 수 있습니다.


0

부하를 늘리거나 CPU 100 %를 소비

sha1sum /dev/zero &

다음 명령을 입력하여 CPU 사용을 볼 수 있습니다

top

하중을 풀기 위해

killall sha1sum

-1

이 나쁜 소년을 리눅스를 실행하는 서버의 SSH 또는 콘솔에 붙여 넣으십시오. 프로세스를 수동으로 종료 할 수 있지만 완료되면 서버를 더 빨리 종료합니다.

편집 : 프로세스를 종료 할 필요가 없도록 타이머 기능을 갖도록이 스크립트를 업데이트했습니다.

read -p "Please enter the number of minutes for test >" MINTEST && [[ $MINTEST == ?(-)+([0-9]) ]]; NCPU="$(grep -c ^processor /proc/cpuinfo)";  ((endtime=$(date +%s) + ($MINTEST*60))); NCPU=$((NCPU-1)); for ((i=1; i<=$NCPU; i++)); do while (($(date +%s) < $endtime)); do : ; done & done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.