Cara membuat lonjakan CPU dengan perintah bash

281

Saya ingin membuat hampir 100% beban pada mesin Linux. Ini sistem quad core dan saya ingin semua core berjalan dengan kecepatan penuh. Idealnya, beban CPU akan bertahan dalam jumlah waktu yang ditentukan dan kemudian berhenti. Saya berharap ada beberapa trik di bash. Saya sedang memikirkan semacam loop tak terbatas.

Pengguna1
sumber

Jawaban:

283

Anda juga bisa melakukannya

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

Untuk menjalankan lebih banyak dari mereka untuk memuat lebih banyak core, cobalah untuk memotongnya:

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

Ulangi perintah di kurung keriting sebanyak jumlah utas yang ingin Anda hasilkan (di sini 4 utas). Hit enter sederhana akan menghentikannya (pastikan tidak ada dd lain yang berjalan pada pengguna ini atau Anda membunuhnya juga).

dimba
sumber
35
dd lebih banyak berurusan dengan I / O daripada dengan penggunaan CPU
Fred
2
Ini sebenarnya yang terbaik untuk situasi saya. Itu juga bekerja di Cygwin. Untuk beberapa alasan, solusi lain tidak akan cukup spike CPU. Menambahkan hitungan dan membuat empat proses secara paralel bekerja dengan sempurna. Ini melonjak CPU pada 100% di atas dan kemudian kembali ke nol tanpa bantuan. Hanya empat baris kode dan "tunggu".
Pengguna1
62
Membaca dari /dev/zerodan menulis ke /dev/nullbukan generator beban yang sangat baik - Anda harus menjalankan banyak dari mereka untuk menghasilkan beban yang signifikan. Lebih baik melakukan sesuatu seperti dd if=/dev/urandom | bzip2 -9 >> /dev/null. /dev/urandommembutuhkan upaya yang jauh lebih besar untuk menghasilkan output, dan bzip2akan mengeluarkan banyak upaya untuk mengompresnya, sehingga penggunaan CPU secara keseluruhan jauh lebih tinggi daripada "mengisi blok dengan nol, dan kemudian membuangnya".
twalberg
4
Gunakan jobs -p | xargs killuntuk hanya membunuh proses yang telah Anda buat.
Marian
5
@walwal, Anda harus membuat komentar Anda menjadi jawaban.
Aaron McDaid
363

Saya menggunakan stres untuk hal-hal semacam ini, Anda bisa mengatakan berapa banyak core yang akan keluar maksimal .. ini memungkinkan untuk menekankan memori dan disk juga.

Contoh untuk menekankan 2 core selama 60 detik

stress --cpu 2 --timeout 60

David
sumber
6
Di Fedora,sudo yum install stress
Christopher Markieta
3
Anda perlu EPELrepo untuk CentOSwget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Satish
4
brew install stresspada OS X. Juga karena alasan tertentu saya harus menentukan 8 core pada quad-core MBPr
fregante
1
@ bfred.it Core Anda dapat menggunakan hyperthreading, secara efektif menggandakan jumlah core Anda (4 core fisik dan 4 core virtual). Anda juga ingin menekankan yang virtual untuk tes beban penuh.
Tiang
6
sudo apt-get install stresspada sistem berbasis debian, untuk kelengkapan. Gunakan ini untuk menguji mod pendingin pada Intel i7 NUC Kit .
onmylemon
133

Saya pikir ini lebih sederhana. Buka Terminal dan ketik berikut ini dan tekan Enter.

yes > /dev/null &

Untuk sepenuhnya menggunakan CPU modern, satu baris tidak cukup, Anda mungkin perlu mengulangi perintah untuk menghabiskan semua daya CPU.

Untuk mengakhiri semua ini, cukup cantumkan

killall yes

Gagasan ini awalnya ditemukan di sini , meskipun ditujukan untuk pengguna Mac, tetapi ini harus bekerja untuk * nix juga.

pengguna1147015
sumber
7
+1 Berfungsi seperti mantra, terima kasih! Layak ditambahkan : perintah ini akan memaksimalkan satu hyperthread per cpu core. Jadi dual core cpu (masing-masing core memiliki 2 thread) akan mendapatkan beban total 25% per yesperintah (dengan asumsi sistem idle).
GitaarLAB
Hanya untuk menambah ini, Setiap iterasi dari perintah ini menambahkan beban 25 persen pada CPU (Android) hingga 4 iterasi dan sisanya tidak berpengaruh (bahkan dalam hal clock rate).
user3188978
31

Meskipun saya terlambat ke pesta, posting ini adalah salah satu hasil teratas dalam pencarian google "menghasilkan beban di linux".

Hasilnya ditandai sebagai solusi yang dapat digunakan untuk menghasilkan beban sistem, saya lebih suka menggunakan sha1sum /dev/zerountuk memaksakan beban pada cpu-core.

Idenya adalah untuk menghitung jumlah hash dari datastream yang tak terbatas (mis. / Dev / nol, / dev / urandom, ...) proses ini akan mencoba untuk memaksimalkan cpu-core sampai proses dibatalkan. Untuk menghasilkan beban untuk lebih banyak core, beberapa perintah dapat disalurkan secara bersamaan.

misalnya. menghasilkan beban 2 inti: sha1sum /dev/zero | sha1sum /dev/zero

Mitos
sumber
Melihat, ini menjadi lebih baik daripada dd untuk beban CPU. Saya mendapatkan beban cpu maks 44% pada dd (6 kali) dan 86% + pada sha1sum. Terima kasih ~!
AAI
26

Satu inti (tidak meminta proses eksternal):

while true; do true; done

Dua core:

while true; do /bin/true; done

Yang terakhir hanya membuat kedua milikku pergi ke ~ 50% meskipun ...

Yang ini akan membuat keduanya menjadi 100%:

while true; do echo; done
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
sumber
pada echo, kami kehilangan akses ke linux. bagaimana cara menempatkan perintah ke-3 di latar belakang?
AAI
2
Mengapa gema membuat semua core cpu menjadi 100%?
Haoyuan Ge
@ HaoyuanGe Semua CPU hanya 100% ketika menggema "tidak ada". Ganti do echo; dengan do echo "string yang sangat panjang"; untuk melihat <100% pada CPU. Jadi, saya percaya, gema tidak ada yang memiliki lompatan lebih sedikit dan karenanya lebih banyak kode untuk dieksekusi (karena sementara benar;) core ~ ​​100% sibuk
talekeDskobeDa
Jika Anda ingin menyimpan server responsif sementara berjalan seperti tes, melakukannya di shell terpisah (jendela lain tmux / layar, atau sesi ssh), dan renice bahwa shell pertama, misalnya di bash: renice 19 -p $$. Ini masih akan memaksimalkan CPU, tetapi tidak akan mempengaruhi proses lainnya.
Walf
23

Untuk memuat 3 core selama 5 detik:

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

Ini menghasilkan beban kernel yang tinggi dari banyak panggilan sistem write ().

Jika Anda lebih suka memuat sebagian besar penggunalandpu cpu:

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

Jika Anda hanya ingin memuat berlanjut hingga Anda menekan Ctrl-C:

seq 3 | xargs -P0 -n1 md5sum /dev/zero
James Scriven
sumber
1
Apakah ini mungkin dari tinycore? xargs: opsi tidak valid - 'P'
conman253
Opsi asli yang bagus
lambang
18

Ini adalah program yang bisa Anda unduh di sini

Instal dengan mudah di sistem Linux Anda

./configure
make
make install

dan meluncurkannya dalam baris perintah sederhana

stress -c 40

untuk menekankan semua CPU Anda (namun Anda miliki) dengan masing-masing 40 thread menjalankan sqrtkomputasi kompleks pada angka yang dihasilkan secara ramdomly.

Anda bahkan dapat menentukan batas waktu program

stress -c 40 -timeout 10s

tidak seperti solusi yang diusulkan dengan ddperintah, yang pada dasarnya berkaitan dengan IOdan karena itu tidak terlalu membebani sistem Anda karena bekerja dengan data.

Program stres benar-benar membebani sistem karena berurusan dengan perhitungan.

Fopa Léon Constantin
sumber
4
Sudah ada jawaban di atas untuk stressperintah. Seperti jawaban yang mengatakan, Anda bisa menginstalnya melalui yum / apt / etc.
Asfand Qazi
1
Situs web tidak dalam kondisi baik (503 Forbidden) tetapi tersedia di repos :)
m3nda
11
:(){ :|:& };:

Bom fork ini akan menyebabkan kerusakan pada CPU dan kemungkinan akan menyebabkan crash pada komputer Anda.

Jeff Goldstein
sumber
13
Ini akan membantu jika saya membuatnya lebih mudah untuk membaca fork_bomb () {fork_bomb | fork_bomb &}; forkbomb
Jeff Goldstein
17
Yang satu gagal pada kriteria "bertahan sejumlah waktu yang ditentukan lalu berhenti";)
Marian
14
terlihat seperti sekelompok wajah tersenyum.
Ponkadoodle
2
Bom garpu ini menabrak komputer saya, saya harus melakukan siklus daya yang keras.
Elijah Lynn
2
Dari: cyberciti.biz/faq/understanding-bash-fork-bomb PERINGATAN! Contoh-contoh ini dapat merusak komputer Anda jika dijalankan. "Begitu bom fork yang berhasil diaktifkan dalam suatu sistem, tidak mungkin untuk melanjutkan operasi normal tanpa me-reboot sistem karena satu-satunya solusi untuk bom fork adalah menghancurkan semua contohnya."
Elijah Lynn
11

Sebuah infinite loop adalah ide yang juga saya miliki. Yang tampak aneh adalah:

while :; do :; done

( :Sama dengan true, tidak melakukan apa pun dan keluar dengan nol)

Anda dapat memanggilnya dalam subkulit dan berjalan di latar belakang. Melakukan itu $num_coresseharusnya sudah cukup. Setelah tidur waktu yang diinginkan Anda bisa membunuh mereka semua, Anda mendapatkan PID dengan jobs -p(petunjuk: xargs)

Marian
sumber
10

Saya akan memecahnya menjadi 2 skrip:

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
Fred
sumber
7
cat /dev/urandom > /dev/null
Evgeny
sumber
Tambahkan beberapa komentar juga, ini membantu.
Lokesh
4
#!/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
Dijeda sampai pemberitahuan lebih lanjut.
sumber
4

Saya telah menggunakan bc( kalkulator biner ), meminta mereka untuk PI dengan banyak desimal.

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

dengan NUMCPU (di Linux):

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

Metode ini kuat tetapi tampaknya ramah sistem , karena saya tidak pernah crash sistem menggunakan ini.

F. Hauri
sumber
3
#!/bin/bash
while [ 1 ]
do
        #Your code goes here
done
Secko
sumber
1
Eh, tidak. Tidur bukanlah tugas semacam itu yang menempatkan banyak laod pada cpu:-)
Marian
2

Saya pergi melalui Internet untuk menemukan sesuatu seperti itu dan menemukan skrip cpu hammer yang sangat berguna ini.

#!/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
Ishtiaq Ahmed
sumber
Apakah itu benar-benar perlu selama itu? Saya suka one-liners terbaik untuk tugas semacam ini ...
Nikana Reklawyks
1
Klausul jika-maka-lain dapat diganti dengan: NUM_PROC=${1:-10}.
Thor
2

Menggunakan contoh yang disebutkan di sini, tetapi juga bantuan dari IRC, saya mengembangkan skrip pengujian stres CPU saya sendiri. Ia menggunakan subkulit per utas dan teknik loop tanpa ujung. Anda juga dapat menentukan jumlah utas dan jumlah waktu secara interaktif.

#!/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
MirceaKitsune
sumber
mendapatkan kesalahan "baris 14: tasket: perintah tidak ditemukan" di skrip Anda! ada ide?
user2912312
2

Memanfaatkan gagasan di sini, membuat kode yang keluar secara otomatis setelah durasi yang ditentukan, tidak harus mematikan proses -

#!/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
Dhiraj
sumber
1

Ini berguna bagi saya:

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

dan tidak menggunakan apa pun kecuali bash.

ZyX
sumber
1

Untuk meningkatkan jawaban dimba dan memberikan sesuatu yang lebih pluggable (karena saya membutuhkan sesuatu yang serupa). Saya telah menulis yang berikut ini menggunakan konsep load-up dd: D

Ini akan memeriksa inti saat ini, dan membuat banyak utas dd. Mulai dan Akhiri beban inti dengan 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
knope
sumber
0

Saya menggabungkan beberapa jawaban dan menambahkan cara untuk mengukur tekanan pada semua CPU yang tersedia:

#!/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
joecks
sumber
0

Dimba dd if=/dev/zero of=/dev/nullsudah pasti benar, tetapi juga patut disebutkan adalah memverifikasi maxing cpu untuk penggunaan 100%. Anda dapat melakukannya dengan

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

Ini meminta output ps dari rata-rata 1 menit penggunaan cpu oleh setiap proses, lalu menjumlahkannya dengan awk. Walaupun rata-rata 1 menit, ps cukup pintar untuk mengetahui apakah suatu proses hanya sekitar beberapa detik dan menyesuaikan jendela waktu yang sesuai. Dengan demikian Anda dapat menggunakan perintah ini untuk segera melihat hasilnya.

profilprofil
sumber
0

untuk menambah beban atau mengonsumsi CPU 100%

sha1sum /dev/zero &

maka Anda dapat melihat penggunaan CPU dengan mengetik perintah

top

untuk melepaskan beban

killall sha1sum
44kk sharma
sumber
-1

Cukup tempelkan bocah nakal ini ke SSH atau konsol server mana pun yang menjalankan linux. Anda dapat mematikan proses secara manual, tetapi saya baru saja mematikan server setelah saya selesai, lebih cepat.

Sunting: Saya telah memperbarui skrip ini untuk sekarang memiliki fitur pengatur waktu sehingga tidak perlu mematikan proses.

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
GarretSidzaka
sumber