Bir Linux sunucusunda yüksek CPU yükünü nasıl üretebilirim?


161

Şu anda bir Cacti yüklemesinde hata ayıklama sürecinde ve CPU kullanım grafikleri hata ayıklamak için CPU yükü oluşturmak istiyorum.

Basitçe koşmaya çalıştım cat /dev/zero > /dev/null, bu harika çalışıyor ama sadece 1 çekirdekten faydalanıyor:

görüntü tanımını buraya girin

Yük altında sistem kaynaklarını test etmek / maksimize etmek için daha iyi bir yöntem var mı?

İlgili: Windows'ta yüksek CPU yükü nasıl üretebilirim?


1
Aynı catanda birden fazla örnek çalıştırmak mümkün mü?
Nate Koppenhaver

@NateKoppenhaver: Evet, bunları screenoturumlara sarırken bu mümkün gibi görünüyor . Ancak mümkünse daha karmaşık bir çözümü tercih ederdim.
Der Hochstapler

1
Heh, ben her zaman kullandım cat /dev/random > /dev/null. Sanırım da /dev/zeroçalışıyor. :-)
oKtosiTe

8
@OKtosiTe cat / dev / random, / dev / random içindeki entropiyi tüketmenin yan etkisine sahiptir. Entropiyi korumanız gereken zamanlar vardır, benim CPU hog'um gibi bu olmazdı.
Rich Homolka

4
@OKtosiTe Rich Homolka'nın söylediği şey doğru, ancak yapılması gereken kötü bir şey değil, aynı zamanda işe yaramaz çünkü hemen hemen engeller ve cpu tüketmeyi keser.
Luc,

Yanıtlar:



94

Fazladan bir paket kurmanıza gerek yok, eski kabuğunuz yalnız bunu yapabilir.

Bu bir astar, dört çekirdeğinizi 1'i % 100 oranında yükleyecektir :

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

Nasıl çalıştığını oldukça basit, dört sonsuz döngüye başlar. Her biri null komutunu ( :) tekrarlıyor . Her döngü bir CPU çekirdeğini% 100 yükleyebilir.

Eğer kullanırsanız bash, ksh93ve diğer kabuklar aralıkları destekleyen (yani değil dashveya daha eski ksh), bu olmayan taşınabilir sözdizimini kullanabilirsiniz:

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

Farklıysa 4, yüklemek istediğiniz CPU sayısı ile değiştirin 4.

Bu döngülerden birini başlattığınızda zaten çalışan bir arka plan işiniz olmadığını varsayarak, bu komutla yük oluşturmayı durdurabilirsiniz:

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

@ Underscore_d adlı kullanıcının yorumuna göre, burada yükü durduracak kadar basitleştiren ve ayrıca bir zaman aşımı belirtilmesine izin veren (varsayılan 60 saniye) A Control- Ctüm kaçak döngüleri de öldürür. Bu kabuk işlevi en azından bashve altında çalışır 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 Çekirdek başına birden fazla iş parçacığını destekleyen CPU'larda (Hiper iş parçacığı), işletim sisteminin yükü tüm sanal işlemcilere göndereceğini unutmayın. Bu durumda, yükleme davranışı uygulamaya bağlıdır (her iş parçacığı% 100 meşgul olarak bildirilebilir veya bildirilmeyebilir). .


Teşekkürler, ancak &bir komutun ayrı bir iş parçacığında veya ayrı bir çekirdeğinde çalışmasına neden olur ? Kafam karıştı.
mmdemirbas

3
@ mmdemirbas: Ve işareti komutun ayrı bir işlem olarak çalışmasına neden olur. Zamanlayıcı daha sonra tüm aktif işlemleri mevcut tüm çekirdeklere gönderir.
jlliagre

1
Bir hatırlatıcı olarak, bu testi yayınlayarak durdurabilirsiniz killall bash- o sırada çalışan başka bir önemli komut dosyası olmadığından emin olun.
kodlayıcı

1
@ acoder Döngüyü sonlandırmanın bir yolunu önerdiğiniz için teşekkür ederiz. Ancak ben kaçınırdım killall bash. Yük oluşumunu sonlandırmak için daha güvenli bir yöntem eklemek üzere düzenlenmiş cevap.
jlliagre

1
Lc kabuk işlevi için +1
Akira Yamamoto

20

Aynı olan basit bir python betiği yaptım. Yüklemek istediğiniz işlemci sayısını kontrol edebilirsiniz. Bu konuda iyi bir şey, CPU dışında başka bir kaynak tüketmeyecek olmasıdır. (Mark Johnson'ın fikrinin burada istenmeyen bir çok G / Ç kaynağı tüketeceğini düşünüyorum.)

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

Sadece bu betiği terminalden çalıştırın $ python temp1.py. İşin bitince senaryoyu öldürmen gerekiyor.

İşte, çekirdeklerimin 3'ünü yüklediğimde işlemci tüketim çıktım.

Script temp1.py üç çekirdeği oluşturur (PID'ler - 9377, 9378, 9379)


3
CPU kullanımını bu şekilde göstermek için hangi programı kullandınız? Bana tepeyi hatırlatıyor, ancak CPU 'çizelgelerini' hatırlamıyorum.
jftuga

13
jftuga muhtemelen tepesinde , en güzel erkek kardeşi.
BoppreH

2
evet onun tepesi. En iyi gerçek zamanlı, linux için renkli etkileşimli işlem görüntüleyici - htop.sourceforge.net
Pushpak Dagade

3
Dikkat etmemiş ve bunu bir Windows kutusuna koymuş. Çok kötü şeyler ...
Derrick

13

Alternatif bir yol olabilir

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

veya (nproc varsa)

openssl speed -multi $(nproc --all)

OpenSSL, günümüzde dağıtımlarda neredeyse her zaman mevcuttur, bu nedenle ekstra paket gerekmez.


8

İki başla

sha1sum /dev/zero &

Sisteminizdeki her çekirdek için komutlar.

Durdurmak için

killall sha1sum

veya

kill sha1sum

7

Genelde cpuburn takımını alırım:

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

4'ü, sahip olduğunuz veya vurgulamak istediğiniz çekirdek / HT-iplik sayısı ile değiştirin.

Not: Bu, mümkün olduğu kadar talaş bölgesini aynı anda vurgular, maksimum güç dağıtımı sağlayacak şekilde programlanır. Bu yazıyı ikinci kez yazmak zorunda kaldım, bir şekilde makinem beğenmedi :-(

Ayrıca dizileri de cpuburn yapabilirsiniz:

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

Ve onları durdurmak istediğinizde:

killall burnP6

burnP6 &Sisteminizdeki CPU çekirdeği sayısını eşleştirmek için de çarpabilirsiniz .


6

Bir Linux sisteminin çok çeşitli yönlerini vurgulayabilen, güncellenmiş bir stres aracı olan stres yaratıyordum. Daha fazla bilgi için, bkz. Http://kernel.ubuntu.com/~cking/stress-ng/

Kullanımı strese benzer

$ 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

İle yükleyin

sudo apt-get install stress-ng

6
Lütfen okuyun Yazılım önerisi hakkında nasıl gitmeniz gerektiği hakkında bazı ipuçları için yazılımı nasıl öneririm. En azından, örneğin yazılımın kendisi hakkında ek bilgiler ve sorudaki sorunu çözmek için nasıl kullanılabileceği gibi, en azından bir bağlantıdan daha fazlasını sağlamalısınız.
DavidPostill

3

Bu komutu istediğiniz kadar çalıştırabilirsiniz ve her seferinde farklı bir çekirdek alacak:

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

1
Bu, süreçleri sonlandırmaktan biraz sıkıntı yaratmaz mı?
oKtosiTe

1
killall catyapmalı.
Christian Mann

1
catÇalışan başka işlemlerin olup olmadığına bağlı olarak (genellikle yaparım).
oKtosiTe


1

Hem + jlliagre hem de + ecabuk'u birleştirdim.

#!/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

Kullanabilirsiniz:

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/nullCPU çekirdeğiniz için tekrarlayın .

Testi durdurmak için herhangi bir tuşa basın.


1

pxzparalel bir uygulamasıdır xz.

pxz -9e /dev/zero --stdout >/dev/null Bu oldukça cpu yoğun olduğu gibi hile yapmak gerekir.

Eğer /dev/zeroyeterince hızlı değil (bunu fark pxzyapabileceğiniz G / Ç throttled alır) pxz -9e /dev/zero --stdout | pxz -9e --stdout >/dev/null

Yeni sürümleri xziçin bir --threadsseçenek olan seçeneğine sahiptir pxz.


1

İşte kullandığım yol ve fazladan herhangi bir şey kurmanıza gerek yok.

Örneğin 4 işlemle başlamak için

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

İşlem sayısını yukarıdaki "-P" seçeneğiyle değiştirebilirsiniz.


0

Basit bir komut satırı da yapar:

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

1
Bu daha basit olurdu:while : ; do : ; done
jlliagre

@jlliagre Yours wol'tv yukarıda loadavg 1.
ott--

Döngünüz öncelikle CPU'yu yüklemiyor, daha çok belleği dolduruyor. Sonunda yetersiz bellek hatasıyla çökecektir.
jlliagre

jlliagre Mine hafızayı doldurur ve takas eder (eğer varsa), böylece hafızası tükendiğinden öldürülmeden önce 3 yük oluşturur.
ott--

4
İşte sorun bu. Bir sunucuda yüksek CPU yükünün nasıl üretileceği sorusu soruyu yanıtlamıyorsunuz. Komut dosyanız hızlı bir şekilde sistemi yanıt vermiyor ve ardından çöküyor. 3. ör bir loadavg'dan almak için çok daha güvenilir yolu vardır:for i in 1 2 3; do while : ; do : ; done & ; done
jlliagre

0

Bunu @ jlliagre'nin yorumuna eklemek istedim, ancak bu kadar itibarım yok. Bu kodu birden fazla sunucuda kullanacaksanız ve CPU sayısı değişecektir, aşağıdaki komutu kullanabilirsiniz:

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

Bu ne kadar olursa olsun sunucunuzdaki tüm çekirdekleri kullanacaktır. Komut nproccoreutillerin bir parçasıdır, bu yüzden çoğu Linux kurulumunda olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.