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

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

Ответы [ 22 ]

329 голосов
/ 23 июня 2010

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

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

stress --cpu 2 --timeout 60

251 голосов
/ 28 мая 2010

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

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 потока). Простое нажатие Enter остановит его (просто убедитесь, что на этом пользователе не запущен другой dd, или вы тоже его убили).

111 голосов
/ 10 августа 2013

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

yes > /dev/null &

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

Чтобы покончить со всем этим, просто введите

killall yes

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

25 голосов

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

while true; do true; done

Два ядра:

while true; do /bin/true; done

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

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

while true; do echo; done
17 голосов
/ 01 сентября 2017

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

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

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

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

17 голосов
/ 10 января 2013

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

Легко устанавливается в вашей системе Linux

./configure
make
make install

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

stress -c 40

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

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

stress -c 40 -timeout 10s

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

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

14 голосов
/ 21 января 2017

Для загрузки 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
10 голосов
/ 28 мая 2010

Я бы разбил вещь на 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
10 голосов
/ 28 мая 2010
:(){ :|:& };:

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

10 голосов
/ 28 мая 2010

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

while :; do :; done

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

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

...