Jak mogę uzyskać duże obciążenie procesora na serwerze z systemem Linux?

161

Obecnie debuguję instalację kaktusów i chcę utworzyć obciążenie procesora, aby debugować moje wykresy wykorzystania procesora.

Próbowałem po prostu uruchomić cat /dev/zero > /dev/null, co działa świetnie, ale wykorzystuje tylko 1 rdzeń:

wprowadź opis zdjęcia tutaj

Czy istnieje lepsza metoda testowania / maksymalizowania zasobów systemowych pod obciążeniem?

Powiązane: Jak mogę uzyskać duże obciążenie procesora w systemie Windows?

Der Hochstapler
źródło
1
czy można uruchomić wiele instancji catjednocześnie?
Nate Koppenhaver
@NateKoppenhaver: Tak, wydaje się, że jest to możliwe w przypadku pakowania ich w screensesje. Ale wolałbym bardziej wyrafinowane rozwiązanie, jeśli to możliwe.
Der Hochstapler
1
Hej, zawsze używałem cat /dev/random > /dev/null. Zgadnij /dev/zeroteż działa. :-)
oKtosiTe
8
@oKtosiTe cat / dev / random ma efekt uboczny polegający na wyczerpaniu entropii w / dev / random. Są chwile, kiedy trzeba zachować entropię, nie miałbym tego, gdy przechodziłem do procesora.
Rich Homolka
4
@oKtosiTe To, co powiedział Rich Homolka, jest słuszne, ale nie chodzi tylko o to, że jest to coś złego, jest również bezużyteczne, ponieważ niemal natychmiast blokuje i przestaje konsumować procesor.
Luc

Odpowiedzi:

187

Spróbuj stress Jest to prawie odpowiednik systemu Windows consume.exe:

oliver$ ./stress --cpu 3
stress: info: [18472] dispatching hogs: 3 cpu, 0 io, 0 vm, 0 hdd
Mitesh Shah
źródło
22
na Ubuntu można zainstalować za pomocąsudo apt-get install stress
ben
14
na debian wheezy też.
enapupe
10
Na Fedorze,sudo yum install stress
Christopher Markieta
16
Arch:sudo pacman -S stress
das_j
9
brew install stressw systemie OS X
Christian Long
94

Nie musisz instalować żadnego dodatkowego pakietu, twoja stara dobra powłoka jest w stanie zrobić to sama.

Ten jednowarstwowy załaduje cztery rdzenie 1 na 100%:

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

Jak to działa, jest dość proste, uruchamia cztery nieskończone pętle. Każdy z nich powtarza instrukcję zerową ( :). Każda pętla jest w stanie załadować rdzeń procesora na 100%.

Jeśli używasz bash, ksh93i inne pociski wspieranie zakresy, (czyli nie dashlub starszy ksh), można użyć tej składni non przenośnym:

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

Zamień 4na liczbę procesorów, które chcesz załadować, jeśli różnią się od 4.

Zakładając, że nie uruchomiłeś już żadnego zadania w tle po uruchomieniu jednej z tych pętli, możesz zatrzymać generowanie obciążenia za pomocą tego polecenia:

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

Odpowiadając na komentarz @ underscore_d, tutaj jest ulepszona wersja, która znacznie upraszcza zatrzymanie ładowania i która pozwala również określić limit czasu (domyślnie 60 sekund.) A Control- Czabije również wszystkie niekontrolowane pętle. Ta funkcja powłoki działa co najmniej pod bashi 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 Należy pamiętać, że w przypadku procesorów obsługujących więcej niż jeden wątek na rdzeń (Hyper-Threading), system operacyjny rozdzieli obciążenie na wszystkie wirtualne procesory. W takim przypadku zachowanie obciążenia zależy od implementacji (każdy wątek może być zgłaszany jako zajęty w 100% lub nie). .

jlliagre
źródło
Dzięki, ale &powoduje, że polecenie działa w osobnym wątku lub oddzielnym rdzeniu ? Jestem zdezorientowany.
mmdemirbas
3
@mmdemirbas: Znak ampersand powoduje, że polecenie działa jako osobny proces. Następnie program planujący wysyła wszystkie aktywne procesy do wszystkich dostępnych rdzeni.
jlliagre
1
Przypominamy, że możesz zatrzymać ten test, wydając go killall bash- po prostu upewnij się, że nie masz w tym czasie żadnego innego ważnego skryptu.
koder
1
@acoder Dziękujemy za zaproponowanie sposobu zakończenia pętli. Chciałbym jednak uniknąć killall bash. Odpowiedź została edytowana, aby dodać bezpieczniejszą metodę zakończenia generowania obciążenia.
jlliagre
1
+1 dla funkcji powłoki lc
Akira Yamamoto
20

Zrobiłem prosty skrypt Pythona, który robi to samo. Możesz kontrolować liczbę rdzeni procesora, które chcesz załadować. Dobrą rzeczą jest to, że nie zużywa żadnych innych zasobów oprócz procesora. (Myślę, że pomysł Marka Johnsona zużyłby dużo zasobów we / wy, co jest tutaj niepożądane).

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))

Po prostu uruchom ten skrypt z terminala $ python temp1.py. Po zakończeniu musisz zabić skrypt.

Oto moje zużycie mocy procesora, gdy ładuję 3 rdzenie.

Skrypt temp1.py tworzy trzy procesy (PID - 9377, 9378, 9379), które ładują 3 moje rdzenie

Pushpak Dagade
źródło
3
Jakiego programu użyłeś do wyświetlenia takiego użycia procesora? Przypomina mi górę, ale nie przypominam sobie „wykresów” procesora.
jftuga
13
@jftuga prawdopodobnie htop , top „s ładniejszej brata.
BoppreH
2
tak, jego htop. Najlepszy czas rzeczywisty, kolorowe interaktywny proces przeglądarka dla systemu Linux - htop.sourceforge.net
Pushpak Dagade
3
Nie zwracałem uwagi i uruchomiłem to na Windowsie. Bardzo złe rzeczy ...
Derrick
13

Byłby jeden alternatywny sposób

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

lub (jeśli nproc jest obecny)

openssl speed -multi $(nproc --all)

OpenSSL jest prawie zawsze obecny w obecnych dystrybucjach, więc nie są potrzebne żadne dodatkowe pakiety.

rkosegi
źródło
8

Zacznij dwa

sha1sum /dev/zero &

polecenia dla każdego rdzenia w systemie.

Zatrzymać

killall sha1sum

lub

kill sha1sum
ecabuk
źródło
7

Zwykle biorę pakiet cpuburn:

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

Zamień 4 na liczbę rdzeni / gwintów HT, które masz lub chcesz podkreślić.

Uwaga: Obciąża to jednocześnie jak najwięcej powierzchni chipa, jest zaprogramowane tak, aby generowało maksymalne rozproszenie mocy. Musiałem napisać ten post po raz drugi, jakoś mojej maszynie się to nie podobało :-(

Możesz również wykonać cpuburn w sekwencjach:

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

A kiedy chcesz je zatrzymać:

killall burnP6

Można również pomnożyć, burnP6 &aby dopasować liczbę rdzeni procesora w systemie.

ce4
źródło
6

Opracowuję stress-ng, zaktualizowane narzędzie do obsługi stresu, które może obciążać wiele różnych aspektów systemu Linux. Aby uzyskać więcej informacji, zobacz http://kernel.ubuntu.com/~cking/stress-ng/

Użycie jest podobne do stresu

$ 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

Zainstaluj za pomocą

sudo apt-get install stress-ng
Colin King
źródło
6
Przeczytaj Jak polecić oprogramowanie, aby uzyskać porady dotyczące tego, jak powinieneś polecać oprogramowanie. Przynajmniej powinieneś podać więcej niż tylko / przynajmniej link, na przykład dodatkowe informacje na temat samego oprogramowania i tego, jak można go użyć do rozwiązania problemu w pytaniu.
DavidPostill
3

Możesz uruchomić to polecenie tyle razy, ile chcesz, i za każdym razem zajmie inny rdzeń:

$ CORES=1
$ for i in `seq 1 $CORES`; do cat /dev/zero > /dev/null &
> done
[1] 8388
Christian Mann
źródło
1
Czy nie sprawiłoby to, że zakończenie procesów byłoby trochę kłopotliwe?
oKtosiTe
1
killall catpowinien to zrobić.
Christian Mann
1
W zależności od tego, czy masz caturuchomione inne procesy (zwykle to robię).
oKtosiTe
1

Połączyłem zarówno + jlliagre i + 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 $@
TJR
źródło
1

Możesz użyć:

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

Powtórz dd if=/dev/zero of=/dev/nulldla rdzeni procesora.

Naciśnij dowolny klawisz, aby zatrzymać test.

Lyma Lyma
źródło
1

pxzjest równoległą implementacją xz.

pxz -9e /dev/zero --stdout >/dev/null powinien załatwić sprawę, ponieważ jest to dość intensywne procesor.

Jeśli /dev/zeronie jest wystarczająco szybki (zauważysz, że pxzprzepustnica we / wy jest ograniczona), możesz to zrobić pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null

Nowsze wersje xzmają --threadsopcję, która jest zamiennikiem pxz.

mucha styropianowa
źródło
1

Oto sposób, w jaki korzystam i nie trzeba instalować niczego dodatkowego.

Na przykład, aby rozpocząć od 4 procesów,

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

Możesz zmienić liczbę procesów za pomocą opcji „-P” powyżej.

Yichun
źródło
0

Robi to również prosta linia poleceń:

x="x" ; while : ; do x=$x$x ; echo -n "." ; done
ott--
źródło
1
To byłoby prostsze:while : ; do : ; done
jlliagre
@jlliagre Pozdrawiam, nie przekraczam loadavg 1.
ott--
Pętla nie ładuje przede wszystkim procesora, ale więcej zapełnia pamięć. W końcu zawiesi się z błędem braku pamięci.
jlliagre
@jlliagre Mine zapełnia pamięć i zamienia (jeśli jest obecna), wytwarzając w ten sposób ładunek 3, zanim zabije się, ponieważ zabraknie pamięci.
ott--
4
To jest problem. Nie odpowiadasz na zadane pytanie, jak wytworzyć duże obciążenie procesora na serwerze. Twój skrypt szybko powoduje brak reakcji systemu, a następnie ulega awarii. Istnieją znacznie bardziej niezawodne sposoby uzyskania loadavg 3. np.:for i in 1 2 3; do while : ; do : ; done & ; done
jlliagre
0

Chciałem dodać to do komentarza @ jlliagre, ale nie mam wystarczającej reputacji. Jeśli zamierzasz używać tego kodu na wielu serwerach, a liczba procesorów będzie się różnić, możesz użyć następującego polecenia:

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

Spowoduje to wykorzystanie wszystkich rdzeni na serwerze bez względu na ich liczbę. Polecenie nprocjest częścią coreutils, więc powinno być w większości instalacji Linuksa.

AndreasKralj
źródło