Как создать выброс процессора с помощью команды bash

281

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

User1
источник
3
см. superuser.com/questions/443406/…
Ник Фокс

Ответы:

283

Вы также можете сделать

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
источник
35
dd больше работает с вводом / выводом, чем с использованием процессора
Фред,
2
Это на самом деле сработало лучше всего в моей ситуации. Это также работало в Cygwin. По некоторым причинам, другие решения не будут сильно нагружать процессор. Добавление счета и параллельное выполнение четырех процессов работали отлично. Он поднял процессор на 100% сверху, а затем вернулся к нулю без посторонней помощи. Всего четыре строки кода и «ждать».
User1
62
Чтение /dev/zeroи запись в /dev/nullне очень хороший генератор нагрузки - вы должны запустить много из них, чтобы генерировать значительную нагрузку. Лучше сделать что-нибудь подобное dd if=/dev/urandom | bzip2 -9 >> /dev/null. /dev/urandomтребует значительно больше усилий для генерации вывода и bzip2потребует много усилий, чтобы сжать его, поэтому общая загрузка ЦП намного выше, чем «заполнить блок нулями, а затем выбросить».
Твальберг
4
Используйте jobs -p | xargs killтолько для уничтожения созданных вами процессов.
Мариан
5
@ twalberg, вы должны сделать свой комментарий в ответ.
Аарон МакДейд
363

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

Пример для стресса 2 ядра в течение 60 секунд

stress --cpu 2 --timeout 60

Дэвид
источник
6
На Fedora,sudo yum install stress
Кристофер Маркиета
3
Вам необходимо сделать EPELрепо для CentOSwget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Satish
4
brew install stressна OS X. Также по какой-то причине мне пришлось указать 8 ядер на четырехъядерном MBPr
fregante
1
@ bfred.it Ваши ядра могут использовать гиперпоточность, эффективно удваивая количество ядер (4 физических и 4 виртуальных ядра). Вы также захотите подчеркнуть виртуальные для полной загрузки теста.
Мачта
6
sudo apt-get install stressв системах на основе Debian, для полноты. Использовал это для тестирования мод охлаждения на Intel i7 NUC Kit .
onmylemon
133

Я думаю, что этот проще. Откройте терминал, введите следующее и нажмите Enter.

yes > /dev/null &

Чтобы полностью использовать современные процессоры, одной строки недостаточно, вам может потребоваться повторить команду, чтобы исчерпать всю мощность процессора.

Чтобы положить конец всему этому, просто

killall yes

Идея была первоначально найдена здесь , хотя она была предназначена для пользователей Mac, но это должно работать и для * nix.

user1147015
источник
7
+1 Работает как шарм, спасибо! Стоит добавить : эта команда будет максимизировать одну гиперпоточность на ядро ​​процессора. Таким образом, двухъядерный процессор (каждое ядро ​​имеет 2 потока) получит общую нагрузку 25% на yesкоманду (при условии, что система в противном случае простаивала).
GitaarLAB
Чтобы добавить к этому, каждая итерация этой команды добавляет 25-процентную нагрузку на процессор (Android) до 4-х итераций, а остальные не имеют никакого эффекта (даже с точки зрения тактовой частоты).
user3188978
31

Несмотря на то, что я опаздываю на вечеринку, этот пост является одним из лучших результатов в поиске Google "Создать нагрузку в Linux".

Результат, помеченный как решение, может быть использован для генерирования загрузки системы, я предпочитаю использовать его sha1sum /dev/zeroдля загрузки нагрузки на ядро ​​процессора.

Идея состоит в том, чтобы вычислить хэш-сумму из бесконечного потока данных (например, / dev / zero, / dev / urandom, ...), этот процесс будет пытаться максимально увеличить ядро ​​ЦП до тех пор, пока процесс не будет прерван. Чтобы создать нагрузку для большего количества ядер, можно объединить несколько команд.

например. создать нагрузку на 2 ядра: sha1sum /dev/zero | sha1sum /dev/zero

Mitms
источник
Видя, это лучше, чем dd для загрузки процессора. Я получаю максимальную загрузку процессора 44% на dd (6 раз) и 86% + на sha1sum. Thx ~!
AAI
26

Одно ядро ​​(не вызывает внешнего процесса):

while true; do true; done

Два ядра:

while true; do /bin/true; done

Последнее только заставляет меня обоих пойти на ~ 50%, хотя ...

Этот заставит оба пойти на 100%:

while true; do echo; done
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳
источник
на эхо, мы теряем доступ к Linux. как поместить эту 3-ю команду в фоновом режиме?
AAI
2
Почему эхо делает все процессорные ядра до 100%?
Haoyuan Ge
@HaoyuanGe Все процессоры на 100% только при отражении «ничего». Заменить до эхо; с do echo "какая-то очень-очень длинная строка"; видеть <100% на процессоре. Так что, я полагаю, что повторение ничего не имеет намного меньших переходов и, следовательно, больше кода для выполнения (из-за true;) ядра заняты на ~ 100%
talekeDskobeDa
Если вы хотите сохранить сервер реагировать во время работы такого теста, сделать это в отдельной оболочке (другое окно tmux / экрана, или SSH сессии), и Renice , что оболочка сначала, например , в Баш: renice 19 -p $$. Это по-прежнему будет максимально загружать процессоры, но не будет влиять на другие процессы.
Уолф
23

Чтобы загрузить 3 ядра в течение 5 секунд:

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

Это приводит к высокой загрузке ядра (sys) из-за многих системных вызовов write ().

Если вы предпочитаете в основном загрузку ЦП:

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

Если вы просто хотите, чтобы загрузка продолжалась, пока вы не нажмете Ctrl-C:

seq 3 | xargs -P0 -n1 md5sum /dev/zero
Джеймс Скривен
источник
1
Это возможно от tinycore? xargs: неверный параметр - 'P'
conman253
хороший родной вариант
знак
18

Вот программа, которую вы можете скачать здесь

Легко установить на свою систему Linux

./configure
make
make install

и запустить его в простой командной строке

stress -c 40

нагрузка на все ваши процессоры (какими бы вы ни были) 40- sqrtтью потоками, каждый из которых выполняет сложные вычисления на случайных числах.

Вы даже можете определить время ожидания программы

stress -c 40 -timeout 10s

в отличие от предложенного решения с ddкомандой, которая имеет дело с сущностью IOи поэтому не перегружает вашу систему, потому что работает с данными.

Программа стресса действительно перегружает систему, потому что имеет дело с вычислениями.

Фопа Леон Константин
источник
4
Для команды уже есть ответ выше stress. Как говорится в этом ответе, вы можете просто установить его через yum / apt / etc.
Асфанд Кази
1
Веб-сайт не в хорошем состоянии (503 запрещено), но доступен в репозиториях :)
m3nda
11
:(){ :|:& };:

Эта вилочная бомба вызовет хаос в процессоре и, скорее всего, приведет к поломке вашего компьютера.

Джефф Гольдштейн
источник
13
Поможет, если мне будет проще читать fork_bomb () {fork_bomb | fork_bomb &}; бомба-вилка
Джефф Гольдштейн
17
Это не соответствует критерию «последний назначенный промежуток времени, а затем остановка»;)
Marian
14
выглядит как куча смайликов.
Ponkadoodle
2
Эта вилочная бомба разбила мой компьютер, мне пришлось сделать жесткий цикл питания.
Элайджа Линн
2
От: cyberciti.biz/faq/understanding-bash-fork-bomb ВНИМАНИЕ! Эти примеры могут привести к сбоям в работе вашего компьютера при выполнении. «После того, как успешная вилочная бомба была активирована в системе, может быть невозможно возобновить нормальную работу без перезагрузки системы, поскольку единственное решение для вилочной бомбы - уничтожить все ее экземпляры».
Элайджа Линн
11

Бесконечный цикл - идея, которая у меня тоже была. Причудливый на вид это:

while :; do :; done

( :то же самое true, ничего не делает и выходит с нуля)

Вы можете назвать это в подоболочке и запустить в фоновом режиме. Делать это $num_coresраз должно быть достаточно. После сна нужного времени вы можете убить их всех, вы получите ИДП с jobs -p(подсказкой: xargs)

Мэриан
источник
10

Я бы разделил эту вещь на 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
Фред
источник
7
cat /dev/urandom > /dev/null
Евгений
источник
Добавьте также некоторый комментарий, это помогает.
Lokesh
4
#!/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

Я использовал 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
#!/bin/bash
while [ 1 ]
do
        #Your code goes here
done
Secko
источник
1
Эх, нет Спать - это не та задача, которая требует от процессора много удовольствия:-)
Мариан,
2

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

#!/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
Если-то-иначе положение может быть заменен: NUM_PROC=${1:-10}.
Тор
2

Используя примеры, упомянутые здесь, а также помощь 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
MirceaKitsune
источник
ошибка "строка 14: набор задач: команда не найдена" в вашем скрипте! любая идея?
user2912312
2

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

#!/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
источник
1

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

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
источник
1

Чтобы улучшить ответ Димбы и предоставить что-то более подключаемое (потому что мне нужно что-то подобное). Я написал следующее, используя концепцию загрузки 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
источник
0

Я объединил некоторые ответы и добавил способ масштабирования стресса для всех доступных процессоров:

#!/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
источник
0

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

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

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

jeremysprofile
источник
0

увеличить нагрузку или потреблять процессор на 100%

sha1sum /dev/zero &

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

top

снять нагрузку

killall sha1sum
44kksharma
источник
-1

Просто вставьте этого плохого парня в SSH или консоль любого сервера под управлением Linux. Вы можете убить процессы вручную, но я просто выключаю сервер, когда я закончу, быстрее.

Изменить: я обновил этот сценарий, чтобы теперь иметь функцию таймера, так что нет необходимости убивать процессы.

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
источник