centos中bash占用cpu,linux - 如何使用bash命令创建CPU峰值

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

我想在Linux机器上创建接近100%的负载。 它是四核系统,我希望所有内核全速运行。 理想情况下,CPU负载将持续指定的时间,然后停止。 我希望在bash中有一些技巧。 我在想某种无限循环。

User1 asked 2019-04-04T23:21:44Z

22个解决方案

296 votes

我使用压力来做这种事情,你可以告诉它最多有多少个核心...它也可以给内存和磁盘带来压力。

示例为2个核心压力60秒

stress --cpu 2 --timeout 60

David answered 2019-04-04T23:23:22Z

221 votes

你也可以

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在这个用户上运行或你也杀了它)。

dimba answered 2019-04-04T23:22:42Z

90 votes

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

yes > /dev/null &

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

为了结束所有这一切,简单地说

killall yes

这个想法最初是在这里找到的,虽然它是为Mac用户设计的,但这也适用于* nix。

user1147015 answered 2019-04-04T23:24:21Z

19 votes

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

while true; do true; done

两个核心:

while true; do /bin/true; done

后者只会让我的两个人都达到~50%但是......

这个将使两者都达到100%:

while true; do echo; done

17 votes

这是一个程序,你可以在这里下载

在Linux系统上轻松安装

./configure

make

make install

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

stress -c 40

强调你所有的CPU(无论你有多少)有40个线程,每个线程在一个ramdomly生成的数字上运行复杂的sqrt计算。

您甚至可以定义程序的超时

stress -c 40 -timeout 10s

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

压力程序真的使系统超载,因为处理计算。

Fopa Léon Constantin answered 2019-04-04T23:25:49Z

14 votes

要加载3个内核5秒钟:

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

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

如果您更喜欢userland cpu load:

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

如果您只想继续加载,直到按Ctrl-C:

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

James Scriven answered 2019-04-04T23:26:17Z

12 votes

虽然我迟到了,这篇文章是谷歌搜索“在Linux中生成负载”的最佳结果之一。

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

我们的想法是从无限数据流计算哈希值(例如/ dev / zero,/ dev / urandom,...)这个过程将尝试最大化cpu-core,直到进程中止。要为更多核心生成负载,可以将多个命令连接在一起。

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

Mitms answered 2019-04-04T23:26:56Z

10 votes

我会用2个脚本分割东西:

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

Fred answered 2019-04-04T23:27:24Z

10 votes

:(){ :|:& };:

这个叉炸弹会对CPU造成严重破坏,并可能导致计算机崩溃。

Jeff Goldstein answered 2019-04-04T23:27:45Z

9 votes

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

while :; do :; done

($num_cores与true相同,什么都不做,退出零)

您可以在子shell中调用它并在后台运行。 那样做$num_cores应该就够了。 睡了所需的时间后你可以全部杀死它们,你得到的PID为jobs -p(提示:xargs)

Marian answered 2019-04-04T23:28:19Z

7 votes

cat /dev/urandom > /dev/null

Evgeny answered 2019-04-04T23:28:38Z

4 votes

#!/bin/bash

duration=120 # seconds

instances=4 # cpus

endtime=$(($(date +%s) + $duration))

for ((i=0; i

do

while (($(date +%s) < $endtime)); do :; done &

done

Dennis Williamson answered 2019-04-04T23:28:58Z

4 votes

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

$ for ((i=0;i

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)

这种方法很强大,但似乎对系统友好,因为我从来没有使用过它来破坏系统。

F. Hauri answered 2019-04-04T23:30:17Z

3 votes

#!/bin/bash

while [ 1 ]

do

#Your code goes here

done

Secko answered 2019-04-04T23:30:43Z

2 votes

我通过互联网找到类似的东西,发现这个非常方便的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

Ishtiaq Ahmed answered 2019-04-04T23:31:28Z

2 votes

使用此处提到的示例,以及IRC的帮助,我开发了自己的CPU压力测试脚本。 它使用每个线程的子shell和无限循环技术。 您还可以以交互方式指定线程数和时间量。

#!/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

MirceaKitsune answered 2019-04-04T23:31:56Z

2 votes

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

#!/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

Dhiraj answered 2019-04-04T23:32:24Z

1 votes

这对我来说很有用:

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之外什么都不用。

ZyX answered 2019-04-04T23:33:15Z

1 votes

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

knope answered 2019-04-04T23:33:58Z

0 votes

我结合了一些答案并添加了一种方法来将压力扩展到所有可用的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

joecks answered 2019-04-04T23:34:54Z

0 votes

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

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

这要求每个进程的cpu使用率平均为1分钟的ps输出,然后用awk对它们求和。 虽然它平均为1分钟,但ps足够聪明,可以知道进程是否只有几秒钟,并相应地调整时间窗口。 因此,您可以使用此命令立即查看结果。

jeremysprofile answered 2019-04-04T23:35:34Z

-1 votes

只需将这个坏男孩粘贴到运行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

GarretSidzaka answered 2019-04-04T23:36:34Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值