149

В настоящее время я нахожусь в процессе отладки установки Cacti и хочу создать загрузку ЦП для отладки графиков загрузки ЦП.

Я попытался просто запустить cat /dev/zero > /dev/null , который прекрасно работает, но использует только 1 ядро:

Есть ли лучший метод тестирования / максимизации системных ресурсов под нагрузкой?

Связанный: Как я могу произвести высокую загрузку ЦП на Windows?

14 ответов14

172

Попробуйте stress это в значительной степени эквивалент Windows Windows consume.exe:

oliver$ ./stress --cpu 3
stress: info: [18472] dispatching hogs: 3 cpu, 0 io, 0 vm, 0 hdd
88

Нет необходимости устанавливать какой-либо дополнительный пакет, ваша старая добрая оболочка может сделать это самостоятельно.

Этот однострочник загрузит ваши четыре ядра на 100%:

for i in 1 2 3 4; do while : ; do : ; done & done

Как это работает, довольно просто, он запускает четыре бесконечных цикла. Каждый из них повторяет нулевую инструкцию (: . Каждый цикл способен загружать ядро процессора на 100%.

Если вы используете bash , ksh93 и другие оболочки, поддерживающие диапазоны (т. Е. Не dash или более старые ksh), вы можете использовать этот непереносимый синтаксис:

for i in {1..4}; do ...

Замените 4 на количество процессоров, которые вы хотите загрузить, если отличается от 4 .

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

for i in 1 2 3 4; do kill %$i; done

Отвечая на комментарий @ underscore_d, вот улучшенная версия, которая значительно упрощает остановку загрузки, а также позволяет указать тайм-аут (по умолчанию 60 секунд.) Контроль - C убьет также все бегущие петли. Эта функция оболочки работает как минимум под bash и ksh .

# Usage: lc [number_of_cpus_to_load [number_of_seconds] ]
lc() {
  (
    pids=""
    cpus=${1:-1}
    seconds=${2:-60}
    echo loading $cpus CPUs for $seconds seconds
    trap 'for p in $pids; do kill $p; done' 0
    for ((i=0;i<cpus;i++)); do while : ; do : ; done & pids="$pids $!"; done
    sleep $seconds
  )
}
19

Я сделал простой скрипт на Python, который делает то же самое. Вы можете контролировать количество ядер процессора, которые вы хотите загрузить. Хорошая вещь об этом - то, что это не будет потреблять никакой другой ресурс кроме процессора. (Я думаю, что идея Марка Джонсона потребует много ресурсов ввода-вывода, что здесь нежелательно.)

from multiprocessing import Pool

def f(x):
    # Put any cpu (only) consuming operation here. I have given 1 below -
    while True:
        x * x

# decide how many cpus you need to load with.
no_of_cpu_to_be_consumed = 3

p = Pool(processes=no_of_cpu_to_be_consumed)
p.map(f, range(no_of_cpu_to_be_consumed))

Просто запустите этот скрипт из терминала $ python temp1.py . Вам нужно убить сценарий, когда вы закончите.

Вот мой вывод потребления процессора, когда я загружаю 3 своих ядра.

Скрипт temp1.py создает три процесса (PID - 9377, 9378, 9379), которые загружают 3 из моих ядер

13

Одним из альтернативных способов будет

openssl speed -multi $(grep -ci processor /proc/cpuinfo)

или (если присутствует nproc)

openssl speed -multi $(nproc --all)

OpenSSL почти всегда присутствует в современных дистрибутивах, поэтому никаких дополнительных пакетов не требуется.

8

Начать два

sha1sum /dev/zero &

Команды для каждого ядра в вашей системе.

Прекратить

killall sha1sum

или же

kill sha1sum
7

Я обычно беру cpuburn suite:

sudo apt-get install cpuburn
for i in {1..4}; do burnK7 & done

Замените 4 числом ядер / HT-потоков, которые у вас есть или которые вы хотите подчеркнуть.

Примечание. Это подчеркивает как можно большую площадь микросхемы, так как она запрограммирована на максимальное рассеивание мощности. Я должен был написать этот пост во второй раз, как-то моя машина не понравилась :-(

Вы также можете сделать cpuburn в последовательностях:

burnP6 & burnP6 & burnP6 & burnP6 & 
[1] 28520
[2] 28521
[3] 28522
[4] 28523

И когда вы хотите остановить их:

killall burnP6

Вы также можете умножить burnP6 & чтобы соответствовать количеству процессорных ядер в вашей системе.

5

Я разрабатывал стресс-нг, обновленный инструмент стресса, который может подчеркнуть широкий спектр аспектов системы Linux. Для получения дополнительной информации см. Http://kernel.ubuntu.com/~cking/stress-ng/.

Использование похоже на стресс

$ stress-ng --cpu 4 --vm 2 --fork 8 --switch 4 --timeout 1m
stress-ng: info:  [32254] dispatching hogs: 4 cpu, 8 fork, 4 switch, 2 vm
stress-ng: info:  [32254] cache allocate: default cache size: 8192K

Установить с

sudo apt-get install stress-ng
3

Вы можете запускать эту команду столько раз, сколько захотите, и каждый раз она будет занимать другое ядро:

$ CORES=1
$ for i in `seq 1 $CORES`; do cat /dev/zero > /dev/null &
> done
[1] 8388
2

https://github.com/GaetanoCarlucci/CPULoadGenerator

довольно простое и научное решение.

Здесь вы можете увидеть пример динамики, в которой 50% нагрузки генерируется на ядре 0 процессора:

Вы можете запустить процесс на других ядрах одновременно.

1

Ты можешь использовать:

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

Повторите dd if=/dev/zero of=/dev/null для ядер вашего процессора.

Нажмите любую клавишу, чтобы остановить тест.

1

Я объединил оба +jlliagre и +ecabuk.

#!/bin/bash
lc() {
    nowMs=$(date +%s)
    (
        pids=""
        cpus=${1:-1}
        seconds=${2:-60}
        echo "[$(date)] loading $cpus CPUs for $seconds seconds"
        echo "[$(date)] Expected completion: [$(date --date=@$(expr $nowMs + $seconds))]"
        trap 'for p in $pids; do kill $p; done' 0
        for ((i=0;i<cpus;i++)); do
            sha1sum /dev/zero &
            pids="$pids $!";
        done
        sleep $seconds
    )
    echo "[$(date)] Done"
}

lc $@
0

Простая командная строка делает это тоже:

x="x" ; while : ; do x=$x$x ; echo -n "." ; done
0

Я хотел добавить это к комментарию @ jlliagre, но мне не хватает репутации. Если вы собираетесь использовать этот код на нескольких серверах и число процессоров будет различаться, вы можете использовать следующую команду:

for ((i=1; i<=`nproc --all`; i++)); do while : ; do : ; done & done

Это будет использовать все ядра на вашем сервере, независимо от того, сколько у вас есть. Команда nproc является частью coreutils, поэтому должна использоваться в большинстве установок Linux.

0

pxz - это параллельная реализация xz .

pxz -9e /dev/zero --stdout >/dev/null должны сделать свое дело , так как это довольно интенсивно использует процессор.

Если /dev/zero не достаточно быстрый (вы заметили, что pxz ввод-вывод), вы можете выполнить pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null

В более новых версиях xz есть опция --threads которая заменяет pxz .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .