我想在Linux机器上创建一个接近100%的负载。这是四核系统,我要所有核都全速运转。理想情况下,CPU负载将持续一段指定的时间,然后停止。我希望bash里有什么妙招。我在想某种无限循环。
当前回答
如果你不想安装额外的软件,你可以使用自动利用所有CPU内核的压缩工具。例如,xz:
cat /dev/zero | xz -T0 > /dev/null
这将从/dev/zero中获取无限的虚拟数据流,并使用系统中所有可用的内核对其进行压缩。
其他回答
你可以在这里下载一个程序
在Linux系统上轻松安装
./configure
make
make install
并在简单的命令行中启动它
stress -c 40
让所有的cpu(不管你有多少)都有40个线程,每个线程在随机生成的数字上运行复杂的根号计算。
您甚至可以定义程序的超时时间
stress -c 40 -timeout 10s
与提议的dd命令解决方案不同,dd命令主要处理IO,因此不会因为处理数据而真正使系统过载。
压力程序会使系统超负荷因为要处理计算。
#!/bin/bash
while [ 1 ]
do
#Your code goes here
done
只需将这个坏小子粘贴到任何运行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
我结合了一些答案,并添加了一种将压力扩展到所有可用cpu的方法:
#!/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
你也可以
dd if=/dev/zero of=/dev/null
要运行更多这样的程序,将负载放在更多的内核上,请尝试fork:
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个线程)。 简单的输入hit将停止它(只要确保没有其他dd在这个用户上运行,否则也会杀死它)。