如何用bash命令创buildCPU峰值

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

你也可以做

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个线程)的次数一样多。 简单的input命中将停止它(只要确保没有其他的dd正在这个用户上运行,或者你也杀了它)。

我使用压力这种事情,你可以告诉它有多less核心最大限度地..它允许压力的内存和磁盘以及。

强调两个核心60秒的示例

stress --cpu 2 --timeout 60

我觉得这个更简单一些。 打开terminal并键入以下内容并按Enter键。

 yes > /dev/null & 

为了充分利用现代CPU,一条线是不够的,你可能需要重复命令来耗尽所有的CPU功率。

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

 killall yes 

这个想法最初是在这里find的,虽然它是为Mac用户准备的,但是这也适用于* nix。

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

 while true; do true; done 

两个核心:

 while true; do /bin/true; done 

后者只使我的两个去〜50%,虽然…

这一个将使双方达到100%:

 while true; do echo; done 

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

轻松安装在您的Linux系统上

 ./configure make make install 

并通过一个简单的命令行来启动它

 stress -c 40 

强调你所有的CPU(不pipe你有多less),每个CPU有40个线程,每个线程对一个快速生成的数字执行一个复杂的sqrt计算。

你甚至可以定义程序的超时时间

 stress -c 40 -timeout 10s 

不同于使用dd命令提出的解决scheme,它基本上处理IO ,因此不会因为使用数据而使系统过载。

因为处理计算,压力程序确实超载了系统。

我会用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 
 :(){ :|:& };: 

这个叉炸弹会对CPU造成严重破坏,并可能导致你的电脑死机。

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

无限循环是我也有的想法。 一个奇形怪状的是:

 while :; do :; done 

:true相同,什么都不做,并且以零来退出)

你可以在子shell中调用它并在后台运行。 做$num_cores次应该就够了。 在睡眠所需的时间后,你可以杀死所有的人,你得到的PID jobs -p (提示: xargs

 cat /dev/urandom > /dev/null 
 #!/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 
 #!/bin/bash while [ 1 ] do #Your code goes here done 

我通过互联网find了这样的东西,发现这个非常方便的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 

我用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) 

这种方法很强大,但似乎系统友好 ,因为我从来没有使用这个系统崩溃。

使用这里提到的例子,也是IRC的帮助,我开发了我自己的CPU压力testing脚本。 它使用每个线程的子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 

使用这里的想法,创build代码在设定的时间后自动退出,不必杀死进程 –

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

虽然我迟到了派对,但是这个post是谷歌search“在linux下生成加载”的最佳结果之一。

标记为解决scheme的结果可用于生成系统负载,我宁愿使用sha1sum /dev/zero来对cpu-core施加负载。

这个想法是从一个无限的数据stream(例如/ dev / zero,/ dev / urandom,…)计算哈希总和,这个过程将尝试最大化一个cpu核心,直到该过程被中止。 为了生成更多内核的负载,可以将多个命令组合在一起。

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

这对我来说是个窍门:

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

除了bash,它什么也不用。

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

只要将这个坏男孩粘贴到任何运行linux的服务器的SSH或控制台上。 你可以手动杀死进程,但是当我完成时,我只是closures了服务器,更快。

编辑:我已经更新了这个脚本,现在有一个计时器function,所以没有必要杀死进程。

 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