ฉันจะสร้างโหลด CPU สูงบนเซิร์ฟเวอร์ Linux ได้อย่างไร


161

ขณะนี้ฉันกำลังแก้ไขข้อบกพร่องในการติดตั้ง Cactiและต้องการสร้างโหลด CPU เพื่อดีบักกราฟการใช้งาน CPU ของฉัน

ฉันพยายามเรียกใช้cat /dev/zero > /dev/nullซึ่งใช้งานได้ดี แต่ใช้ 1 คอร์เท่านั้น:

ป้อนคำอธิบายรูปภาพที่นี่

มีวิธีที่ดีกว่าในการทดสอบ / เพิ่มทรัพยากรระบบภายใต้โหลดหรือไม่

ที่เกี่ยวข้อง: ฉันจะสร้างโหลด CPU สูงบน Windows ได้อย่างไร


1
เป็นไปได้หรือไม่ที่จะรันcatพร้อมกันหลายอินสแตนซ์?
Nate Koppenhaver

@NateKoppenhaver: ใช่ว่าดูเหมือนจะเป็นไปได้เมื่อห่อไว้ในscreenเซสชัน แต่ฉันต้องการทางออกที่ซับซ้อนกว่านี้ถ้าเป็นไปได้
Der Hochstapler

1
cat /dev/random > /dev/nullหึผมใช้เสมอ เดาว่า/dev/zeroทำงานเกินไป :-)
oKtosiTe

8
@oKtosiTe cat / dev / random มีผลข้างเคียงของการลดระดับเอนโทรปีใน / dev / random มีหลายครั้งที่คุณต้องอนุรักษ์เอนโทรปีฉันจะไม่ทำแบบนี้กับการไปที่ซีพียูหมู
Rich Homolka

4
@oKtosiTe สิ่งที่ Rich Homolka พูดถูก แต่ไม่ใช่แค่ว่ามันเป็นสิ่งที่ไม่ดีที่ต้องทำมันยังไร้ประโยชน์เพราะมันจะบล็อกเกือบจะในทันทีและหยุดกินซีพียู
Luc

คำตอบ:


187

ลองstress มันเทียบเท่ากับ Windows consume.exe:

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

22
บน Ubuntu คุณสามารถติดตั้งได้ด้วยsudo apt-get install stress
ben

14
เมื่อ debian wheezy เกินไป
enapupe

10
ใน Fedorasudo yum install stress
Christopher Markieta

16
Arch:sudo pacman -S stress
das_j

9
brew install stressบน OS X
Christian Long

94

ไม่จำเป็นต้องติดตั้งแพ็กเกจพิเศษใด ๆ เชลล์เก่าที่ดีของคุณสามารถทำมันได้ด้วยตัวเอง

หนึ่งซับนี้จะโหลดสี่คอร์ของคุณ1ที่ 100%:

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

วิธีการทำงานค่อนข้างง่ายเริ่มสี่ลูปไม่มีที่สิ้นสุด แต่ละคนกำลังทำซ้ำคำสั่ง null ( :) แต่ละลูปสามารถโหลดซีพียูคอร์ได้ที่ 100%

ถ้าคุณใช้bash, ksh93และเปลือกหอยอื่น ๆ ที่สนับสนุนช่วง (เช่นไม่dashแก่กว่าหรือksh), คุณสามารถใช้ไวยากรณ์แบบพกพานี้ไม่ใช่:

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

แทนที่ที่มีจำนวนของซีพียูที่คุณต้องการในการโหลดถ้าแตกต่างจาก44

สมมติว่าคุณไม่มีงานพื้นหลังทำงานอยู่เมื่อคุณเปิดใช้งานหนึ่งในลูปเหล่านี้คุณสามารถหยุดการสร้างโหลดด้วยคำสั่งนั้น:

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

ตอบความคิดเห็นของ @ underscore_d นี่คือรุ่นที่ปรับปรุงซึ่งทำให้การหยุดโหลดง่ายขึ้นและยังอนุญาตให้ระบุการหมดเวลา (เริ่มต้น 60 วินาที) A Control- Cจะฆ่าลูปทั้งหมดด้วย ฟังก์ชั่นเปลือกนี้ทำงานอย่างน้อยภายใต้และbashksh

# 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 โปรดทราบว่าด้วย CPU ที่รองรับมากกว่าหนึ่งเธรดต่อหนึ่งคอร์ (Hyper-threading) ระบบปฏิบัติการจะส่งโหลดไปยัง CPU เสมือนทั้งหมด ในกรณีนั้นพฤติกรรมโหลดขึ้นอยู่กับการใช้งาน (แต่ละเธรดอาจถูกรายงานว่าไม่ว่าง 100% หรือไม่) .


ขอบคุณ แต่&ทำให้คำสั่งทำงานในเธรดแยกหรือคอร์แยกกันหรือไม่ ฉันสับสน.
mmdemirbas

3
@mmdemirbas: เครื่องหมายและทำให้คำสั่งทำงานเป็นกระบวนการแยกต่างหาก ตัวกำหนดตารางเวลาจะส่งกระบวนการที่ใช้งานอยู่ทั้งหมดไปยังแกนที่มีอยู่ทั้งหมด
jlliagre

1
เพื่อเป็นการเตือนคุณสามารถหยุดการทดสอบนี้ได้โดยการออกkillall bashให้ตรวจสอบให้แน่ใจว่าคุณไม่มีสคริปต์ที่สำคัญอื่น ๆ ทำงานอยู่ในขณะนั้น
coder

1
@ acoder ขอบคุณที่แนะนำวิธีการสิ้นสุดการวนซ้ำ killall bashแต่ฉันจะหลีกเลี่ยง ตอบแก้ไขเพื่อเพิ่มวิธีที่ปลอดภัยกว่าเพื่อยุติการสร้างโหลด
jlliagre

1
+1 สำหรับฟังก์ชั่น lc shell
Akira Yamamoto

20

ฉันสร้างสคริปต์หลามอย่างง่ายซึ่งทำเช่นเดียวกัน คุณสามารถควบคุมจำนวนแกน cpu ที่คุณต้องการโหลด สิ่งที่ดีเกี่ยวกับเรื่องนี้คือมันจะไม่ใช้ทรัพยากรอื่นนอกเหนือจาก cpu (ฉันคิดว่าความคิดของมาร์คจอห์นสันจะใช้ทรัพยากร I / O จำนวนมากซึ่งไม่พึงประสงค์ที่นี่)

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

$ python temp1.pyเพียงแค่เรียกใช้สคริปต์นี้จากท่าเรือ คุณต้องฆ่าสคริปต์เมื่อเสร็จแล้ว

นี่คือปริมาณการใช้ซีพียูของฉันเมื่อฉันโหลด 3 คอร์ของฉัน

สคริปต์ temp1.py สร้างสามกระบวนการ (PID - 9377, 9378, 9379) ซึ่งโหลด 3 คอร์ของฉัน


3
คุณใช้โปรแกรมใดในการแสดงการใช้งาน CPU เช่นนี้ มันทำให้ฉันนึกถึงด้านบน แต่ฉันไม่จำ 'แผนภูมิ' ของ CPU
jftuga

13
@jftuga อาจhtop , ด้านบนพี่ชายสวย 's
BoppreH

2
ใช่มันเป็นฮอปส์ เวลาจริงที่ดีที่สุดโปรแกรมดูกระบวนการแบบโต้ตอบที่มีสีสันสำหรับ linux - htop.sourceforge.net
Pushpak Dagade

3
ไม่ได้ให้ความสนใจและวิ่งบนกล่อง Windows สิ่งที่เลวร้ายมาก ...
Derrick

13

ทางเลือกหนึ่งก็คือ

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

หรือ (ถ้ามี nproc)

openssl speed -multi $(nproc --all)

OpenSSL มีอยู่เกือบทุกวันนี้ distros ดังนั้นจึงไม่จำเป็นต้องมีแพ็คเกจเพิ่มเติม


8

เริ่มต้นสอง

sha1sum /dev/zero &

คำสั่งสำหรับทุกคอร์ในระบบของคุณ

เพื่อหยุด

killall sha1sum

หรือ

kill sha1sum

7

ฉันมักจะใช้ชุด cpuburn:

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

แทนที่ 4 ด้วยจำนวนแกน / HT- เธรดที่คุณมีหรือต้องการความเครียด

หมายเหตุ: สิ่งนี้จะเน้นพื้นที่ชิปมากที่สุดเท่าที่จะเป็นไปได้ในเวลาเดียวกันมันถูกตั้งโปรแกรมให้สร้างการกระจายพลังงานสูงสุด ฉันต้องเขียนโพสต์นี้เป็นครั้งที่สองอย่างใดเครื่องของฉันไม่ชอบ :-(

คุณสามารถทำ cpuburn ตามลำดับ:

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

และเมื่อคุณต้องการหยุดพวกเขา:

killall burnP6

คุณสามารถคูณburnP6 &เพื่อให้ตรงกับจำนวนแกน CPU ในระบบของคุณ


6

ฉันได้พัฒนา stress-ng ซึ่งเป็นเครื่องมือสร้างความเครียดที่ได้รับการปรับปรุงซึ่งสามารถเน้นในแง่มุมต่าง ๆ ของระบบ Linux สำหรับข้อมูลเพิ่มเติมดูที่http://kernel.ubuntu.com/~cking/stress-ng/

การใช้งานคล้ายกับความเครียด

$ 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

ติดตั้งด้วย

sudo apt-get install stress-ng

6
โปรดอ่านฉันจะแนะนำซอฟต์แวร์สำหรับเคล็ดลับเกี่ยวกับวิธีการแนะนำซอฟต์แวร์ได้อย่างไร อย่างน้อยที่สุดคุณควรให้มากกว่า / ลิงก์อย่างน้อยตัวอย่างเช่นข้อมูลเพิ่มเติมบางอย่างเกี่ยวกับตัวซอฟต์แวร์และวิธีการใช้เพื่อแก้ไขปัญหาในคำถาม
DavidPostill

3

คุณสามารถเรียกใช้คำสั่งนั้นได้หลายครั้งตามที่ต้องการและจะใช้แกนที่แตกต่างกันในแต่ละครั้ง:

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

1
นั่นจะไม่ทำให้การยุติกระบวนการยุ่งยากหรือไม่?
oKtosiTe

1
killall catควรทำมัน
Christian Mann

1
ขึ้นอยู่กับว่าคุณมีcatกระบวนการอื่นที่กำลังทำงานอยู่หรือเปล่า
oKtosiTe

2

https://github.com/GaetanoCarlucci/CPULoadGenerator

วิธีการแก้ปัญหาที่ค่อนข้างง่ายและทางวิทยาศาสตร์

ที่นี่คุณสามารถดูตัวอย่างพลศาสตร์ที่สร้างโหลด 50% บน CPU core 0:

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถเรียกใช้กระบวนการบนแกนอื่น ๆ ในเวลาเดียวกัน


1

ฉันรวมทั้ง + jlliagre และ + 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

คุณสามารถใช้ได้:

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

ทำซ้ำdd if=/dev/zero of=/dev/nullสำหรับแกน CPU ของคุณ

กดปุ่มใดก็ได้เพื่อหยุดการทดสอบ


1

pxzxzเป็นการนำแบบขนาน

pxz -9e /dev/zero --stdout >/dev/null ควรทำเคล็ดลับเนื่องจากเป็นซีพียูที่ค่อนข้างเข้มข้น

ถ้า/dev/zeroไม่เร็วพอ (คุณสังเกตเห็นว่าpxzได้รับ I / O ควบคุมปริมาณ) คุณสามารถทำได้ pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null

รุ่นใหม่ของxzมีตัวเลือกซึ่งเป็นทดแทน--threadspxz


1

นี่คือวิธีที่ฉันใช้และไม่จำเป็นต้องติดตั้งอะไรเพิ่มเติม

ตัวอย่างเช่นเริ่มต้นด้วย 4 กระบวนการ

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

คุณสามารถเปลี่ยนจำนวนกระบวนการได้โดยใช้ตัวเลือก "-P" ด้านบน


0

บรรทัดคำสั่งง่ายๆก็ทำเช่นกัน:

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

1
จะง่ายกว่านี้:while : ; do : ; done
jlliagre

@jlliagre ของคุณจะไม่ไปสูงกว่า loadavg 1
ott--

ลูปของคุณไม่ได้โหลดซีพียูเป็นหลัก แต่เต็มไปด้วยหน่วยความจำ ในที่สุดมันจะทำงานล้มเหลวโดยมีข้อผิดพลาดหน่วยความจำไม่เพียงพอ
jlliagre

@jlliagre Mine เติมหน่วยความจำและ swap (ถ้ามี) ดังนั้นจะสร้างโหลด 3 ก่อนที่มันจะถูกฆ่าเพราะหน่วยความจำไม่เพียงพอ
ott--

4
นั่นแหละปัญหา. คุณไม่ได้ตอบคำถามที่ถามซึ่งเป็นวิธีการสร้าง CPU ที่โหลดสูงบนเซิร์ฟเวอร์ สคริปต์ของคุณกำลังทำให้ระบบไม่ตอบสนองอย่างรวดเร็วแล้วจึงขัดข้อง มีวิธีที่เชื่อถือได้มากขึ้นในการรับ loadavg ของ 3 เช่น:for i in 1 2 3; do while : ; do : ; done & ; done
jlliagre

0

ฉันต้องการเพิ่มสิ่งนี้ในความคิดเห็นของ @ jlliagre แต่ฉันไม่มีชื่อเสียงเพียงพอ หากคุณจะใช้รหัสนี้ในเซิร์ฟเวอร์หลายเครื่องและจำนวน CPU จะแตกต่างกันคุณสามารถใช้คำสั่งต่อไปนี้:

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

สิ่งนี้จะใช้คอร์ทั้งหมดบนเซิร์ฟเวอร์ของคุณโดยไม่คำนึงว่าคุณมีจำนวนเท่าใด คำสั่งnprocเป็นส่วนหนึ่งของ coreutils ดังนั้นควรอยู่ในการติดตั้ง Linux ส่วนใหญ่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.