Как создать выброс процессора с помощью команды bash - PullRequest
247 голосов
/ 28 мая 2010

Я хочу создать почти 100% загрузку на машине с Linux. Это четырехъядерная система, и я хочу, чтобы все ядра работали на полной скорости. В идеале загрузка ЦП должна длиться определенное время, а затем останавливаться. Я надеюсь, что в Bash есть какая-то хитрость. Я думаю, что-то вроде бесконечного цикла.

Ответы [ 22 ]

7 голосов
/ 14 ноября 2013
cat /dev/urandom > /dev/null
4 голосов
/ 28 мая 2010
#!/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 голосов
/ 04 ноября 2012

Я использовал 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)

Этот метод силен, но кажется дружественным к системе , так как я никогда не ломал систему, используя это.

3 голосов
/ 28 мая 2010
#!/bin/bash
while [ 1 ]
do
        #Your code goes here
done
2 голосов
/ 29 октября 2015

Использование идей здесь, созданный код, который автоматически выходит по истечении заданного времени, не должен убивать процессы

#!/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
2 голосов
/ 07 марта 2014

Используя примеры, упомянутые здесь, а также помощь IRC, я разработал собственный скрипт стресс-тестирования процессора. Он использует подоболочку на поток и метод бесконечного цикла. Вы также можете указать количество потоков и количество времени в интерактивном режиме.

#!/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
2 голосов
/ 13 апреля 2012

Я прошел через Интернет, чтобы найти что-то подобное и нашел этот очень удобный скрипт для молотка процессора.

#!/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 голос
/ 15 марта 2018

Чтобы улучшить ответ Димбы и предоставить что-то более подключаемое (потому что мне нужно что-то подобное) Я написал следующее, используя концепцию загрузки dd: D

Он проверит текущие ядра и создаст столько потоков дд. Начальная и конечная загрузка ядра с помощью Введите

#!/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
1 голос
/ 28 мая 2010

Это делает трюк для меня:

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.

0 голосов
/ 08 ноября 2018

Димба dd if=/dev/zero of=/dev/null определенно верен, но также стоит упомянуть проверку максимальной загрузки процессора до 100%.Вы можете сделать это с помощью

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

. Здесь запрашивается вывод ps среднего значения использования процессора каждым процессом за 1 минуту, а затем суммируется с помощью awk.Несмотря на то, что это среднее значение за 1 минуту, ps достаточно умен, чтобы знать, что процесс занимает всего несколько секунд, и соответствующим образом корректирует временное окно.Таким образом, вы можете использовать эту команду, чтобы сразу увидеть результат.

...