Bagaimana saya bisa menghasilkan beban CPU yang tinggi di server Linux?


162

Saat ini saya sedang dalam proses debug instalasi Cacti dan ingin membuat beban CPU untuk debug grafik penggunaan CPU saya.

Saya mencoba menjalankannya cat /dev/zero > /dev/null, yang berfungsi dengan baik tetapi hanya menggunakan 1 inti:

masukkan deskripsi gambar di sini

Apakah ada metode yang lebih baik untuk menguji / memaksimalkan sumber daya sistem yang sedang dimuat?

Terkait: Bagaimana saya bisa menghasilkan beban CPU yang tinggi pada Windows?


1
Apakah mungkin menjalankan beberapa instance catsecara bersamaan?
Nate Koppenhaver

@NateKoppenhaver: Ya, itu tampaknya mungkin ketika membungkusnya dalam screensesi. Tapi saya lebih suka solusi yang lebih canggih jika memungkinkan.
Der Hochstapler

1
Heh, saya selalu pakai cat /dev/random > /dev/null. Tebak /dev/zerojuga berfungsi. :-)
oKtosiTe

8
@ oKtosiTe cat / dev / random memiliki efek samping menipiskan entropi di / dev / random. Ada saat-saat Anda perlu menghemat entropi, saya tidak akan memiliki ini sebagai saya pergi ke babi CPU.
Rich Homolka

4
@oKtosiTe Apa yang dikatakan Rich Homolka benar, tetapi bukan hanya itu hal yang buruk untuk dilakukan, itu juga tidak berguna karena akan segera memblokir dan berhenti mengkonsumsi cpu.
Luc

Jawaban:


188

Coba stress Ini hampir setara dengan Windows consume.exe:

oliver$ ./stress --cpu 3
stress: info: [18472] dispatching hogs: 3 cpu, 0 io, 0 vm, 0 hdd

22
di ubuntu, Anda dapat menginstal dengansudo apt-get install stress
ben

14
pada debian wheezy juga.
enapupe

10
Di Fedora,sudo yum install stress
Christopher Markieta

16
Lengkungan:sudo pacman -S stress
das_j

9
brew install stresspada OS X
Christian Long

95

Tidak perlu menginstal paket tambahan, shell lama Anda yang baik dapat melakukannya sendiri.

One-liner ini akan memuat empat core 1 Anda pada 100%:

for i in 1 2 3 4; do while : ; do : ; done & done

Cara kerjanya cukup sederhana, dimulai empat loop tanpa akhir. Masing-masing dari mereka mengulang instruksi nol ( :). Setiap loop dapat memuat inti CPU pada 100%.

Jika Anda menggunakan bash, ksh93dan rentang pendukung shell lainnya (yaitu tidak dashatau lebih lama ksh), Anda dapat menggunakan sintaksis non-portabel ini:

for i in {1..4}; do ...

Ganti 4dengan jumlah CPU yang ingin Anda muat jika berbeda 4.

Dengan asumsi Anda tidak memiliki pekerjaan latar belakang yang sudah berjalan ketika Anda meluncurkan salah satu dari loop ini, Anda dapat menghentikan pembuatan load dengan perintah itu:

for i in 1 2 3 4; do kill %$i; done

Menjawab komentar @ underscore_d, berikut adalah versi yang disempurnakan yang menyederhanakan banyak penghentian beban dan yang juga memungkinkan menentukan batas waktu (default 60 detik.) A Control- Cakan membunuh semua loop pelarian juga. Fungsi shell ini bekerja setidaknya di bawah bashdan ksh.

# Usage: lc [number_of_cpus_to_load [number_of_seconds] ]
lc() {
  (
    pids=""
    cpus=${1:-1}
    seconds=${2:-60}
    echo loading $cpus CPUs for $seconds seconds
    trap 'for p in $pids; do kill $p; done' 0
    for ((i=0;i<cpus;i++)); do while : ; do : ; done & pids="$pids $!"; done
    sleep $seconds
  )
}

1 Perhatikan bahwa dengan CPU yang mendukung lebih dari satu thread per core (Hyper-threading), OS akan mengirimkan beban ke semua CPU virtual. Dalam hal itu, perilaku beban tergantung pada implementasi (setiap utas mungkin dilaporkan 100% sibuk atau tidak). .


Terima kasih, tetapi &menyebabkan perintah dijalankan di utas terpisah atau inti terpisah ? Saya bingung.
mmdemirbas

3
@mmdemirbas: Ampersand menyebabkan perintah dijalankan sebagai proses terpisah. Penjadwal kemudian mengirimkan semua proses aktif ke semua core yang tersedia.
jlliagre

1
Sebagai pengingat, Anda dapat menghentikan tes ini dengan menerbitkan killall bash- pastikan Anda tidak memiliki skrip penting yang sedang berjalan saat itu.
seorang pembuat kode

1
@acoder Terima kasih telah menyarankan cara untuk mengakhiri loop. Namun saya akan menghindari killall bash. Jawaban diedit untuk menambahkan metode yang lebih aman untuk mengakhiri pembuatan beban.
jlliagre

1
+1 untuk fungsi shell lc
Akira Yamamoto

20

Saya membuat skrip python sederhana yang melakukan hal yang sama. Anda dapat mengontrol jumlah inti cpu yang ingin Anda muat. Hal yang baik tentang ini adalah ia tidak akan mengkonsumsi sumber daya lain selain cpu. (Saya pikir ide mark johnson akan menghabiskan banyak sumber daya I / O, yang tidak diinginkan di sini.)

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

Jalankan skrip ini dari terminal $ python temp1.py. Anda harus membunuh skrip saat selesai.

Di sini, adalah output konsumsi cpu saya ketika saya memuat 3 core saya.

Script temp1.py membuat tiga proses (PID - 9377, 9378, 9379) yang memuat 3 inti saya


3
Program apa yang Anda gunakan untuk menampilkan penggunaan CPU seperti ini? Ini mengingatkan saya pada yang teratas, tapi saya tidak ingat 'grafik' CPU.
jftuga

13
@jftuga mungkin htop , atas saudara 's lebih cantik.
BoppreH

2
ya itu htop. Waktu nyata terbaik, penampil proses interaktif berwarna-warni untuk linux - htop.sourceforge.net
Pushpak Dagade

3
Tidak memperhatikan dan menjalankan ini di kotak Windows. Hal-hal yang sangat buruk ...
Derrick

13

Salah satu cara alternatif adalah

openssl speed -multi $(grep -ci processor /proc/cpuinfo)

atau (jika nproc ada)

openssl speed -multi $(nproc --all)

OpenSSL hampir selalu hadir di distro saat ini, jadi tidak perlu paket tambahan.


8

Mulai dua

sha1sum /dev/zero &

perintah untuk setiap inti di sistem Anda.

Untuk berhenti

killall sha1sum

atau

kill sha1sum

7

Saya biasanya mengambil suite cpuburn:

sudo apt-get install cpuburn
for i in {1..4}; do burnK7 & done

Ganti 4 dengan jumlah inti / HT-utas yang Anda miliki atau ingin Anda tekankan.

Catatan: Ini menekankan area chip sebanyak mungkin pada saat yang sama, ini diprogram untuk menghasilkan disipasi daya maksimum. Saya harus menulis posting ini untuk yang kedua kalinya, entah bagaimana mesin saya tidak menyukainya :-(

Anda juga bisa melakukan cpuburn secara berurutan:

burnP6 & burnP6 & burnP6 & burnP6 & 
[1] 28520
[2] 28521
[3] 28522
[4] 28523

Dan ketika Anda ingin menghentikan mereka:

killall burnP6

Anda juga bisa menggandakan burnP6 &agar sesuai dengan jumlah inti CPU di sistem Anda.


6

Saya telah mengembangkan stress-ng, alat stress terbaru yang dapat menekankan berbagai aspek dari sistem Linux. Untuk informasi lebih lanjut, lihat http://kernel.ubuntu.com/~cking/stress-ng/

Penggunaannya mirip dengan stres

$ 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

Instal dengan

sudo apt-get install stress-ng

6
Silakan baca Bagaimana saya merekomendasikan perangkat lunak untuk beberapa tips tentang bagaimana Anda harus merekomendasikan perangkat lunak. Paling tidak Anda harus memberikan lebih dari sekadar / setidaknya tautan, misalnya beberapa informasi tambahan tentang perangkat lunak itu sendiri, dan bagaimana itu dapat digunakan untuk menyelesaikan masalah dalam pertanyaan.
DavidPostill

3

Anda dapat menjalankan perintah itu sebanyak yang Anda inginkan, dan itu akan mengambil inti yang berbeda setiap kali:

$ CORES=1
$ for i in `seq 1 $CORES`; do cat /dev/zero > /dev/null &
> done
[1] 8388

1
Bukankah itu membuat proses penghentian sedikit merepotkan?
oKtosiTe

1
killall catharus melakukannya.
Christian Mann

1
Tergantung pada apakah Anda memiliki catproses lain yang berjalan (biasanya saya lakukan).
oKtosiTe


1

Saya menggabungkan + jlliagre dan + 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 $@

1

Anda dapat gunakan:

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 dd if=/dev/zero of=/dev/nulluntuk core CPU Anda.

Tekan tombol apa saja untuk menghentikan tes.


1

pxzadalah implementasi paralel dari xz.

pxz -9e /dev/zero --stdout >/dev/null harus melakukan trik, karena ini cukup cpu intensif.

Jika /dev/zerotidak cukup cepat (Anda perhatikan bahwa pxzI / O tercekik) dapat Anda lakukan pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null

Versi yang lebih baru xzmemiliki --threadsopsi yang merupakan pengganti pxz.


1

Inilah cara saya menggunakan dan tidak perlu menginstal apa pun tambahan.

Misalnya untuk memulai dengan 4 proses,

nproc | xargs seq | xargs -n1 -P4 md5sum /dev/zero

Anda dapat mengubah jumlah proses dengan opsi "-P" di atas.


0

Baris perintah sederhana juga melakukannya:

x="x" ; while : ; do x=$x$x ; echo -n "." ; done

1
Ini akan menjadi lebih sederhana:while : ; do : ; done
jlliagre

@jlliagre Anda tidak akan pergi di atas loadavg 1.
ott--

Loop Anda tidak terutama memuat CPU tetapi lebih banyak mengisi memori. Ini akhirnya akan crash dengan kehabisan memori kesalahan.
jlliagre

@jlliagre Mine mengisi memori dan menukar (jika ada), sehingga menghasilkan beban 3 sebelum dimatikan karena kehabisan memori.
ott--

4
Itulah masalahnya. Anda tidak menjawab pertanyaan yang diajukan yaitu bagaimana cara menghasilkan beban CPU yang tinggi di server. Script Anda dengan cepat membuat sistem tidak responsif dan kemudian macet. Ada banyak cara yang lebih dapat diandalkan untuk mendapatkan loadavg dari 3. misalnya:for i in 1 2 3; do while : ; do : ; done & ; done
jlliagre

0

Saya ingin menambahkan ini ke komentar @ jlliagre, tetapi saya tidak memiliki reputasi yang cukup. Jika Anda akan menggunakan kode ini di beberapa server dan jumlah CPU akan bervariasi, Anda dapat menggunakan perintah berikut:

for ((i=1; i<=`nproc --all`; i++)); do while : ; do : ; done & done

Ini akan memanfaatkan semua core di server Anda terlepas dari berapa banyak yang Anda miliki. Perintah nprocini adalah bagian dari coreutils sehingga harus di sebagian besar instalasi Linux.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.