Як я можу виробляти високе завантаження процесора на сервері Linux?


161

Наразі я перебуваю на налагодженні установки Cacti і хочу створити завантаження процесора для налагодження моїх графіків використання процесора.

Я спробував просто запустити cat /dev/zero > /dev/null, який чудово працює, але використовує лише 1 ядро:

введіть тут опис зображення

Чи є кращий метод тестування / максимізації системних ресурсів під навантаженням?

Пов'язане: Як я можу створити високе завантаження процесора в Windows?


1
чи можливо запускати кілька примірників catодночасно?
Нейт Коппенхавер

@NateKoppenhaver: Так, здається, це можливо під час завершення їх screenсеансів. Але я вважаю за краще більш складне рішення, якщо це можливо.
Der Hochstapler

1
Хе, я завжди користувався cat /dev/random > /dev/null. Вгадайте, /dev/zeroтеж працює. :-)
oKtosiTe

8
@oKtosiTe cat / dev / random має побічний ефект від виснаження ентропії в / dev / random. Бувають випадки, коли вам потрібно зберегти ентропію, я б цього не мав, як переходжу до ягня CPU.
Багата Гомолка

4
@oKtosiTe Те, що сказала Річка Хомолка, це правильно, але це не просто погано, але це також марно, оскільки вона заблокує майже одразу і перестане споживати процесор.
Люк

Відповіді:


187

Спробуйте stress це майже еквівалент Windows consume.exe:

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

22
на ubuntu, ви можете встановити зsudo apt-get install stress
ben

14
і на дебіанських хрипах.
енапупа

10
Про Fedora,sudo yum install stress
Крістофер Маркієта

16
Арка:sudo pacman -S stress
das_j

9
brew install stressна OS X
Крістіан Лонг

94

Не потрібно встановлювати зайвий пакет, ваша стара добра оболонка здатна зробити це самостійно.

Цей однопластовий завантажуватиме ваші чотири ядра 1 на 100%:

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

Як це працює досить просто, він починає чотири нескінченні петлі. Кожен з них повторює нульову інструкцію ( :). Кожен цикл може завантажувати ядро ​​CPU на 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 секунд.) A Control- 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
  )
}

1 Зауважте, що з процесорами, що підтримують більше одного потоку на ядро ​​(Hyper-Thading), ОС буде відправляти навантаження на всі віртуальні процесори. У цьому випадку поведінка навантаження залежить від реалізації (кожен потік може бути повідомлений як 100% зайнятий чи ні). .


Дякую, але чи &викликає команда запуск у окремому потоці чи окремому ядрі ? Я збентежений.
mmdemirbas

3
@mmdemirbas: команда ampersand викликає запуск команди як окремий процес. Потім планувальник відправляє всі активні процеси на всі наявні ядра.
jlliagre

1
Нагадуючи, ви можете зупинити цей тест, видавши killall bash- просто переконайтеся, що у вас не працює якийсь інший важливий сценарій.
кодер

1
@acoder Дякуємо, що запропонували спосіб закінчити цикл. Однак я б цього не уникала killall bash. Відповідь відредаговано, щоб додати більш безпечний метод для припинення генерації навантаження.
jlliagre

1
+1 для функції оболонки lc
Акіра Ямамото

20

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


3
Яку програму ви використовували для відображення цього процесора? Це нагадує мені верх, але я не пригадую «графіки» процесора.
jftuga

13
@jftuga, мабуть, htop , кращий брат топ .
BoppreH

2
так, його htop. Кращий в режимі реального часу, барвистий інтерактивний переглядач процесів для linux - htop.sourceforge.net
Pushpak Dagade

3
Не звертав уваги і проніс це по коробці Windows. Дуже погані речі ...
Деррік

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:

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 &щоб відповідати кількості ядер CPU у вашій системі.


6

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

6
Будь ласка, прочитайте Як я рекомендую програмне забезпечення для деяких порад щодо того, як вам рекомендувати рекомендувати програмне забезпечення. По крайней мере, ви повинні надати більше, ніж просто / принаймні посилання, наприклад, додаткову інформацію про саме програмне забезпечення та про те, як його можна використовувати для вирішення проблеми у питанні.
DavidPostill

3

Ви можете запустити цю команду стільки разів, скільки захочете, і вона щоразу займе інше ядро:

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

1
Хіба це не зробить припинення процесів трохи клопоту?
oKtosiTe

1
killall catповинен це зробити.
Крістіан Манн

1
Залежно від того, чи у вас catзапущені інші процеси (я зазвичай це роблю).
oKtosiTe


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 $@

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

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.


1

Ось як я користуюся, і немає необхідності встановлювати нічого зайвого.

Наприклад, почати з 4 процесів,

nproc | xargs seq | xargs -n1 -P4 md5sum /dev/zero

Ви можете змінити кількість процесів за допомогою параметра "-P" вище.


0

Простий командний рядок також робить це:

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

1
Це було б простіше:while : ; do : ; done
jlliagre

@jlliagre Ваш не ходив би вище loadavg 1.
ott--

Ваш цикл не завантажує в першу чергу процесор, але більше заповнює пам'ять. Це врешті-решт вийде з ладу із помилкою пам'яті.
jlliagre

@jlliagre Шахта заповнює пам'ять і обмінюється (якщо є), таким чином створюючи навантаження 3, перш ніж вона вбита, оскільки у неї не вистачає пам'яті.
ott--

4
Ось у чому проблема. Ви не відповідаєте на поставлене запитання про те, як створити високе завантаження процесора на сервері. Ваш сценарій швидко відключає систему, а потім виходить з ладу. Є набагато надійніші способи отримати вантажопідйомність 3. Наприклад:for i in 1 2 3; do while : ; do : ; done & ; done
jlliagre

0

Я хотів додати це до коментаря @ jlliagre, але мені не вистачає репутації. Якщо ви збираєтеся використовувати цей код на декількох серверах, і кількість ЦП буде різною, ви можете скористатися такою командою:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.