프로그램을 느리게 실행


102

Linux에서 OS 매개 변수를 변경하여 C ++ 프로그램을 더 느리게 실행할 수있는 방법이 있습니까? 이런 식으로 특정 프로그램이 실제 속도가 느린 시스템에서 실행될 경우 어떤 일이 발생하는지 시뮬레이션하고 싶습니다.

즉, 더 빠른 머신은 특정 프로그램에 대해 더 느린 머신으로 동작해야합니다.


5
'nice'를 사용하여 매우 낮은 우선 순위를 부여 할 수 있습니다. 결정적인 것은 아니지만 도움이 될 수 있습니다!
John3136 2013-01-17

7
프로세서를 회전시키는 다른 프로그램을 사용하여 VM 내에서 실행하십시오.
thang

12
nice스케줄링 우선 순위를 낮추는 명령입니다. 고대, 상대적으로 조잡합니다. 스케줄링 우선 순위를 볼 수 있지만 머신이 다른 작업을 수행 하느라 바쁘지 않으면 프로그램이 여전히 빠르게 실행됩니다. 따라서 아마도 충분히 도움이되지 않을 것입니다.
Jonathan Leffler 2013 년

9
컴퓨터에는 항상 많은 실행 프로세스가 있으므로 앱을 느리게 실행하는 것은 특별히 도움이되지 않는다는 점을 명심해야합니다. 엉뚱한 하드웨어에서 앱이 어떻게 작동하는지 확인하려면 엉뚱한 하드웨어를 얻거나 하드웨어의 BIOS 설정을 일시적으로 변경하여 엉터리로 만들어야합니다. 일부 BIOS에서는 추가 코어를 비활성화하고 CPU 클럭을 낮출 수 있습니다.
Mike Trusov 2013 년

23
"Turbo"버튼을 누르십시오!
SoftDev

답변:


145
  • nice(및 / 또는 renice)을 사용하여 우선 순위를 낮 춥니 다 . nice()시스템 호출을 사용하여 프로그래밍 방식으로 수행 할 수도 있습니다 . 이것은 그 자체로 실행 속도를 늦추지 않지만 Linux 스케줄러가 실행 시간 프레임을 더 적게 할당하고 더 자주 선점하는 등의 작업을 수행합니다. 스케줄링에 대한 자세한 내용 은 Linux 커널 이해의 프로세스 스케줄링 (10 장) 을 참조하십시오. .
  • 커널에 더 많은 부하를 가하기 위해 타이머 인터럽트 빈도늘릴 수 있습니다. 그러면 모든 속도가 느려집니다. 이를 위해서는 커널 재 구축이 필요합니다.
  • 당신이 사용할 수있는 CPU 주파수 스케일링 메커니즘 (커널 모듈이 필요합니다) 및 제어 (느린 다운 속도까지)를 사용하여 CPU cpufreq-set명령을 사용합니다.
  • 또 다른 가능성은 sched_yield()프로그램의 성능에 중요한 부분에서 다른 프로세스에 양자를 제공하는를 호출 하는 것입니다 (코드 변경 필요).
  • LD_PRELOAD를 사용하여 , 등의 일반적인 함수를 연결 malloc()하고 free(),을 clock_gettime()사용하여 몇 백만 CPU 사이클을 태우고 메모리 장벽을 삽입하는 등의 어리석은 작업을 수행 할 수 있습니다 . 이렇게하면 프로그램 속도가 확실히 느려집니다. ( 작업을 수행하는 방법에 대한 예는 이 답변 을 참조하십시오 ).rep; hop;
  • @Bill이 언급했듯이 할당 된 CPU 리소스, 메모리 등의 양을 제한 할 수있는 가상화 소프트웨어에서 항상 Linux를 실행할 수 있습니다.
  • 프로그램이 정말 느리기를 원한다면 Valgrind 에서 실행하십시오 (메모리 누수, 잘못된 메모리 참조 등과 같은 응용 프로그램의 문제를 찾는 데 도움이 될 수도 있습니다).
  • 최적화를 비활성화하여 바이너리를 다시 컴파일하면 약간의 속도가 느려질 수 있습니다 (예 : -O0어설 션 활성화 (예 :) -DDEBUG.
  • 느린 CPU로 항상 오래된 PC 또는 저렴한 넷북 (예 : One Laptop Per Child )을 구입하고 테스트를 마치면 어린이 에게 기부하는 것을 잊지 말고 프로그램을 실행할 수 있습니다.

도움이되기를 바랍니다.


15
+1 : 각각에 대한 기본 요구 사항을 포함한 다양한 제안 세트
lxop 2013 년

4
디버깅 기호 ( -ggdb3)를 활성화 해도 바이너리 실행 속도가 느려 지지 않습니다 . 그것은 단지 그것을 더 크게 만듭니다.
caf

11
+1 esp., "... 오래된 PC 또는 저렴한 넷북 구입 ... 그리고 테스트를
Kris

3
다양한 유형의 '느림'을 시뮬레이션하는 방법을 보여주기 위해 답변을 편집 할 수 있습니까? 느린 I / O, 느린 CPU, 느린 메모리, 메모리 스 래싱
등간에 차이가 있습니다.

3
블라드 +1. CPU와 리눅스 커널을 지원한다면 아마도 cpufreq는 쉽게 할 수 있습니다. 이것은 지시 수준의 세분성을 가져야합니다. 이것은 아마도 새 하드웨어를 구입하지 않는 가장 일반적인 대답 일 것입니다. 레이스를 유발할 수있는 느린 네트워크, 디스크, 비디오 등을 시뮬레이션하지 않습니다.
artless noise

36

QEMU 는 Linux 용 CPU 에뮬레이터입니다. 데비안에는 패키지가 있습니다 (대부분의 배포판 이 될 것이라고생각합니다). 에뮬레이터에서 프로그램을 실행할 수 있으며 대부분은 속도 저하를 지원해야합니다. 예를 들어, Miroslav Novak 에는 QEMU를 늦추는 패치가 있습니다.

또는 다른 CPU-linux (arm-none-gnueabi-linux 등)로 크로스 컴파일 한 다음 QEMU가 해당 코드를 실행하도록 변환 할 수 있습니다.

좋은 제안은 간단하고 CPU를 소비 할 다른 프로세스와 결합하면 작동 할 수 있습니다.

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;

그래픽, 파일 및 / 또는 네트워크 I / O가 필요한지 말하지 않았습니까? 찾고있는 오류 클래스 에 대해 알고 있습니까? 경쟁 조건입니까, 아니면 코드가 고객 사이트에서 제대로 작동하지 않습니까?

편집 : STOPCONT 와 같은 신호를 사용 하여 프로그램을 시작하고 중지 할 수도 있습니다. 디버거도이 작업을 수행 할 수 있습니다. 문제는 코드가 최대 속도로 실행 된 다음 중지 된다는 것 입니다. Linux 스케줄러를 사용하는 대부분의 솔루션에는이 문제가 있습니다. 인텔의 일종의 스레드 분석기가있었습니다. 내가 볼 의 VTune 릴리스 노트 . 이것은 Vtune이지만 스레드 레이스를 분석하는 또 다른 도구가 있다고 확신했습니다. 참조 : 일부 스레드 경합 상태를 확인할 수있는 인텔 스레드 검사기 . 하지만 앱이 다중 스레드인지 알 수 없습니까?


1
bochs는 더 오래되고 느린 CPU 에뮬레이터입니다 (x86 만 해당).
osgx 2013

22

사용 cpulimit:

Cpulimit는 프로세스의 CPU 사용량을 제한하는 도구입니다 (CPU 시간이 아니라 백분율로 표시됨). 배치 작업이 너무 많은 CPU주기를 먹지 않도록하려는 경우에 유용합니다. 목표는 프로세스가 지정된 시간 비율 이상 실행되는 것을 방지하는 것입니다. nice 값이나 기타 스케줄링 우선 순위 설정을 변경하지 않고 실제 CPU 사용량을 변경합니다 . 또한 전체 시스템 부하 에 동적으로 빠르게 적응할 수 있습니다.

사용 된 CPU 양의 제어는 SIGSTOP 및 SIGCONT POSIX 신호를 프로세스에 전송합니다.

지정된 프로세스의 모든 하위 프로세스와 스레드는 동일한 CPU 비율을 공유합니다.

우분투 저장소에 있습니다. 다만

apt-get install cpulimit

다음은 이미 실행중인 프로그램에서 사용하는 방법에 대한 몇 가지 예입니다.

실행 파일 이름으로 'bigloop'프로세스를 CPU 40 %로 제한합니다.

cpulimit --exe bigloop --limit 40
cpulimit --exe /usr/local/bin/bigloop --limit 40 

PID로 프로세스를 55 % CPU로 제한 :

cpulimit --pid 2960 --limit 55

아직 cpulimit를 테스트하지 않았지만 SE 사이트의 유사한 질문에 대한 최상의 답변 인 것 같습니다. cpulimit에 의해 제한적으로 실행되는 프로그램과 느린 하드웨어에서 실행되는 프로그램 사이에 눈에 띄는 차이점이 있습니까? 내 목표는 앱을 테스트하여 느린 컴퓨터에서 앱이 충분히 반응하는지 확인하고 느린 컴퓨터에서는 그래픽을 조정하는 것입니다.
trusktr

@trusktr 그것은 그 프로그램이 실제로하는 일에 크게 의존합니다. 구형 하드웨어의 경우 디스크 속도와 사용 가능한 메모리 (RAM)도 성능에 영향을 미치며 그래픽, GPU에 대한 부분에서도 생각할 수 있습니다. 더있을 수 있습니다. CPU가 실제로 병목 현상 인 경우 cpulimit는 시도해 볼 가치가 있습니다. (이 답변은 7 년
전이고

흥미 롭군. 맞습니다. 저는 HDD 나 GPU를 고려하지 않았습니다. 실제로 더 느린 하드웨어로 테스트하는 것이 가장 좋은 방법이라고 생각하지만 현재로서는 저사양 전화기 (JS + WebGL 앱)에서도 게시하고 싶지만 강력한 워크 스테이션 만 있습니다.
trusktr

13
  1. 오래된 컴퓨터 구입
  2. VPS 호스팅 패키지는 느리게 실행되고 많은 중단이 발생하며 매우 다양한 지연 시간이 있습니다. 저렴할수록 하드웨어가 더 나빠질 것입니다. 정말 오래된 하드웨어와는 달리, 일반적으로 오래된 하드웨어에서 찾을 수없는 명령어 세트 (SSE4)를 포함 할 가능성이 높습니다. 그럼에도 불구하고 천천히 걷고 자주 셔터를 누르는 시스템을 원한다면 저렴한 VPS 호스트가 가장 빠른 시작이 될 것입니다.

3

정말 느린 컴퓨터에서 동작을 분석하기 위해 프로그램을 시뮬레이션하려면 전체 프로그램을 thread다른 주요 프로그램 으로 실행하도록 만들 수 있습니다 .

이러한 방식으로 한 번에 몇 개의 스레드에서 서로 다른 우선 순위로 동일한 코드의 우선 순위를 지정하고 분석 데이터를 수집 할 수 있습니다. 저는 이것을 프레임 프로세싱 분석을 위해 게임 개발에 사용했습니다.


2

수면을 사용하거나 코드 내에서 기다리십시오. 가장 밝은 방법은 아니지만 속도가 다른 모든 종류의 컴퓨터에서 허용됩니다.


2

가장 간단한 방법은 메인 실행 가능 코드를 마지막에 휴면 상태로 while 루프로 래핑하는 것입니다.

예를 들면 :

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

사람들이 언급했듯이 이것은 논리 코드가 여전히 정상 속도로 실행되지만 실행 사이에 지연이 있기 때문에 가장 정확한 방법은 아닙니다. 또한 논리 코드가 루프에서 실행되는 것으로 가정합니다.

그러나 그것은 간단하고 구성 가능합니다.

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