Câu hỏi Làm thế nào tôi có thể tạo ra tải CPU cao trên một máy chủ Linux?


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 đồ thị sử dụng CPU của tôi.

Tôi cố gắng chạy cat /dev/zero > /dev/null, hoạt động tốt nhưng chỉ sử dụng 1 lõi:

enter image description here

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

Liên quan: Làm thế nào tôi có thể sản xuất tải CPU cao trên Windows?


140
2018-06-30 17:13


gốc


có thể chạy nhiều phiên bản cat đồng thời? - Nate Koppenhaver
@NateKoppenhaver: Có, điều đó có vẻ là có thể khi gói chúng vào screen phiên. Nhưng tôi thích một giải pháp phức tạp hơn nếu có thể. - Der Hochstapler
Heh, tôi luôn sử dụng cat /dev/random > /dev/null. Phỏng đoán /dev/zero cũng vậy. :-) - oKtosiTe
@oKtosiTe cat / dev / random có ​​tác dụng phụ làm cạn kiệt entropy trong / dev / random. Có lần bạn cần phải bảo tồn entropy, tôi sẽ không có điều này như tôi đi đến CPU hog. - Rich Homolka
@oKtosiTe Những gì Rich Homolka nói là đúng, nhưng nó không chỉ là nó là một điều xấu để làm, nó cũng vô ích bởi vì nó sẽ chặn gần như ngay lập tức và ngừng tiêu thụ CPU. - Luc


Các câu trả lời:


Thử stress Nó khá giống với Windows consume.exe:

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

160
2018-06-30 17:27



trên ubuntu, bạn có thể cài đặt bằng sudo apt-get install stress - ben
trên debian wheezy quá. - enapupe
Trên Fedora, sudo yum install stress - Christopher Markieta
Arch: sudo pacman -S stress - das_j
brew install stress trên OS X - Christian Long


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

Một lớp lót này sẽ tải bốn lõi của bạn ở mức 100%:

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

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

Nếu bạn dùng bash, ksh93 và các hệ vỏ khác hỗ trợ dải ô, (tức là không dash đặt hàng ksh), bạn có thể sử dụng cú pháp không di động này:

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

Thay thế 4 với 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ể ngừng tạo tải bằng lệnh đó:

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

Trả lời nhận xét của @ underscore_d, đây là phiên bản nâng cao giúp đơn giản hóa 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 Điều khiển- -C 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 theo bash và 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
  )
}

82
2017-07-01 14:55



Cám ơn, nhưng mà & gây ra một lệnh để chạy trong một sợi chỉ hoặc tách biệt cốt lõi? Tôi bị bối rối. - mmdemirbas
@mmdemirbas: Dấu và làm cho lệnh chạy dưới dạng một quy trình riêng biệt. Trình lên lịch sau đó sẽ gửi tất cả các quy trình hoạt động tới tất cả các lõi có sẵn. - jlliagre
Xin nhắc lại, bạn có thể ngừng kiểm tra này bằng cách phát hành killall bash - chỉ cần đảm bảo 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 đó. - a coder
@acoder Cảm ơn bạn đã đề xuất một 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
hoặc đơn giản là kết thúc chúng với fg ctrl + c, 4 lần. - Blauhirn


Tôi đã thực hiện 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õ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ĩ ý tưởng của johnson đánh dấu sẽ tiêu thụ rất nhiều tài nguyên I / O, vốn không được mong đợi ở đâ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 các kịch bản khi bạn đang thực hiện.

Ở đây, sản lượng tiêu thụ cpu của tôi khi tôi tải 3 lõi của tôi.

Script temp1.py creates three processes (PIDs - 9377, 9378, 9379) which load 3 of my cores


18
2018-06-30 17:56



Bạn đã sử dụng chương trình nào để hiển thị mức sử dụng CPU như thế này? Nó làm tôi nhớ đến hàng đầu, nhưng tôi không nhớ lại các biểu đồ của CPU. - jftuga
@jftuga có lẽ htop, hàng đầuAnh trai xinh đẹp hơn. - BoppreH
có htop của nó. Thời gian thực tốt nhất, trình xem quy trình tương tác đầy màu sắc cho linux - htop.sourceforge.net - Pushpak Dagade
Không chú ý và chạy nó trên một hộp Windows. Những điều rất xấu ... - Derrick


Một cách khác sẽ là

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

hoặc (nếu có nproc)

openssl speed -multi $(nproc --all)

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


12
2017-09-08 11:19





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

8
2017-11-01 21:31





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

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

Thay thế số 4 bằng số lõi / luồng HT mà 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 khu vực chip càng tốt, nó được lập trình để tạo ra tản quyền lực tối đa. Tôi phải viết bài 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ể làm cpuburn trong chuỗi:

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 burnP6 & để so khớp số lõi CPU trên hệ thống của bạn.


7
2017-07-25 21:33





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

Cách sử dụng tương tự với nhấn mạnh

$ 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

5
2017-09-06 20:11



Xin vui lòng đọc Làm cách nào để đề xuất phần mềm để biết 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 một liên kết, ví dụ một số thông tin bổ sung về bản thân 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♦


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

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

2
2017-07-01 02:09



Nó sẽ không làm cho các quá trình chấm dứt một chút rắc rối? - oKtosiTe
killall cat Hãy làm nó. - Christian Mann
Tùy thuộc vào việc bạn có người khác cat các quy trình đang chạy (tôi thường làm). - oKtosiTe


https://github.com/GaetanoCarlucci/CPULoadGenerator

giải pháp khá đơn giản và khoa học.

Ở đây bạn có thể xem ví dụ động lực trong đó 50% tải được tạo ra trên lõi CPU 0:

enter image description here

Bạn có thể chạy quá trình trên các lõi khác cùng một lúc.


2
2018-03-28 15:46





Tôi kết hợp cả hai + 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
2018-06-22 16:47