Linux 서버에서 높은 CPU로드를 생성하려면 어떻게해야합니까?


161

현재 Cacti 설치디버깅하는 중이며 CPU 사용률 그래프를 디버깅하기 위해 CPU로드를 생성하려고합니다.

나는 간단하게 실행하려고 시도했지만 cat /dev/zero > /dev/null훌륭하게 작동하지만 1 코어 만 사용합니다.

여기에 이미지 설명을 입력하십시오

로드 상태에서 시스템 리소스를 테스트 / 최대화하는 더 좋은 방법이 있습니까?

관련 : Windows에서 어떻게 높은 CPU로드를 생성 할 수 있습니까?


1
cat동시에 여러 인스턴스를 실행할 수 있습니까?
Nate Koppenhaver 2016 년

@ NateKoppenhaver : 예, screen세션 에서 래핑 할 때 가능 합니다. 그러나 가능한 경우보다 정교한 솔루션을 선호합니다.
Der Hochstapler 2016 년

1
허, 나는 항상 사용했다 cat /dev/random > /dev/null. 추측도 /dev/zero작동합니다. :-)
oKtosiTe

8
@oKtosiTe cat / dev / random은 / dev / random에서 엔트로피를 고갈시키는 부작용이 있습니다. 엔트로피를 보존해야 할 때가 있습니다 .CPU 호그로 갈 때 이것이 없습니다.
Rich Homolka

4
Rich Homolka가 말한 것은 옳지 만, 나쁜 일이 아니라, 거의 즉시 차단하고 CPU 소비를 중단하기 때문에 쓸모가 없습니다.
Luc

답변:


187

시도 stress 그것은 거의 윈도우의 등가이다 consume.exe:

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

22
우분투에서 설치하실 수 있습니다sudo apt-get install stress
ben

14
데비안에서도 wheezy.
enapupe

10
Fedora에서sudo yum install stress
Christopher Markieta

16
아치 :sudo pacman -S stress
das_j

9
brew install stressOS X에서
Christian Long

94

추가 패키지를 설치할 필요가 없으며, 오래된 쉘에서 단독으로 수행 할 수 있습니다.

이 원 라이너는 4 개의 코어 1 을 100 %로 로드합니다 .

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

작동 방식은 매우 간단하며 4 개의 무한 루프를 시작합니다. 그들 각각은 널 명령 ( :)을 반복합니다 . 각 루프는 CPU 코어를 100 %로로드 할 수 있습니다.

당신이 사용하는 경우 bash, ksh93다른 쉘 범위를 지원하는 (즉,하지 dash또는 그 이상 ksh)이 아닌 휴대용 구문을 사용할 수 있습니다 :

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

4와 다른 경우로드하려는 CPU 수로 교체하십시오 4.

이러한 루프 중 하나를 시작할 때 백그라운드 작업이 이미 실행 중이 아니라고 가정하면 해당 명령으로로드 생성을 중지 할 수 있습니다.

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

@의 underscore_d의 의견을 응답, 여기에 많은 부하를 중지 간단하고도 타임 아웃 (. 기본 60초)를 지정 할 수 향상된 버전입니다 Control- C너무 모든 가출 루프를 죽일 것이다. 이 쉘 함수는 적어도 bashand 아래에서 작동합니다 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 코어 당 둘 이상의 스레드를 지원하는 CPU (하이퍼 스레딩)를 사용하면 OS가 모든 가상 CPU에로드를 전달합니다. 이 경우로드 동작은 구현에 따라 다릅니다 (각 스레드는 100 % 사용 중이라고보고 될 수 있음). .


감사하지만 &명령이 별도의 스레드 또는 별도의 코어 에서 실행되도록 합니까? 혼란 스러워요.
mmdemirbas

3
@mmdemirbas : 앰퍼샌드로 인해 명령이 별도의 프로세스로 실행됩니다. 스케줄러는 모든 활성 프로세스를 사용 가능한 모든 코어로 디스패치합니다.
jlliagre

1
알림으로 발행을 통해이 테스트를 중지 할 수 있습니다 killall bash. 당시에 다른 중요한 스크립트가 실행되고 있지 않은지 확인하십시오.
코더

1
@acoder 루프를 끝내는 방법을 제안 해 주셔서 감사합니다. 그러나 나는 피할 killall bash것이다. 부하 생성을 종료하기 위해보다 안전한 방법을 추가하기 위해 답변이 편집되었습니다.
jlliagre

1
lc 쉘 기능의 +1
Yamamoto Akira

20

동일한 파이썬 스크립트를 만들었습니다. 로드하려는 CPU 코어 수를 제어 할 수 있습니다. 이것에 대한 좋은 점은 CPU 이외의 다른 리소스를 소비하지 않는다는 것입니다. (Mark Johnson의 아이디어는 여기에서 바람직하지 않은 많은 I / O 리소스를 소비 할 것이라고 생각합니다.)

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 개를로드 할 때 CPU 소비량이 출력됩니다.

스크립트 temp1.py는 3 개의 프로세스 (PID-9377, 9378, 9379)를 만들어 내 코어 중 3 개를로드합니다.


3
CPU 사용량을 표시하기 위해 어떤 프로그램을 사용 했습니까? 그것은 나에게 최고를 생각 나게하지만 CPU '차트'를 기억하지 않습니다.
jftuga

13
@jftuga 아마 htop , 상단 의 예쁜 동생.
BoppreH

2
그렇습니다. - 리눅스를위한 최고의 실시간, 다채로운 대화 형 프로세스 뷰어 htop.sourceforge.net
Pushpak Dagade

3
주의를 기울이지 않고 Windows 상자에서 실행했습니다. 아주 나쁜 일들 ...
Derrick

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 시스템의 다양한 측면을 강조 할 수있는 업데이트 된 스트레스 도구 인 stress-ng를 개발하고 있습니다. 자세한 내용은 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해야합니다.
Christian Mann

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/nullCPU 코어에 대해 반복 하십시오.

테스트를 중지하려면 아무 키나 누르십시오.


1

pxz의 병렬 구현입니다 xz.

pxz -9e /dev/zero --stdout >/dev/null 이것은 상당히 CPU 집약적이므로 트릭을 수행해야합니다.

/dev/zero충분히 빠르지 않은 경우 ( pxzI / O 스로틀 됨을 알 수 있음 ) 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 Yours는 loadavg 1 이상으로 올라가지 않았습니다.
ott--

루프는 주로 CPU를로드하지 않지만 메모리를 더 많이 채 웁니다. 결국 메모리 부족 오류로 인해 충돌이 발생합니다.
jlliagre

@jlliagre Mine은 메모리를 채우고 스왑 (있는 경우)하여 메모리가 부족하여 종료되기 전에 3의로드를 생성합니다.
ott--

4
그게 바로 문제 야. 서버에서 높은 CPU로드를 생성하는 방법에 대한 질문에 대답하지 않았습니다. 스크립트가 시스템을 빠르게 응답하지 못하게하고 충돌합니다. loadavg 3을 얻는 훨씬 더 신뢰할 수있는 방법이 있습니다. 예 :for i in 1 2 3; do while : ; do : ; done & ; done
jlliagre

0

나는 이것을 @jlliagre의 의견에 추가하고 싶었지만 평판이 충분하지 않습니다. 여러 서버에서이 코드를 사용하려고하고 CPU 수가 다를 경우 다음 명령을 사용할 수 있습니다.

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

이렇게하면 서버 수에 관계없이 서버의 모든 코어가 활용됩니다. 이 명령 nproc은 coreutils의 일부이므로 대부분의 Linux 설치에 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.