Вопрос Как я могу получить высокую загрузку процессора на сервере Linux?


Я сейчас в процессе отладка установки кактусов и хотите создать загрузку процессора для отладки графиков использования процессора.

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

enter image description here

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

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


138
2018-06-30 17:13


происхождения


возможно ли запустить несколько экземпляров cat одновременно? - Nate Koppenhaver
@NateKoppenhaver: Да, это кажется возможным, когда они завертывают их в screen сессий. Но я предпочел бы более сложное решение, если это возможно. - Der Hochstapler
Хех, я всегда использовал cat /dev/random > /dev/null, Угадай /dev/zero работает тоже. :-) - oKtosiTe
@oKtosiTe cat / dev / random имеет побочный эффект истощения энтропии в / dev / random. Есть моменты, когда вам нужно сохранить энтропию, у меня не было бы этого, поскольку я пошел бы к богу CPU. - Rich Homolka
@oKtosiTe Что сказал Rich Homolka, это правильно, но дело не только в том, что это плохо, но и бесполезно, потому что он почти сразу блокируется и перестанет потреблять процессор. - Luc


ответы:


Пытаться stress Это в значительной степени эквивалент Windows consume.exe:

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

158
2018-06-30 17:27



на ubuntu, вы можете установить с помощью sudo apt-get install stress - ben
на debian wheezy тоже. - enapupe
На Fedora, sudo yum install stress - Christopher Markieta
Arch: sudo pacman -S stress - das_j
brew install stress на OS X - Christian Long


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

Этот однострочный сканер загрузит ваши четыре ядра на 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

Комментарий Answering @ underscore_d, вот расширенная версия, которая упрощает много остановки загрузки, а также позволяет указать тайм-аут (по умолчанию 60 секунд). A контроль-С также убьет все беглые петли. Эта функция оболочки работает по крайней мере в 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
  )
}

82
2017-07-01 14:55



Спасибо, но & заставляет команду запускаться в отдельном нить или отдельных ядро? Я запутался. - mmdemirbas
@mmdemirbas: амперсанд заставляет команду запускаться как отдельный процесс. Затем планировщик отправляет все активные процессы во все доступные ядра. - jlliagre
В качестве напоминания вы можете остановить этот тест, выпустив killall bash - просто убедитесь, что у вас нет другого важного скрипта, работающего в то время. - a coder
@acoder Спасибо, что предложили способ закончить цикл. Однако я бы избегал killall bash, Ответ отредактирован, чтобы добавить более безопасный метод для завершения генерации нагрузки. - jlliagre
или просто закончить их fg ctrl + c, 4 раза. - Blauhirn


Я сделал простой скрипт 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 своих ядра.

Script temp1.py creates three processes (PIDs - 9377, 9378, 9379) which load 3 of my cores


18
2018-06-30 17:56



Какую программу вы использовали для показа использования ЦП? Это напоминает мне топ, но я не помню диаграммы процессора. - jftuga
@jftuga возможно HTOP, Вверх's более красивый брат. - BoppreH
да его htop. Лучший в реальном времени, красочный интерактивный просмотрщик процессов для Linux - htop.sourceforge.net - Pushpak Dagade
Не обращал внимания и запускал это в окне Windows. Очень плохие вещи ... - Derrick


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

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

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

openssl speed -multi $(nproc --all)

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


12
2017-09-08 11:19





Начните два

sha1sum /dev/zero &

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

Остановиться

killall sha1sum

или

kill sha1sum

8
2017-11-01 21:31





Я обычно беру 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 & чтобы соответствовать количеству ядер процессора в вашей системе.


7
2017-07-25 21:33





Я развиваю стресс-нг, обновленный инструмент стресса, который может подчеркнуть широкий спектр аспектов системы 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

5
2017-09-06 20:11



Пожалуйста прочти Как я рекомендую программное обеспечение для некоторых советов о том, как вам следует рекомендовать программное обеспечение. По крайней мере, вы должны предоставить больше, чем просто / хотя бы ссылку, например, некоторую дополнительную информацию о самом программном обеспечении и о том, как ее можно использовать для решения проблемы в вопросе. - DavidPostill♦


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

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

2
2017-07-01 02:09



Разве это не приведет к тому, что процессы перестанут быть проблемой? - oKtosiTe
killall cat должен это сделать. - Christian Mann
В зависимости от того, есть ли у вас другой cat процессы выполняются (я обычно делаю). - oKtosiTe


https://github.com/GaetanoCarlucci/CPULoadGenerator

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

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

enter image description here

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


2
2018-03-28 15:46





Я объединил и + 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 $@

1
2018-06-22 16:47





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

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
2017-07-24 19:12