Làm cách nào tôi có thể tạo tải CPU cao trên máy chủ Linux?


159

Tôi hiện đang trong quá trình gỡ lỗi cài đặt Cacti và muốn tạo tải CPU để gỡ lỗi biểu đồ sử dụng CPU của tôi.

Tôi đã cố gắng đơn giản để chạy cat /dev/zero > /dev/null, hoạt động tuyệt vời nhưng chỉ sử dụng 1 lõi:

nhập mô tả hình ảnh ở đây

Có một phương pháp tốt hơn để kiểm tra / tối đa hóa tài nguyên hệ thống đang tải không?

Liên quan: Làm cách nào tôi có thể tạo tải CPU cao trên Windows?


1
Có thể chạy nhiều phiên bản catcùng một lúc không?
Nate Koppenhaver

@NateKoppenhaver: Vâng, điều đó dường như là có thể khi gói chúng trong screencác phiên. Nhưng tôi thích một giải pháp tinh vi hơn nếu có thể.
Der Hochstapler

1
Heh, tôi luôn luôn sử dụng cat /dev/random > /dev/null. Đoán /dev/zerolàm việc quá. :-)
oKtosiTe

8
@oKtosiTe cat / dev / ngẫu nhiên có tác dụng phụ làm cạn kiệt entropy trong / dev / ngẫu nhiên. Có những lúc bạn cần bảo tồn entropy, tôi sẽ không có điều này khi tôi đi CPU hog.
Rich Homolka

4
@oKtosiTe Những gì Rich Homolka nói là đúng, nhưng nó không chỉ là điều xấu mà còn vô dụng vì nó sẽ chặn gần như ngay lập tức và ngừng tiêu thụ cpu.
Luc

Câu trả lời:


185

Hãy dùng thử stress Nó tương đương với Windows consume.exe:

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

21
trên Ubuntu, bạn có thể cài đặt vớisudo apt-get install stress
ben

13
trên debian khò khè quá.
enapupe

9
Trên Fedora,sudo yum install stress
Christopher Markieta

15
Arch:sudo pacman -S stress
das_j

8
brew install stresstrên OS X
Christian Long

93

Không cần phải cài đặt bất kỳ gói bổ sung, vỏ cũ tốt của bạn có thể làm điều đó một mình.

Lớp lót này sẽ tải bốn lõi 1 của bạn với tỷ lệ 100%:

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

Cách thức hoạt động khá đơn giản, nó bắt đầu bốn vòng lặp vô tận. Mỗi người trong số họ đang lặp lại lệnh null ( :). Mỗi vòng lặp có thể tải lõi CPU ở mức 100%.

Nếu bạn sử dụng bash, ksh93và vỏ khác hỗ trợ phạm vi, (tức là không dashtrở lên ksh), bạn có thể sử dụng cú pháp di động phi này:

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

Thay thế 4bằng số lượng CPU bạn muốn tải nếu khác với 4.

Giả sử bạn không có công việc nền nào đã chạy khi bạn khởi chạy một trong các vòng lặp này, bạn có thể dừng việc tạo tải bằng lệnh đó:

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

Trả lời bình luận của @ underscore_d, đây là phiên bản nâng cao giúp đơn giản hóa rất nhiều việc dừng tải và cũng cho phép chỉ định thời gian chờ (mặc định là 60 giây.) A Control- Ccũng sẽ giết tất cả các vòng chạy trốn. Hàm shell này hoạt động ít nhất dưới 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 Lưu ý rằng với các CPU hỗ trợ nhiều hơn một luồng cho mỗi lõi (Siêu phân luồng), HĐH sẽ gửi tải cho tất cả các CPU ảo. Trong trường hợp đó, hành vi tải phụ thuộc vào việc triển khai (mỗi luồng có thể được báo cáo là bận 100% hay không). .


Cảm ơn, nhưng &gây ra một lệnh để chạy trong một luồng riêng biệt hoặc lõi riêng biệt ? Tôi bị bối rối.
mmdemirbas

3
@mmdemirbas: Dấu và làm cho lệnh chạy như một tiến trình riêng biệt. Bộ lập lịch sau đó sẽ gửi tất cả các quy trình hoạt động đến tất cả các lõi có sẵn.
jlliagre

1
Xin nhắc lại, bạn có thể dừng thử nghiệm này bằng cách phát hành killall bash- chỉ cần đảm bảo rằng bạn không có bất kỳ tập lệnh quan trọng nào khác đang chạy vào thời điểm đó.
một lập trình viên

1
@acoder Cảm ơn bạn đã gợi ý cách kết thúc vòng lặp. Tuy nhiên tôi sẽ tránh killall bash. Trả lời chỉnh sửa để thêm một phương pháp an toàn hơn để kết thúc việc tạo tải.
jlliagre

1
+1 cho chức năng vỏ lc
Akira Yamamoto

20

Tôi đã tạo một kịch bản python đơn giản mà làm như vậy. Bạn có thể kiểm soát số lượng lõi cpu bạn muốn tải. Điều tốt về điều này là nó sẽ không tiêu thụ bất kỳ tài nguyên nào khác ngoài cpu. (Tôi nghĩ rằng ý tưởng của Mark John sẽ tiêu tốn rất nhiều tài nguyên I / O, điều không mong muốn ở đây.)

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

Chỉ cần chạy tập lệnh này từ thiết bị đầu cuối $ python temp1.py. Bạn cần phải giết tập lệnh khi bạn hoàn thành.

Đây là đầu ra tiêu thụ cpu của tôi khi tôi tải 3 lõi.

Script temp1.py tạo ba quy trình (PID - 9377, 9378, 9379) tải 3 lõi của tôi


3
Bạn đã sử dụng chương trình nào để hiển thị việc sử dụng CPU như thế này? Nó nhắc tôi về top, nhưng tôi không nhớ CPU 'biểu đồ'.
jftuga

13
@jftuga có lẽ htop , anh trai xinh hơn của top .
BoppreH

2
vâng, nó htop. Thời gian thực tốt nhất, trình xem quá trình tương tác đầy màu sắc cho linux - htop.sourceforge.net
Pushpak Dagade

3
Không chú ý và chạy nó trên một hộp Windows. Những điều rất tệ ...
Derrick

13

Một cách khác là

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

hoặc (nếu nproc có mặt)

openssl speed -multi $(nproc --all)

OpenSSL hầu như luôn có mặt trên các bản phát hành hiện nay, vì vậy không cần thêm gói nào.


8

Bắt đầu hai

sha1sum /dev/zero &

lệnh cho mọi lõi trong hệ thống của bạn.

Dừng lại

killall sha1sum

hoặc là

kill sha1sum

7

Tôi thường lấy bộ cpuburn:

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

Thay thế 4 bằng số lõi / luồng HT bạn có hoặc muốn nhấn mạnh.

Lưu ý: Điều này nhấn mạnh càng nhiều diện tích chip càng tốt, nó được lập trình để tạo ra sự tiêu hao năng lượng tối đa. Tôi đã phải viết bài đăng này lần thứ hai, bằng cách nào đó máy của tôi không thích nó :-(

Bạn cũng có thể thực hiện cpuburn theo trình tự:

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

Và khi bạn muốn ngăn chặn chúng:

killall burnP6

Bạn cũng có thể nhân lên burnP6 &để phù hợp với số lượng lõi CPU trên hệ thống của bạn.


6

Tôi đã phát triển stress-ng, một công cụ căng thẳng được cập nhật có thể nhấn mạnh một loạt các khía cạnh của hệ thống Linux. Để biết thêm thông tin, hãy xem http://kernel.ubfox.com/~cking/stress-ng/

Cách sử dụng tương tự như căng thẳ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

Cài đặt với

sudo apt-get install stress-ng

6
Vui lòng đọc Làm thế nào để tôi giới thiệu phần mềm cho một số mẹo về cách bạn nên giới thiệu phần mềm. Ít nhất bạn nên cung cấp nhiều hơn chỉ / ít nhất là một liên kết, ví dụ như một số thông tin bổ sung về chính phần mềm và cách nó có thể được sử dụng để giải quyết vấn đề trong câu hỏi.
DavidPostill

3

Bạn có thể chạy lệnh đó bao nhiêu lần tùy ý và nó sẽ chiếm một lõi khác nhau mỗi lần:

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

1
Điều đó có khiến việc chấm dứt các quá trình gặp chút rắc rối không?
oKtosiTe

1
killall catHãy làm nó.
Christian Mann

1
Tùy thuộc vào việc bạn có các catquy trình khác đang chạy hay không (tôi thường làm).
oKtosiTe


1

Tôi đã kết hợp cả + jlliagre và + 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

Bạn có thể dùng:

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

Lặp lại dd if=/dev/zero of=/dev/nullcho lõi CPU của bạn.

Nhấn bất kỳ phím nào để dừng bài kiểm tra.


1

Đây là cách tôi sử dụng và không cần phải cài đặt thêm bất cứ thứ gì.

Ví dụ: bắt đầu với 4 quy trình,

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

Bạn có thể thay đổi số lượng quy trình bằng tùy chọn "-P" ở trên.


0

Một dòng lệnh đơn giản cũng làm điều đó:

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

1
Điều này sẽ đơn giản hơn:while : ; do : ; done
jlliagre

@jlliagre Bạn sẽ không vượt quá loadavg 1.
ott--

Vòng lặp của bạn không chủ yếu tải CPU nhưng làm đầy bộ nhớ hơn. Cuối cùng nó sẽ sụp đổ với lỗi hết bộ nhớ.
jlliagre

@jlliagre Mine lấp đầy bộ nhớ và trao đổi (nếu có), do đó tạo ra tải 3 trước khi nó bị giết vì hết bộ nhớ.
ott--

4
Đó chính là vấn đề. Bạn không trả lời câu hỏi được hỏi đó là cách tạo ra tải CPU cao trên máy chủ. Kịch bản của bạn đang nhanh chóng làm cho một hệ thống không phản hồi và sau đó gặp sự cố. Có nhiều cách đáng tin cậy hơn để có được loadavg là 3. ví dụ:for i in 1 2 3; do while : ; do : ; done & ; done
jlliagre

0

pxzlà một thực hiện song song của xz.

pxz -9e /dev/zero --stdout >/dev/null Nên thực hiện các mẹo, vì điều này là khá cpu chuyên sâu.

Nếu /dev/zerokhông đủ nhanh (bạn nhận thấy rằng điều chỉnh pxzI / O) bạn có thể làm pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null

Các phiên bản mới hơn xz--threadstùy chọn thay thế pxz.


0

Tôi muốn thêm điều này vào bình luận của @ jlliagre, nhưng tôi không có đủ danh tiếng. Nếu bạn sẽ sử dụng mã này trên nhiều máy chủ và số lượng CPU sẽ thay đổi, bạn có thể sử dụng lệnh sau:

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

Điều này sẽ sử dụng tất cả các lõi trên máy chủ của bạn bất kể bạn có bao nhiêu. Lệnh nprocnày là một phần của coreutils, do đó, nên có trên hầu hết các bản cài đặt Linux.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.