我目前正在调试Cacti安装,并且想创建CPU负载来调试我的CPU利用率图。
我试图简单地运行cat /dev/zero > /dev/null
,虽然效果很好,但仅使用1个核心:
有没有更好的方法来测试/最大化负载下的系统资源?
screen
会话中似乎可行。但是,如果可能的话,我希望有一个更复杂的解决方案。
cat /dev/random > /dev/null
。猜猜/dev/zero
也可以。:-)
我目前正在调试Cacti安装,并且想创建CPU负载来调试我的CPU利用率图。
我试图简单地运行cat /dev/zero > /dev/null
,虽然效果很好,但仅使用1个核心:
有没有更好的方法来测试/最大化负载下的系统资源?
screen
会话中似乎可行。但是,如果可能的话,我希望有一个更复杂的解决方案。
cat /dev/random > /dev/null
。猜猜/dev/zero
也可以。:-)
Answers:
尝试stress
几乎等同于Windows consume.exe
:
oliver$ ./stress --cpu 3
stress: info: [18472] dispatching hogs: 3 cpu, 0 io, 0 vm, 0 hdd
sudo apt-get install stress
sudo yum install stress
sudo pacman -S stress
brew install stress
在OS X上
无需安装任何额外的软件包,您的旧外壳就可以单独完成。
这种单线将以100%的速率加载您的四个核心1:
for i in 1 2 3 4; do while : ; do : ; done & done
它的工作方式非常简单,它启动了四个无限循环。他们每个人都在重复空指令(:
)。每个循环都可以100%加载CPU内核。
如果您使用bash
,ksh93
和另一个外壳支持范围,(即不dash
或以上ksh
),就可以使用这种非便携式语法:
for i in {1..4}; do ...
4
如果您要加载的CPU数量不同于,请替换为您要加载的CPU数量4
。
假设启动这些循环之一时没有后台作业正在运行,则可以使用以下命令停止生成负载:
for i in 1 2 3 4; do kill %$i; done
回答@ underscore_d的评论,这里是简化了很多停止负载,并且还允许指定超时(默认为60秒)的增强型版本Control- 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
)
}
1 请注意,对于每个内核支持多个线程(超线程)的CPU,操作系统会将负载分派给所有虚拟CPU。在这种情况下,负载行为取决于实现(每个线程可能被报告为100%忙或不忙)。。
&
导致命令在单独的线程或单独的内核中运行?我很困惑。
killall bash
-只需确保您当时没有其他重要的脚本在运行即可。
killall bash
。已编辑答案,以添加一种更安全的方法来终止负载生成。
我做了一个简单的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消耗输出。
我通常会选择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内核的数量。
我一直在开发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
https://github.com/GaetanoCarlucci/CPULoadGenerator
非常简单和科学的解决方案。
在这里,您可以看到动态示例,其中CPU内核0产生了50%的负载:
您可以同时在其他内核上运行该进程。
我将+ 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 $@
一个简单的命令行也可以做到这一点:
x="x" ; while : ; do x=$x$x ; echo -n "." ; done
while : ; do : ; done
for i in 1 2 3; do while : ; do : ; done & ; done
我想将此添加到@jlliagre的评论中,但是我没有足够的声誉。如果要在多台服务器上使用此代码,并且CPU数量会有所不同,则可以使用以下命令:
for ((i=1; i<=`nproc --all`; i++)); do while : ; do : ; done & done
这将利用服务器上的所有核心,而不管您拥有多少个核心。该命令nproc
是coreutils的一部分,因此在大多数Linux安装中都应该使用。
cat
?