如何用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