題 如何在Linux服務器上產生高CPU負載?


我目前正在進行中 調試Cacti安裝 並且想要創建CPU負載來調試我的CPU利用率圖。

我試著簡單地跑 cat /dev/zero > /dev/null,效果很好但只使用1個核心:

enter image description here

有沒有更好的方法在負載下測試/最大化系統資源?

有關: 如何在Windows上產生高CPU負載?


142
2018-06-30 17:13


起源


是否可以運行多個實例 cat 同時? - Nate Koppenhaver
@NateKoppenhaver:是的,將它們包裝起來似乎是可能的 screen 會話。但如果可能的話,我寧願選擇更複雜的解決方案。 - Der Hochstapler
嘿,我一直用 cat /dev/random > /dev/null。猜測 /dev/zero 也有效。 :-) - oKtosiTe
@oKtosiTe cat / dev / random具有消耗/ dev / random中的熵的副作用。有時你需要保存熵,我不會這樣,因為我去了CPU的豬。 - Rich Homolka
@oKtosiTe Rich Homolka所說的是對的,但這不僅僅是一件壞事,它也沒用,因為它幾乎會立即阻止並停止消耗cpu。 - Luc


答案:


嘗試 stress 它幾乎與Windows相當 consume.exe

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

163
2018-06-30 17:27



在ubuntu上,你可以安裝 sudo apt-get install stress - ben
關於debian wheezy也是。 - enapupe
在Fedora上, sudo yum install stress - Christopher Markieta
拱: sudo pacman -S stress - das_j
brew install stress 在OS X上 - Christian Long


無需安裝任何額外的包,你的舊殼可以單獨完成。

這個單行將以100%加載您的四個核心:

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

它是如何工作的很簡單,它啟動了四個無限循環。他們每個人都在重複空指令(:)。每個循環都能夠以100%加載CPU內核。

如果你使用 bashksh93 和其他支撐範圍的砲彈(即沒有 dash 或更老 ksh),你可以使用這種非可移植的語法:

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

更換 4 如果不同,您需要加載的CPU數量 4

假設您在啟動其中一個循環時沒有運行後台作業,您可以使用該命令停止生成負載:

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

回答@ underscore_d的評論,這是一個增強版本,可以簡化大量停止加載,並且還允許指定超時(默認為60秒)。 控制 - C 也將殺死所有失控的循環。這個shell函數至少可以工作 bash 和 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
  )
}

85
2017-07-01 14:55



謝謝,但是 & 導致命令在單獨運行 線 或分開 核心?我很迷惑。 - mmdemirbas
@mmdemirbas:&符號使命令作為單獨的進程運行。然後,調度程序將所有活動進程分派給所有可用內核。 - jlliagre
提醒您可以通過發布來停止此測試 killall bash  - 確保您當時沒有運行任何其他重要腳本。 - a coder
@acoder感謝您建議一種結束循環的方法。但我會避免 killall bash。編輯答案以添加更安全的方法來結束負載生成。 - jlliagre
+1用於lc shell函數 - Akira Yamamoto


我做了一個簡單的python腳本也做了同樣的事情。您可以控制要加載的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個內核時的cpu消耗輸出。

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


18
2018-06-30 17:56



你用什麼程序來顯示這樣的CPU使用率?它讓我想起了頂級,但我不記得CPU'圖表'。 - jftuga
@jftuga可能 HTOP, 最佳更漂亮的兄弟。 - BoppreH
是的,它的htop。最好的實時,豐富多彩的Linux交互式進程查看器 - htop.sourceforge.net - Pushpak Dagade
沒注意並在Windows機器上運行它。非常糟糕的事情...... - Derrick


另一種方法是

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

或(如果存在nproc)

openssl speed -multi $(nproc --all)

OpenSSL幾乎總是存在於現在的發行版中,因此不需要額外的包。


13
2017-09-08 11:19





從頭開始

sha1sum /dev/zero &

系統中每個核心的命令。

停止

killall sha1sum

要么

kill sha1sum

8
2017-11-01 21:31





我通常採用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核心數。


7
2017-07-25 21:33





我一直在開發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

5
2017-09-06 20:11



請閱讀 我該如何推薦軟件 有關如何推薦軟件的一些提示。至少你應該提供的不僅僅是/至少一個鏈接,例如關於軟件本身的一些附加信息,以及它如何用於解決問題中的問題。 - DavidPostill♦


您可以根據需要多次運行該命令,每次都會佔用不同的核心:

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

2
2017-07-01 02:09



難道這不會使流程終止有點麻煩嗎? - oKtosiTe
killall cat 應該這樣做。 - Christian Mann
取決於你是否有其他 cat 進程運行(我通常這樣做)。 - oKtosiTe