CPU 온도를 조절하기 위해 하나의 프로세스 만 느리게


9
  1. 프로그램이 있습니다. 그것이 실행될 때 CPU 온도가 50에서 80 섭씨로 상승하는데, 이것이 나의 주요 관심사입니다.

    CPU 주파수를 제어하여 속도를 늦출 수 있지만 원하지 않는 다른 프로세스도 느려집니다.

    CPU를 시원하게 유지하기 위해 다른 프로세스에 영향을주지 않고 특정 프로세스 속도를 늦출 수 있습니까?

    내 OS는 Ubuntu 10.10입니다.

  2. 에 의해 프로세스의 우선 순위를 설정하려고 시도했지만 nice -n 15 myprogram작동하는지 확실하지 않습니다. CPU는 77 Celcius high입니다.

    않습니다 nice만 다른 프로세스 WRT 프로세스의 상대적 우선 순위를 설정? 즉, 다른 프로세스가 실행되고 있지 않으면이 멋진 프로세스가 빠르게 실행됩니까? 프로세스가 전반적으로 느리게 실행되도록 설정하고 싶습니다.


1
이 과정은 무엇을 하는가? 무거운 입력 / 출력? 메인 CPU에 대한 과도한 계산? GPU (비디오 카드)에 대한 과도한 계산 (일반적으로 이미지를 계산하는 프로그램에 국한되지 않음)?
Gilles 'SO- 악마 그만해'

이 프로그램은 pdf2djvu이며 pdf 파일을 djvu로 변환합니다. 무거운 IO 또는 무거운 CPU 또는 무거운 GPU입니까? 사례마다 다른 방법이 있습니까?
Tim

4
80º는 매우 높습니다. 나는 스페인의 더운 곳에 살고 있으며 프로세서의 최대 온도는 ~ 60º입니다. 컴퓨터를 열고 모든 부품을 청소 한 후 냉각기를 교체하십시오. 나는 당신이 CPU 사용이 아니라고 생각합니다.
Rufo El Magufo

둘 다 시도하십시오.
stribika

실제로 80 °는 높지만 CPU 모델에 따라 극단적 인 것으로 간주되지는 않습니다. 대부분의 CPU 지원 문제없이 최대 90 ° C
Kiwy

답변:


16

CPULimit가 정확히 필요한 것입니다. 프로그램을 시작한 다음 프로그램 이름 또는 PID에 대해 cpulimit를 실행하여 원하는 백분율을 지정하십시오.

다음 명령은 PID 7777의 프로세스를 CPU 사용량으로 5 %로 제한합니다.

cpulimit -p 7777 -l 5

또는 실행 파일 이름을 사용할 수 있습니다.

cpulimit -e myprogram -l 5

또는 실행 파일의 절대 경로 :

cpulimit -P /path/to/myprogram -l 5

백분율은 모든 코어의 비율입니다. 따라서 코어가 4 개인 경우 400 %를 사용할 수 있습니다.


1
감사! (1) CPULimit은 이미 실행중인 프로세스에만 사용됩니까? 실행할 프로그램을 제출할 때 사용되지 않습니까? (2) 프로세스에 의한 CPU 사용률을 수정하거나 프로세스의 상한을 설정하고 다른 프로세스에 따라 사용량이 0과 그 사이에서 변동하도록 허용합니까? (3) 또한 프로세스에서 CPULimit을 사용한 후에는 Ctrl + C를 사용하여 실행을 취소 할 수있는 방법이 없다는 것을 알았습니다. 곧 자동 실행으로 돌아 오기 때문입니다. 왜 궁금해?
Tim

2
CPULimit에 대한 작은 경고 : SIGSTOP / SIGCONT를 사용하여 프로세스에 사용되는 CPU 시간을 제한합니다 (대상 CPU 사용량을 초과하는 프로세스가 중지됩니다. 충분한 시간이 경과하면 프로세스가 SIGCONT로 전송되어 실행을 재개합니다). 그러나 신호가 시스템 호출을 방해 할 수있는 드문 경우가 있습니다 . 자세한 내용 은 GNU C 라이브러리 설명서 를 참조하십시오. CPULimit은 이러한 신호를 1 초에 여러 번 전송하므로 중단 될 가능성이 높습니다. 데스크톱에서 pdftk를 실행하는 데 큰 문제는 아닙니다.
Riccardo Murri

8

실행중인 프로세스를 취소 하여 우선 순위 (소위 "nice value")에 우선 순위를 부여 할 수 있습니다 . UNIX 우선 순위 척도는 다소 반 직관적입니다. 음수 값은 프로세스가 동시 프로세스보다 선호됩니다. 즉 "더 많은"우선 순위를 갖습니다.

따라서 PID를 통해 프로세스를 "느리게"시도 할 수 있습니다.

# lower priority of a process
renice +1 "PID"

이것을 실행할 때마다 "nice value"프로세스는 1 씩 증가합니다. +1물론 정수 값을 사용할 수 있습니다 .

nice 명령을 사용하면 +10 nice 값 조정으로 프로세스를 시작할 수 있습니다 (옵션으로 변경 -n). 예를 들면 다음과 같습니다.

# start a CPU-intensive task with low priority
nice ./cpu-hog

그러나 "nice value"는 시스템의 다른 프로세스보다 특정 프로세스를 실행하는 스케줄러가 선호하는 정도에만 영향을 미칩니다. 컴퓨터가 기본적으로 유휴 상태 인 경우 하나의 단일 프로세스의 "nice value"를 높이면 해당 프로세스가 100 %를 차지 하지 않습니다. CPU. 나는 getpriority (2) 맨 페이지 에서 인용합니다 : (Emphasis added by me.)

상대적으로 좋은 가치가 프로세스 스케줄링에 영향을 미치는 정도는 Unix 시스템과 Linux에서 커널 버전에 따라 다릅니다. 커널 2.6.23부터 Linux는 좋은 값의 상대적인 차이가 훨씬 더 강한 효과를 갖는 알고리즘을 채택했습니다. 이로 인해 시스템에 다른 우선 순위로드 가있을 때마다 매우 낮은 값 (+19)이 프로세스에 CPU를 거의 제공하지 않습니다 ._

그 이유는 프로세스가 UNIX와 유사한 커널에서 실행되는 방식에 있습니다. 커널이 프로세스를 실행하기로 결정할 때마다 해당 프로세스는 특정 (고정 및 짧은) 시간 동안 CPU 코어를 완전히 제어합니다. "좋은 값"은 커널 스케줄러가 프로세스에 시간 슬롯을 제공하려는 빈도에 영향을 줄 수 있지만, 일단 스케줄되면 프로세스가 일정 시간 동안 방해받지 않고 실행된다는 사실을 변경할 수는 없습니다.

따라서 CPU 속도를 늦추지 않으면 시스템에 CPU 액세스를 위해 경쟁 할 수있는 다른 프로세스가없는 경우 프로세스를 느리게 실행할 수있는 방법이 없습니다.


감사! 다른 프로세스에 관계없이 프로세스를 처음부터 끝까지 느리게 실행할 수 있습니까?
Tim

@Tim 나는 당신이 요구하는 것이 가능하다고 생각하지 않습니다. 자세한 내용으로 답변을 업데이트했습니다. 그것이 더 명확 해지기를 바랍니다.
Riccardo Murri

1
다른 답변은 CPULimit을 제안했는데 불가능한 것으로 보입니다.
Tim

아, 나는 CPULimit에 대해 몰랐다-그것은 내 유닉스 도구 세트의 차이를 확실히 채 웁니다.
Riccardo Murri

nice프로세서를 시원하게 유지하지는 않습니다. 그런 식으로 작동하도록 설계되지 않았습니다.
Ken Sharp

4

cgroup 은이 이유로 정확하게 만들어졌습니다.

http://www.kernel.org/doc/Documentation/cgroups/ http://www.serverwatch.com/tutorials/article.php/3921001/Setting-Up-Linux-Cgroups.htm

그것들에 익숙해지는 데 약간의 시간이 걸리며, 그것들을 설정하려면 루트 액세스 권한이 필요하다고 생각하지만 모두 스크립트 할 수 있습니다. 최신 Ubuntus에는 .conf 파일이 있으므로 사용자가 직접 스크립트를 작성할 필요가 없습니다. 10.10에 대해 잘 모르겠습니다.

시작하기 좋은 곳은이 답변에 있습니다 : https://askubuntu.com/a/94743/170177

cgroup은 아직 개발 중이므로 현재 커널에서 일부 기능을 사용하지 못할 수 있습니다.

cgroups의 cpu.shares를 사용 하면 좋은 가치가하지 않을 것입니다. 실제로 프로세스를 조절하고 싶은 것처럼 들립니다.

원하는 매개 변수를 정의 하려면 스크립트를 한두 개 사용하거나 /etc/cgconfig.conf 를 편집 해야 합니다.

특히 cpu.cfs_period_uscpu.cfs_quota_us 값을 편집하려고합니다 . 그러면 프로세스는 cpu.cfs_period_us 마이크로 초당 cpu.cfs_quota_us 마이크로 초 동안 실행될 수 있습니다 .

예를 들면 다음과 같습니다.

만약 cpu.cfs_period_us = 50000cpu.cfs_quota_us이 = 10000 프로세스는 상관없이 진행되는 다른 어떤 CPU 시간의 최대 20 %를 받게됩니다.

이 스크린 샷에서 프로세스 2 %의 CPU 시간을 부여했습니다.

2 % CPU 시간

프로세스와 관련하여 100 %로 실행 중입니다.

반면 설정 cpu.shares 는 유휴 CPU 시간의 100 %를 계속 사용할 수 있습니다.

이 비슷한 예에서 프로세스 cpu.shares = 100 (의 1024)을 지정했습니다.

cpu. 주식

보시다시피 프로세스는 여전히 모든 유휴 CPU 시간을 소비하고 있습니다.

참고 문헌 :

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups .html


참고 : systemd상황이 약간 다릅니다. 예를 들어 우분투 트러스티는 cgroup을 관리하는 두 가지 서비스를 제공하는 것으로 보입니다. 더 알고 있으면 업데이트하겠습니다.
Ken Sharp

그러나 프로세스가 이미 시작되었을 때 최대 CPU %를 변경할 수 있습니다 renice.
Marco Sulla

renice사용 된 CPU의 양을 변경하지 않고 스케줄러의 프로세스 우선 순위 만 변경합니다. cgroup은 언제든지 CPU 제한을 변경할 수 있습니다. 이 답변이 게시 된 이후 cgroups에는 모든 종류의 조정이 추가되었으며 매우 강력합니다.
Ken Sharp

renice does not change the amount of CPU uses나는 그것을 알고있다;) 나는 방금 런타임에 물건을 바꾸는 프로그램의 예로서 게시했다. 답장을 보내 주셔서 감사합니다. cgroup을 사용해 보겠습니다.
Marco Sulla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.