วิธีสร้าง CPU spike ด้วยคำสั่ง bash


281

ฉันต้องการสร้างการโหลดเกือบ 100% บนเครื่อง Linux มันเป็นระบบควอดคอร์และฉันต้องการให้แกนทั้งหมดเต็มความเร็ว เป็นการดีที่ภาระของ CPU จะคงอยู่ตามระยะเวลาที่กำหนดจากนั้นจึงหยุด ฉันหวังว่าจะมีเคล็ดลับในการทุบตี ฉันกำลังคิดวนรอบไม่สิ้นสุดบางอย่าง


คำตอบ:


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 เธรด) การกดปุ่มอย่างง่ายจะหยุด (เพียงตรวจสอบให้แน่ใจว่าไม่มี dd อื่นกำลังทำงานกับผู้ใช้รายนี้หรือคุณฆ่าด้วย)


35
dd จัดการกับ I / O ได้มากกว่าการใช้งาน CPU
Fred

2
สิ่งนี้ใช้ได้ผลดีที่สุดกับสถานการณ์ของฉัน มันยังทำงานใน Cygwin ด้วยเหตุผลบางอย่างโซลูชันอื่น ๆ จะไม่ขัดขวาง CPU มากนัก การเพิ่มจำนวนและทำสี่กระบวนการในแบบคู่ขนานทำงานได้อย่างสมบูรณ์แบบ มันแหลม CPU ที่ 100% ด้านบนแล้วกลับลงไปที่ศูนย์โดยไม่มีความช่วยเหลือใด ๆ เพียงสี่บรรทัดของรหัสและ "รอ"
User1

62
การอ่าน/dev/zeroและเขียนถึง/dev/nullไม่ใช่ตัวสร้างภาระที่ดีมาก - คุณต้องเรียกใช้งานจำนวนมากเพื่อสร้างภาระที่สำคัญ dd if=/dev/urandom | bzip2 -9 >> /dev/nullดีกว่าที่จะทำสิ่งที่ชอบ /dev/urandomต้องใช้ความพยายามอย่างมากในการสร้างเอาต์พุตและbzip2จะใช้ความพยายามอย่างมากในการบีบอัดดังนั้นการใช้งาน CPU โดยรวมจึงสูงกว่า "เติมบล็อกด้วยค่าศูนย์แล้วโยนทิ้งไป"
twalberg

4
ใช้jobs -p | xargs killเพื่อฆ่ากระบวนการที่คุณสร้างเท่านั้น
แมเรียน

5
@twalberg คุณควรแสดงความคิดเห็นเป็นคำตอบ
Aaron McDaid

363

ฉันใช้ความเครียดสำหรับสิ่งนี้คุณสามารถบอกได้ว่ามีกี่คอร์ให้สูงสุดออกมา .. มันช่วยให้หน่วยความจำและดิสก์เครียดได้เช่นกัน

ตัวอย่างการเน้น 2 คอร์เป็นเวลา 60 วินาที

stress --cpu 2 --timeout 60


6
ใน Fedorasudo yum install stress
Christopher Markieta

3
คุณต้องทำEPELธุรกรรมซื้อคืน CentOSwget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Satish

4
brew install stressบน OS X ได้นอกจากนี้ยังมีเหตุผลบางอย่างที่ผมต้องระบุ 8 แกนบน MBPr quad-core
fregante

1
@ bfred.it คอร์ของคุณอาจใช้ไฮเปอร์เธรดเธรดได้อย่างมีประสิทธิภาพเป็นสองเท่าของจำนวนแกน (4 ฟิสิคัลและ 4 คอร์เสมือน) นอกจากนี้คุณยังต้องการเน้นไปที่การทดสอบโหลดแบบเต็ม
เสา

6
sudo apt-get install stressบนระบบที่ใช้เดเบียนเพื่อความสมบูรณ์ ใช้วิธีนี้ในการทดสอบการระบายความร้อนพอควรบนIntel i7 NUC Kit
onmylemon

133

ฉันคิดว่าอันนี้ง่ายกว่ามาก เปิด Terminal แล้วพิมพ์คำสั่งต่อไปนี้แล้วกด Enter

yes > /dev/null &

หากต้องการใช้ CPU ที่ทันสมัยอย่างเต็มที่หนึ่งบรรทัดไม่เพียงพอคุณอาจต้องทำซ้ำคำสั่งเพื่อใช้พลังงาน CPU ทั้งหมด

เพื่อวางทั้งหมดนี้เพียงแค่ใส่

killall yes

ตอนแรกมีการค้นพบความคิดที่นี่แม้ว่าจะมีไว้สำหรับผู้ใช้ Mac แต่สิ่งนี้ควรใช้ได้กับ * ระวังด้วยเช่นกัน


7
+1 ใช้งานได้อย่างมีเสน่ห์ขอบคุณ! มูลค่าเพิ่ม : คำสั่งนี้จะเพิ่มไฮเปอร์เธรดหนึ่งต่อซีพียูหลัก ดังนั้นซีพียูสองแกน (แต่ละคอร์ที่มี 2 เธรด) จะได้รับการโหลดทั้งหมด 25% ต่อyesคำสั่ง (สมมติว่าระบบไม่ได้ใช้งาน)
GitaarLAB

เพียงเพิ่มคำสั่งนี้การวนซ้ำของคำสั่งนี้เพิ่มภาระ 25 เปอร์เซ็นต์บน CPU (Android) สูงสุด 4 ครั้งและส่วนที่เหลือจะไม่มีผลกระทบ (แม้ในแง่ของอัตรานาฬิกา)
user3188978

30

แม้ว่าฉันจะมาช้าไปงานปาร์ตี้โพสต์นี้เป็นหนึ่งในผลลัพธ์ยอดนิยมในการค้นหา google "สร้างโหลดใน linux"

ผลลัพธ์ที่ทำเครื่องหมายว่าเป็นโซลูชันสามารถใช้สร้างภาระของระบบได้ฉันต้องการใช้sha1sum /dev/zeroเพื่อกำหนดภาระบน cpu-core

แนวคิดคือการคำนวณผลรวมแฮชจากดาต้าสตรีมที่ไม่มีที่สิ้นสุด (เช่น. / dev / ศูนย์, / dev / urandom, ... ) กระบวนการนี้จะพยายามหาซีพียูหลักออกมาจนสุดจนกว่ากระบวนการจะถูกยกเลิก หากต้องการสร้างโหลดสำหรับแกนเพิ่มเติมคุณสามารถไพพ์คำสั่งหลายคำพร้อมกันได้

เช่น. สร้างภาระ 2 แกน: sha1sum /dev/zero | sha1sum /dev/zero


ดูนี่จะดีกว่า dd สำหรับการโหลด CPU ฉันได้รับ cpu สูงสุด 44% สำหรับ dd (6 ครั้ง) และ 86% + ใน sha1sum thx ~!
AAI

26

หนึ่งคอร์ (ไม่ได้เรียกใช้กระบวนการภายนอก):

while true; do true; done

สองแกน:

while true; do /bin/true; done

หลังทำให้ทั้งสองของฉันไปที่ ~ 50% แม้ว่า ...

อันนี้จะทำให้ทั้งสองไป 100%:

while true; do echo; done

บน echo เราปล่อยการเข้าถึง linux วิธีที่จะทำให้คำสั่งที่ 3 ในพื้นหลัง?
AAI

2
ทำไมเสียงก้องทำให้ซีพียูคอร์ทั้งหมดถึง 100%
Haoyuan Ge

@ HaoyuanGe ซีพียูทั้งหมดเป็น 100% เฉพาะเมื่อสะท้อน "ไม่มีอะไร" แทนที่ do echo; ด้วย echo "บางสตริงที่ยาวมาก"; เพื่อดู <100% บนซีพียู ดังนั้นฉันเชื่อว่าการสะท้อนไม่มีสิ่งใดกระโดดลงไปได้มากและด้วยเหตุนี้โค้ดเพิ่มเติมที่จะดำเนินการ (เพราะในขณะที่เป็นจริง;) แกนนั้นยุ่ง ~ 100%
talekeDskobeDa

หากคุณต้องการที่จะเก็บเซิร์ฟเวอร์ที่ตอบสนองต่อการทำงานในขณะที่การทดสอบดังกล่าวจะทำในเปลือกแยกต่างหาก (หน้าต่าง tmux / จออื่นหรือครั้ง ssh) และ renice renice 19 -p $$ว่าเปลือกแรกเช่นในทุบตี: มันจะยังคง CPU สูงสุด แต่จะไม่กระทบกับกระบวนการอื่น ๆ
Walf

23

ในการโหลด 3 คอร์เป็นเวลา 5 วินาที:

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

สิ่งนี้ส่งผลให้โหลดเคอร์เนลสูง (sys) จากการเรียกของระบบ write () จำนวนมาก

หากคุณต้องการโหลดซีพียู userland เป็นส่วนใหญ่:

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

ตัวเลือกที่ดีพื้นเมือง
insign

18

นี่คือโปรแกรมที่คุณสามารถดาวน์โหลดได้ที่นี่

ติดตั้งได้อย่างง่ายดายบนระบบ Linux ของคุณ

./configure
make
make install

และเปิดมันในบรรทัดคำสั่งง่ายๆ

stress -c 40

เพื่อเน้นซีพียูทั้งหมดของคุณ (แต่คุณมี) โดยมี 40 เธรดแต่ละตัวรันการsqrtคำนวณที่ซับซ้อนกับตัวเลขที่สร้างขึ้นแบบ ramdomly

คุณสามารถกำหนดการหมดเวลาของโปรแกรมได้

stress -c 40 -timeout 10s

แตกต่างจากโซลูชันที่เสนอด้วยddคำสั่งซึ่งเกี่ยวข้องกับIOดังนั้นจึงไม่เกินระบบของคุณเพราะทำงานกับข้อมูล

โปรแกรมความเครียดทำให้ระบบทำงานหนักเกินไปเพราะต้องรับมือกับการคำนวณ


4
มีคำตอบข้างต้นสำหรับstressคำสั่งอยู่แล้ว ดังที่คำตอบนั้นบอกว่าคุณสามารถติดตั้งผ่าน yum / apt / etc
Asfand Qazi

1
เว็บไซต์ไม่อยู่ในสภาพดี (ถูกห้าม 503) แต่มีให้บริการบน repos :)
m3nda

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

ส้อมระเบิดนี้จะทำให้เกิดความเสียหายกับซีพียูและอาจทำให้คอมพิวเตอร์ของคุณเสียหาย


13
มันจะช่วยถ้าฉันทำให้การอ่าน fork_bomb () {fork_bomb | ง่ายขึ้น fork_bomb &}; forkbomb
Jeff Goldstein

17
ที่ล้มเหลวในการ "มีอายุการกำหนดระยะเวลาแล้วหยุด" เกณฑ์;)
แมเรียน

14
ดูเหมือนใบหน้าที่ยิ้มแย้ม
Ponkadoodle

2
ระเบิดส้อมนี้ทำให้คอมพิวเตอร์ของฉันพังฉันต้องทำรอบพลังงานอย่างหนัก
Elijah Lynn

2
จาก: cyberciti.biz/faq/understanding-bash-fork-bombคำเตือน! ตัวอย่างเหล่านี้อาจทำให้คอมพิวเตอร์ของคุณล้มเหลวหากดำเนินการ "เมื่อมีการเปิดใช้งานส้อมระเบิดที่ประสบความสำเร็จในระบบมันอาจเป็นไปไม่ได้ที่จะกลับมาทำงานตามปกติโดยไม่ต้องบูตระบบใหม่เพราะทางออกเดียวของส้อมระเบิดคือการทำลายทุกกรณี"
Elijah Lynn

11

การวนซ้ำไม่สิ้นสุดเป็นความคิดที่ฉันมี สิ่งที่ดูประหลาดคือ:

while :; do :; done

( :เหมือนกับtrueไม่ทำอะไรเลยและออกจากศูนย์)

คุณสามารถเรียกสิ่งนั้นในเชลล์ย่อยและทำงานในพื้นหลัง การทำเช่นนั้น$num_coresควรจะเพียงพอ หลังจากนอนหลับเวลาที่ต้องการคุณสามารถฆ่าพวกเขาทั้งหมดที่คุณได้รับ PIDs ด้วยjobs -p(คำใบ้: xargs)


10

ฉันจะแบ่งเนื้อหาออกเป็น 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



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
เอ๊ะไม่ การนอนหลับไม่ใช่งานประเภทนั้นที่ทำให้คนเล่นหูเล่นตากับซีพียูมากมาย:-)
Marian

2

ฉันผ่านอินเทอร์เน็ตเพื่อค้นหาสิ่งที่ชอบและพบสคริปต์ค้อนซีพียูที่มีประโยชน์มาก

#!/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
NUM_PROC=${1:-10}ประโยคถ้า-แล้วอย่างอื่นจะถูกแทนที่โดย:
Thor

2

ใช้ตัวอย่างที่กล่าวถึงที่นี่ แต่ยังได้รับความช่วยเหลือจาก IRC ฉันได้พัฒนาสคริปต์ทดสอบความเครียดของ CPU ของฉันเอง มันใช้ subshell ต่อเธรดและเทคนิคการวนรอบไม่สิ้นสุด คุณยังสามารถระบุจำนวนเธรดและระยะเวลาแบบโต้ตอบ

#!/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: tasket: ไม่พบคำสั่ง" ในสคริปต์ของคุณ! ความคิดใด ๆ
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

และมันไม่ใช้อะไรนอกจากทุบตี


1

เพื่อปรับปรุงคำตอบของ dimba และให้สิ่งที่เพิ่มเติมได้ pluggable (เพราะฉันต้องการสิ่งที่คล้ายกัน) ฉันได้เขียนสิ่งต่อไปนี้โดยใช้แนวคิด load-up dd: D

มันจะตรวจสอบแกนปัจจุบันและสร้างเธรด 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

ฉันรวมคำตอบบางคำและเพิ่มวิธีวัดความเครียดให้กับซีพียูที่มีอยู่ทั้งหมด:

#!/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's dd if=/dev/zero of=/dev/nullนั้นถูกต้องอย่างแน่นอน แต่ก็มีค่าที่ต้องกล่าวถึงคือการยืนยันการใช้งาน CPU สูงสุดถึง 100% คุณสามารถทำได้ด้วย

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

สิ่งนี้จะถามเอาต์พุต ps ของการใช้ cpu เฉลี่ย 1 นาทีโดยแต่ละโพรเซสแล้วบวกด้วย awk ในขณะที่มันเฉลี่ย 1 นาที ps นั้นฉลาดพอที่จะรู้ว่ากระบวนการมีเพียงไม่กี่วินาทีและปรับหน้าต่างตามเวลา ดังนั้นคุณสามารถใช้คำสั่งนี้เพื่อดูผลลัพธ์ได้ทันที


0

เพื่อเพิ่มโหลดหรือใช้ CPU 100%

sha1sum /dev/zero &

จากนั้นคุณจะเห็นการใช้งาน CPU โดยพิมพ์คำสั่ง

top

เพื่อปล่อยโหลด

killall sha1sum

-1

เพียงแค่วางเด็กเลวนี้ใน SSH หรือคอนโซลของเซิร์ฟเวอร์ใด ๆ ที่ใช้ linux คุณสามารถฆ่ากระบวนการด้วยตนเอง แต่ฉันเพิ่งปิดเซิร์ฟเวอร์เมื่อฉันทำเสร็จเร็วขึ้น

แก้ไข: ฉันได้อัปเดตสคริปต์นี้เพื่อให้มีคุณสมบัติตัวจับเวลาเพื่อให้ไม่จำเป็นต้องฆ่ากระบวนการ

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.