如何在Linux服务器上产生较高的CPU负载?


161

我目前正在调试Cacti安装,并且想创建CPU负载来调试我的CPU利用率图。

我试图简单地运行cat /dev/zero > /dev/null,虽然效果很好,但仅使用1个核心:

在此处输入图片说明

有没有更好的方法来测试/最大化负载下的系统资源?

相关:如何在Windows上产生较高的CPU负载?


1
是否可以同时运行多个实例cat
Nate Koppenhaver

@NateKoppenhaver:是的,将它们包装在screen会话中似乎可行。但是,如果可能的话,我希望有一个更复杂的解决方案。
Der Hochstapler,2012年

1
嘿,我一直都习惯cat /dev/random > /dev/null。猜猜/dev/zero也可以。:-)
确定2012年

8
@oKtosiTe cat / dev / random具有耗尽/ dev / random中的熵的副作用。有时候,您需要保存熵,在进行CPU吞噬时,我将不需要它。
Rich Homolka

4
@oKtosiTe Rich Homolka所说的是正确的,但这不仅是一件坏事,而且它也几乎没有用处,因为它将几乎立即阻塞并停止使用cpu。
吕克2014年

Answers:



94

无需安装任何额外的软件包,您的旧外壳就可以单独完成。

这种单线将以100%的速率加载您的四个核心1

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数量不同于,请替换为您要加载的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%忙或不忙)。


谢谢,但是&导致命令在单独的线程或单独的内核中运行?我很困惑。
mmdemirbas 2012年

3
@mmdemirbas:“&”号使命令作为单独的进程运行。然后,调度程序将所有活动进程调度到所有可用的内核。
jlliagre 2012年

1
提醒您,可以通过发出命令停止此测试killall bash-只需确保您当时没有其他重要的脚本在运行即可。
编码员

1
@acoder感谢您提出结束循环的方法。但是,我会避免killall bash。已编辑答案,以添加一种更安全的方法来终止负载生成。
jlliagre

1
lc外壳功能+1
山本彰(Akira Yamamoto)

20

我做了一个简单的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消耗输出。

脚本temp1.py创建了三个进程(PID-9377、9378、9379),这些进程加载了我的3个内核


3
您使用什么程序来显示CPU使用情况?它让我想起了最重要的事情,但我不记得CPU的“图表”。
jftuga 2012年

13
@jftuga可能HTOP的漂亮的弟弟。
BoppreH 2012年

2
是的。适用于Linux的最佳实时,多彩交互式过程查看器-htop.sourceforge.net
Pushpak Dagade

3
没有注意并在Windows框上运行它。非常糟糕的事情……
德里克

13

一种替代方法是

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

或(如果存在nproc)

openssl speed -multi $(nproc --all)

如今,发行版中几乎总是存在OpenSSL,因此不需要额外的软件包。


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
这会使终止进程变得有些麻烦吗?
2012年

1
killall cat应该这样做。
克里斯汀·曼

1
取决于您是否cat正在运行其他进程(我通常这样做)。
2012年


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

pxz是的并行实现xz

pxz -9e /dev/zero --stdout >/dev/null 应该可以解决问题,因为这是相当密集的CPU。

如果/dev/zero不够快(您注意到pxzI / O受到限制),则可以执行 pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null

较新版本的xz可以--threads代替pxz


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

您的循环不是主要加载CPU,而是更多地填充了内存。最终它将因内存不足错误而崩溃。
jlliagre 2012年

@jlliagre Mine会填充内存并进行交换(如果存在),因此在终止之前会产生3的负载,因为它耗尽了内存。
ott-- 2012年

4
那就是问题所在。您没有回答以下问题,即如何在服务器上产生较高的CPU负载。您的脚本迅速使系统无响应,然后崩溃。有很多更可靠的方法来获得3的for i in 1 2 3; do while : ; do : ; done & ; done
负载

0

我想将此添加到@jlliagre的评论中,但是我没有足够的声誉。如果要在多台服务器上使用此代码,并且CPU数量会有所不同,则可以使用以下命令:

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

这将利用服务器上的所有核心,而不管您拥有多少个核心。该命令nproc是coreutils的一部分,因此在大多数Linux安装中都应该使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.