如何使用bash命令创建CPU峰值


Answers:


282

你也可以

dd if=/dev/zero of=/dev/null

要运行更多这些以在更多核心上施加负载,请尝试分叉它:

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

将花括号中的命令重复执行要产生的线程数(此处为4个线程)多次。简单的回车命中将停止它(只要确保没有其他dd正在此用户上运行,或者您也杀死了它)。


35
dd处理I / O的
Fred

2
实际上,这对于我的情况最为有效。它还在Cygwin中工作。出于某种原因,其他解决方案并不会使CPU数量过多。添加计数并并行执行四个过程可以完美地工作。它将CPU的峰值提高到了100%,然后在没有任何帮助的情况下又降为零。只需四行代码和一个“ wait”。
User1 2010年

62
读取/dev/zero和写入/dev/null不是一个很好的负载生成器-您必须运行很多负载生成大量负载。最好做类似的事情dd if=/dev/urandom | bzip2 -9 >> /dev/null/dev/urandom需要大量的精力来生成输出,并且bzip2将花费大量的精力来尝试压缩它,因此总体CPU使用率要比“用零填充一个块然后丢弃它”高得多。
twalberg 2013年

4
使用jobs -p | xargs kill只杀了你所创建的过程。
玛丽安2015年

5
@twalberg,您应该将您的评论变成答案。
亚伦·麦克戴德

362

我对这种情况使用压力,您可以告诉它最大可以扩展多少个内核。它也允许对内存和磁盘进行压力测试。

对2个核心施加60秒的示例

stress --cpu 2 --timeout 60


6
在Fedora上sudo yum install stress
Christopher Markieta 2014年

3
您需要EPEL回购CentOSwget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Satish 2014年

4
brew install stress同样由于某些原因,我不得不在四核MBPr上指定8个内核
fregante 2015年

1
@ bfred.it您的核心可能利用超线程,从而有效地使核心数量(4个物理和4个虚拟核心)加倍。您还需要强调对虚拟负载进行全负载测试。
桅杆

6
sudo apt-get install stress在基于debian的系统上,以确保完整性。用于测试Intel i7 NUC套件上的散热模块。
onmylemon,2015年

133

我认为这更简单。打开终端并输入以下内容,然后按Enter。

yes > /dev/null &

要充分利用现代CPU,仅一行是不够的,您可能需要重复此命令以耗尽所有CPU功率。

要结束所有这些,只需将

killall yes

这个主意最初是在这里找到的,尽管它是针对Mac用户的,但它也适用于* nix。


7
+1就像魅力一样,谢谢!值得补充的是:此命令将使每个cpu内核最多分配一个超线程。因此,双核cpu(每个核都有2个线程)每个yes命令的总负载为25%(假设系统处于空闲状态)。
GitaarLAB 2014年

只需添加此命令,此命令的每次迭代最多可将CPU(Android)上25%的负载最多增加4次迭代,其余的则无效(即使就时钟频率而言)。
user3188978 '17

30

尽管我参加聚会的时间很晚,但这篇文章是google搜索“ generate load in linux”的最佳搜索结果之一。

标记为解决方案的结果可用于生成系统负载,我更喜欢用于sha1sum /dev/zero对cpu-core施加负载。

这个想法是从一个无限的数据流(例如/ dev / zero,/ dev / urandom等)中计算一个哈希总和,该过程将尝试使CPU核心最大化,直到该过程中止。为了产生更多内核的负载,可以将多个命令传递到一起。

例如。产生2个核心负载: sha1sum /dev/zero | sha1sum /dev/zero


可见,这比dd的CPU负载要好。我在dd(6次)上获得的最大cpu负载为44%,在sha1sum上获得的86%+。谢谢〜!
AAI

26

一个核心(不调用外部进程):

while true; do true; done

两个核心:

while true; do /bin/true; done

后者只能使我的两个人都达到〜50%...

这将使两者都达到100%:

while true; do echo; done

在回显上,我们失去了对linux的访问。如何将第三个命令置于后台?
AAI

2
为什么echo使所有cpu核心达到100%?
郝浩戈'18

@HaoyuanGe仅当回显“ nothing”时,所有cpus才是100%。替换做回声;与做回声“一些非常长的字符串”; 看到<100%的CPU。因此,我相信,没有回声就不会有太多的跳跃,因此有更多的代码可以执行(因为虽然是true),但内核却是100%忙碌
talekeDskobeDa

如果要在运行此类测试时使服务器保持响应状态,请在单独的shell(另一个tmux /屏幕窗口或ssh会话)中进行操作,然后首先重新启用该shell,例如在bash:中renice 19 -p $$。它仍将使CPU达到最大值,但不会影响其他进程。
沃尔夫,

23

加载3个核心5秒钟:

seq 3 | xargs -P0 -n1 timeout 5 yes > /dev/null

这导致许多write()系统调用导致较高的内核(sys)负载。

如果您更喜欢userland cpu负载:

seq 3 | xargs -P0 -n1 timeout 5 md5sum /dev/zero

如果只希望继续加载,直到按Ctrl-C:

seq 3 | xargs -P0 -n1 md5sum /dev/zero

1
这可能来自tinycore吗?xargs:无效选项
-'P'

不错的本地选项
签署

18

这是您可以在此处下载的程序

在Linux系统上轻松安装

./configure
make
make install

并在一个简单的命令行中启动它

stress -c 40

用40个线程(每个线程运行一个复杂的线程)对所有CPU(无论有多大)施加压力 sqrt对随机生成的数字计算。

您甚至可以定义程序超时

stress -c 40 -timeout 10s

与建议的dd命令解决方案不同,该命令本质上涉及IO,因此不会因为处理数据而真正使系统过载。

压力程序确实因为处理计算而使系统过载。


4
上面已经有stress命令的答案。就像那个答案所说,您可以通过yum / apt / etc安装它。
阿斯凡德·卡兹

1
网站状态不佳(禁止访问503),但可以在回购协议上找到它:)
m3nda

11
:(){ :|:& };:

此叉子炸弹会对CPU造成破坏,并可能使计算机崩溃。


13
如果我更容易阅读fork_bomb(){fork_bomb | fork_bomb&}; 前炸弹
杰夫·戈德斯坦

17
那人在“持续指定的时间然后停止”标准上失败;)
玛丽安(Marian

14
看起来像一堆笑脸。
Ponkadoodle

2
这张叉子炸弹使我的计算机崩溃了,我不得不重新开机。
伊利亚·林恩2014年

2
来自:cyberciti.biz/faq/understanding-bash-fork-bomb警告!如果执行这些示例,可能会使您的计算机崩溃。“一旦在系统中激活成功的叉子炸弹,就可能无法在不重新启动系统的情况下恢复正常操作,因为叉子炸弹的唯一解决方案是销毁它的所有实例。”
伊利亚·林恩2014年

11

我也有一个无限循环的想法。外观怪异的是:

while :; do :; done

:与相同true,不执行任何操作并以零退出)

您可以在子外壳中调用它,然后在后台运行。这样做的$num_cores时间就足够了。睡眠所需的时间,你可以把他们都杀掉之后,你得到的PID jobs -p(提示:xargs


10

我会把事情分成两个脚本:

infinite_loop.bash:

#!/bin/bash
while [ 1 ] ; do
    # Force some computation even if it is useless to actually work the CPU
    echo $((13**99)) 1>/dev/null 2>&1
done

cpu_spike.bash:

#!/bin/bash
# Either use environment variables for NUM_CPU and DURATION, or define them here
for i in `seq ${NUM_CPU}` : do
    # Put an infinite loop on each CPU
    infinite_loop.bash &
done

# Wait DURATION seconds then stop the loops and quit
sleep ${DURATION}
killall infinite_loop.bash


4
#!/bin/bash
duration=120    # seconds
instances=4     # cpus
endtime=$(($(date +%s) + $duration))
for ((i=0; i<instances; i++))
do
    while (($(date +%s) < $endtime)); do :; done &
done

4

我用过bc二进制计算器),要求他们提供大量小数位的PI。

$ for ((i=0;i<$NUMCPU;i++));do
    echo 'scale=100000;pi=4*a(1);0' | bc -l &
    done ;\
    sleep 4; \
    killall bc

使用NUMCPU(在Linux下):

$ NUMCPU=$(grep $'^processor\t*:' /proc/cpuinfo |wc -l)

这种方法很强大,但似乎对系统友好,因为我从未使用过这种方法使系统崩溃过。



2

我通过互联网找到了类似的东西,并找到了这个非常方便的cpu锤脚本。

#!/bin/sh

# unixfoo.blogspot.com

if [ $1 ]; then
    NUM_PROC=$1
else
    NUM_PROC=10
fi

for i in `seq 0 $((NUM_PROC-1))`; do
    awk 'BEGIN {for(i=0;i<10000;i++)for(j=0;j<10000;j++);}' &
done

真的需要那么长时间吗?我最喜欢这种工作的
单线

1
if-then-else子句可以替换为:NUM_PROC=${1:-10}
2015年

2

使用这里提到的示例以及IRC的帮助,我开发了自己的CPU压力测试脚本。它使用每个线程一个子外壳和无穷循环技术。您还可以交互地指定线程数和时间。

#!/bin/bash
# Simple CPU stress test script

# Read the user's input
echo -n "Number of CPU threads to test: "
read cpu_threads
echo -n "Duration of the test (in seconds): "
read cpu_time

# Run an endless loop on each thread to generate 100% CPU
echo -e "\E[32mStressing ${cpu_threads} threads for ${cpu_time} seconds...\E[37m"
for i in $(seq ${cpu_threads}); do
    let thread=${i}-1
    (taskset -cp ${thread} $BASHPID; while true; do true; done) &
done

# Once the time runs out, kill all of the loops
sleep ${cpu_time}
echo -e "\E[32mStressing complete.\E[37m"
kill 0

在脚本上出现错误“第14行:taskset:未找到命令”!任何的想法?
user2912312 2014年

2

利用这里的想法,创建的代码将在设定的持续时间后自动退出,而不必杀死进程-

#!/bin/bash
echo "Usage : ./killproc_ds.sh 6 60  (6 threads for 60 secs)"

# Define variables
NUM_PROCS=${1:-6} #How much scaling you want to do
duration=${2:-20}    # seconds

function infinite_loop {
endtime=$(($(date +%s) + $duration))
while (($(date +%s) < $endtime)); do
    #echo $(date +%s)
    echo $((13**99)) 1>/dev/null 2>&1
    $(dd if=/dev/urandom count=10000 status=none| bzip2 -9 >> /dev/null) 2>&1 >&/dev/null
done
echo "Done Stressing the system - for thread $1"
}


echo Running for duration $duration secs, spawning $NUM_PROCS threads in background
for i in `seq ${NUM_PROCS}` ;
do
# Put an infinite loop
    infinite_loop $i  &
done

1

这对我来说是个窍门:

bash -c 'for (( I=100000000000000000000 ; I>=0 ; I++ )) ; do echo $(( I+I*I )) & echo $(( I*I-I )) & echo $(( I-I*I*I )) & echo $(( I+I*I*I )) ; done' &>/dev/null

它只使用bash。


1

为了增强dimba的答案并提供更可插入的内容(因为我需要类似的内容)。我使用dd加载概念编写了以下内容:D

它将检查当前内核,并创建那么多dd线程。使用Enter开始和结束核心负载

#!/bin/bash

load_dd() {
    dd if=/dev/zero of=/dev/null
}

fulload() {
    unset LOAD_ME_UP_SCOTTY
    export cores="$(grep proc /proc/cpuinfo -c)"
    for i in $( seq 1 $( expr $cores - 1 ) )
      do
    export LOAD_ME_UP_SCOTTY="${LOAD_ME_UP_SCOTTY}$(echo 'load_dd | ')"
  done
        export LOAD_ME_UP_SCOTTY="${LOAD_ME_UP_SCOTTY}$(echo 'load_dd &')"
    eval ${LOAD_ME_UP_SCOTTY}
}

echo press return to begin and stop fullload of cores
  read
  fulload
  read
  killall -9 dd

0

我结合了一些答案,并添加了一种将压力扩展到所有可用cpus的方法:

#!/bin/bash

function infinite_loop { 
    while [ 1 ] ; do
        # Force some computation even if it is useless to actually work the CPU
        echo $((13**99)) 1>/dev/null 2>&1
    done
}

# Either use environment variables for DURATION, or define them here
NUM_CPU=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
PIDS=()
for i in `seq ${NUM_CPU}` ;
do
# Put an infinite loop on each CPU
    infinite_loop &
    PIDS+=("$!")
done

# Wait DURATION seconds then stop the loops and quit
sleep ${DURATION}

# Parent kills its children 
for pid in "${PIDS[@]}"
do
    kill $pid
done

0

Dimba dd if=/dev/zero of=/dev/null绝对是正确的,但也值得一提的是验证cpu的使用率是否达到100%。你可以这样做

ps -axro pcpu | awk '{sum+=$1} END {print sum}'

这要求每个进程的ps输出为平均1分钟的CPU使用率,然后将其与awk相加。尽管平均时间是1分钟,但ps足够聪明,可以知道某个进程是否仅在几秒钟左右,并相应地调整时间窗口。因此,您可以使用此命令立即查看结果。


0

增加负载或消耗CPU 100%

sha1sum /dev/zero &

然后您可以通过键入命令查看CPU使用情况

top

释放负载

killall sha1sum

-1

只需将这个坏男孩粘贴到运行Linux的任何服务器的SSH或控制台中即可。您可以手动终止进程,但是完成后,我只是关闭服务器,所以更快。

编辑:我已将此脚本更新为现在具有计时器功能,因此无需终止进程。

read -p "Please enter the number of minutes for test >" MINTEST && [[ $MINTEST == ?(-)+([0-9]) ]]; NCPU="$(grep -c ^processor /proc/cpuinfo)";  ((endtime=$(date +%s) + ($MINTEST*60))); NCPU=$((NCPU-1)); for ((i=1; i<=$NCPU; i++)); do while (($(date +%s) < $endtime)); do : ; done & done
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.