프로세스가 CPU 사용량의 10 %를 초과하지 않도록 제한


32

사용자가 많은 Linux 시스템을 운영하지만 때때로 악용이 발생합니다. 여기서 사용자는 CPU / 메모리의 80 % 이상을 사용하는 단일 프로세스를 실행할 수 있습니다.

프로세스가 사용할 수있는 CPU 사용량을 제한하여 (예 : 10 %)이를 방지하는 방법이 있습니까? 알고 있습니다 cpulimit. 그러나 불행히도 제한하도록 지시 한 프로세스 (예 : 단일 프로세스)에 제한을 적용합니다. 그래서 제 질문은, 예를 들어 id / 경로를 제공 할 필요없이 미래에 실행될 모든 실행중인 프로세스와 프로세스에 제한을 어떻게 적용 할 수 있습니까?


성능 문제가 있습니까? 아니면 당신을 귀찮게하는 숫자입니까?
ctrl-alt-delor 12

@richard 성능 문제 때문에 많은 CPU를 사용하는 것으로 보이는 프로세스를 종료 / 제한 / 끝내려고했지만 bash 스크립트를 작성하여 이미 그렇게했습니다. 도움이된다면 가상 머신이기도합니다.
Giovanni Mounir

2
매우 짧은 시간 동안 100 %가 될 수있는 프로세스와 시스템 프로세스를 강제 종료합니다. cpulimit검색 스크립트와 함께 고려하십시오 . 정책을 세우고의 사용을 권장 cpulimit한 다음 10 % 이상을 검색 한 다음 5 %로 제한하십시오 (따라서 사용자의 사용을 권장합니다 cpulimit). 또한 단일 사용자에 대해 여러 프로세스를 10 % 이상 추가 할 수 있습니다.
ctrl-alt-delor 12

@richard이 유용한 의견들에 대해 Richard에게 감사드립니다! 그들은 나를 크게 도와주었습니다! 사용 제안 cpulimit은 나중에 사용자가 다시 시작할 수 있기 때문에 프로세스를 종료하는 것보다 낫습니다 (댓글 중 하나에서 지적한 바와 같이). 고맙습니다!
Giovanni Mounir

답변:


20

메모리를 남용 할 수는 있지만 CPU에는 해당되지 않습니다. CPU가 유휴 상태 일 때 실행중인 프로세스 ( "실행 중")는 프로세스가 I / O 또는 기타 작업을 기다리지 않음을 의미합니다. 기본적으로 100 % CPU 시간. 그리고 제한을 시행 할 이유가 없습니다.

덕분에 우선 순위를 설정할 수 있습니다 nice. 주어진 사용자에 대한 모든 프로세스에 적용하려면 로그인 쉘을 다음과 nice같이 실행해야합니다 . 하위 프로세스는 nice값 을 상속합니다 . 사용자가 로그인하는 방법에 따라 다릅니다. 예를 들어 ssh 로그인 우선 순위 지정 (nice) 을 참조하십시오 .

또는 가상 머신을 설정할 수 있습니다. 실제로 프로세스 당 제한을 설정하는 것은 사용자가 시스템을 남용하여 많은 프로세스를 시작할 수 있기 때문에 의미가 없습니다. 가상 머신을 사용하면 모든 한계가 가상 머신에 적용됩니다.

다른 해결책은 /etc/security/limits.conf한계 를 설정하는 것입니다 . limits.conf (5) 매뉴얼 페이지를 참조하십시오. 예를 들어, 로그인 당 최대 CPU 시간 및 / 또는 로그인 당 최대 프로세스 수를 설정할 수 있습니다. maxlogins각 사용자에 대해 1로 설정할 수도 있습니다 .


1
@GiovanniMounir 의미 : 사용자 당 하나의 가상 머신.
vinc17

1
그러나 사용자가 일반적인 개발 패키지를 사용해야 할 수도 있기 때문에 리소스를 많이 사용하고 실제로는 유용하지 않을 것입니다. 새 시스템마다 설치하지는 않을 것입니다. 나는 그런 식으로두고 bash 스크립트에 의해 자동으로 모니터링하는 것이 낫다고 생각합니다.
Giovanni Mounir

1
@GiovanniMounir 여러 가상 머신간에 파티션을 공유 할 수 있습니다.
vinc17

@GiovanniMounir LXC 또는 Docker 를 사용 하여 가상화 오버 헤드를 거의 0으로 줄일 수 있습니다 . 또한 "좋아요"는 강력한 이유가 아닙니다. 예를 들어, 공유 PHP 호스트를 관리하는 경우 LXC 또는 가상 머신을 수행하려면 라이센스가 허여 된 $ 15 / $ 5 라이센스 소프트웨어를 다시 작성해야하므로 솔루션과 함께 사용합니다.
Pooyan Khosravi 1

내 이해는 nice는 다른 프로세스에 비해 상대 CPU 만 설정한다는 것입니다. 다른 프로세스가 CPU를 사용하지 않는 경우 프로세스는 100 % CPU를 사용하며 10 %로 제한되지 않습니다.
johny 왜

25

좋은 / renice

nice 시스템에 '일회성'조정을위한 훌륭한 도구입니다.

 nice COMMAND

cpulimit

cpulimit CPU 집약적 작업을 실행해야하고 여유 CPU 시간이 필요한 경우 시스템의 응답성에 필수적입니다.

cpulimit -l 50 COMMAND

cgroups

cgroups 하나의 프로세스가 아닌 일련의 프로세스에 제한을 적용

cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3

자원

http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups


5
CPU 사용에 대한 하드 제한을 설정하려는 경우 다른 프로세스가 실행 중이 아닌 경우에도 cpu.cfs_quota_us매개 변수를 참조하십시오 ( 매뉴얼 참조 )
Diego

cgroups는 systemd 지시문 덕분에 사용하기가 더 쉬워졌습니다. 그 목적을 위해 시스템이나 사용자를 만드는 것이 최선의 선택입니다
Yves Martin

실행중인 프로세스 예 :sudo cgclassify -g cpu:cpulimited 2315444
Aquarius Power

1
내 이해는 nice는 다른 프로세스에 비해 상대 CPU 만 설정한다는 것입니다. 다른 프로세스가 CPU를 사용하지 않는 경우 프로세스는 100 % CPU를 사용하며 10 %로 제한되지 않습니다.
johny 왜

10

cgroup을 보았습니까? 상의 몇 가지 정보가 아치 위키 그들에 대한이. 에 대한 섹션을 읽고 cpu.shares필요한 작업을 수행하는 것처럼 보이고 사용자 수준에서 작동 할 수 있으므로 모든 사용자 프로세스를 한 번에 제한 할 수 있습니다.


그러나 CGroups는 갈 길입니다. 또한 (많은) 공유 컴퓨터 서버를 운영하고 있으며 cgroup을 사용하여 전체 로그인 세션 이 사용할 수 있는 최대 코어 수를 제한합니다 . 이렇게하면 사람이 새로운 프로세스를 계속 시작하면 각각 작은 프로세스를 얻게됩니다. 메모리 사용과 동일합니다. pam_cgroups 및 cgrulesengd 서비스를 사용하여 사용자가 cgroup에 자동으로 넣도록 할 수 있습니다. cgconfig 파일에서 '템플릿'을 사용하여 각 사용자를 자신의 cgroup에 넣을 수 있습니다. cgrulesengd는 프로세스를 종료하는 대신 각 프로세스가 올바른 cgroup에 있는지 확인하는 것을 제외하고 스크립트처럼 작동합니다.
jsbillings

cgroup을 사용하여 자원 사용 을 제한 하지 않더라도 각 자원에 대한 'stat'파일을보고 개인이 사용중인 자원의 양 을 평가 하는 데 5 분 스크립트에 해당 정보를 사용할 수 있습니다.
jsbillings

3

메모리의 경우 찾고 ulimit -v있습니다. ulimit자식 프로세스가 상속 한다는 점 에 유의하십시오 . 따라서 로그인시 사용자의 로그인 쉘에 적용하면 모든 프로세스에 적용됩니다.

사용자가 모두 bash로그인 쉘로 사용 하는 경우 다음 줄을 입력 /etc/profile하면 모든 사용자 프로세스의 하드 제한이 1 기가 바이트 (보다 정확하게는 백만 킬로바이트)가되어야합니다.

ulimit -vH 1000000

이 옵션 H은 하드 한계인지 확인합니다. 즉, 사용자는 나중에이를 다시 설정할 수 없습니다. 물론 사용자는 한 번에 충분히 많은 프로세스를 시작하여 메모리를 채울 수 있습니다.

다른 셸의 경우 대신 어떤 초기화 파일을 읽는지 (그리고 대신 ulimit사용 하는 다른 명령)를 찾아야합니다 .

CPU의 경우 원하는 것이 나에게 의미가없는 것 같습니다. 하나의 프로세스 만 실행될 때 CPU의 90 %가 사용되지 않도록하는 것은 무엇입니까? 나는 당신이 정말로 원하는 것이 nice(그리고 아마도 ionice) 라고 생각합니다 . 그와 같은주의 ulimit, nice값이 너무 로그인 시간 접미사의 로그인 쉘에 적용, 자식 프로세스에 의해 상속됩니다. 나는 그것이 또한 적용된다고 생각 ionice하지만 확실하지 않습니다.


메모리 제안에 감사드립니다! 로그인 할 때 이것을 사용자의 로그인 쉘에 적용하는 예를 보여줄 수 있습니까? 이 작업을 수행하는 방법을 잘 모르겠습니다. 또한 명확하지 않아서 유감입니다. 내가하려는 것은 프로세스가 CPU의 10 % 이상을 사용하도록 허용하지 않는 것입니다. 그렇게 할 수있을 것 같아요 nice? 그렇다면이를 달성하기위한 예를 보여줄 수 있다고 생각하십니까?
Giovanni Mounir

하나의 프로세스 만 실행 중일 때 여전히 CPU를 90 % 유휴 상태로 유지할 수 없습니다.
celtschk

1
가 동시에 실행 미만 10 개 프로세스가 현재 (실행하여 내 말하면 정말 뿐만 아니라 사용자 입력 또는 대기, 실행 디스크 I / O), 그것은 사실상되어 보장 그들 중 하나가 CPU의 10 % 이상이됩니다. 그렇지 않으면 CPU가 실제로 유휴 상태입니다. 그리고 만약 당신이 10 %가 넘는 프로세스를 죽이면, 당신 을 죽이려는 많은 사용자가있을 것 입니다. 아니면 적어도 그 숫자가 무엇을 의미하는지에 대한 단서가있는 사람으로 대체하려고 노력할 것입니다.
celtschk

@celtschk의 의견과 달리 11 개 이상의 프로세스가 실행 중이면 (cpu bound) 9.09 % 미만입니다. 따라서 10 % 이상의 CPU 사용량을 금지하는 시스템 사용자라면 11 개 이상의 프로세스를 실행하고 레이더 아래에 숨길 수 있습니다.
ctrl-alt-delor 12

@richard 당신이 옳습니다. 아마도 스크립트가 사용자가 사용한 총 메모리 / CPU 양을 합한 다음 백분율이 특정 양에 도달하면이 사용자의 모든 프로세스를 종료하는 것이 좋습니다. 아웃)
조반니 무 니르

3

당신이 cpulimit이 귀하의 경우 실용적이지 않을 것이라고 주장하고 있기 때문에, 나는 당신이 보는 것이 좋습니다 좋은 , renice 명령어taskset taskset은 프로세스의 CPU 선호도를 설정할 수 있지만 그것 때문에, 가까운 당신이 달성하고 싶은에 올 수 있습니다, 귀하의 경우 즉시 도움이되지 않을 수 있습니다.


1
nice그리고 renice? 멋지다! 나는 그들의 매뉴얼 페이지를 보았지만 여전히 프로세스 ID를 설정해야하기 때문에 그들이 이것을 도울 수 있다고 생각하지 않습니다. 그러나이 패키지를 사용하여 멋진 실행중인 모든 프로세스 / 미래 프로세스에 제한을 적용하는 예제를 제공 할 수 있다면!
Giovanni Mounir

1

태그에는가 centos있으므로 사용할 수 있습니다 systemd.

예를 들어 ID가 1234다음 과 같은 사용자를 제한하려는 경우 :

sudo systemctl edit --force user-1234.slice

그런 다음 이것을 입력하고 저장하십시오.

[Slice] CPUQuota=10%

다음에 사용자가 로그인하면 영향을 미칩니다.

남자 페이지 : systemctl, systemd.slice, systemd.resource-control...


0

이미 시작된 프로세스를 제한하려면 PID별로 하나씩 수행해야하지만 다음과 같이 배치 스크립트를 수행 할 수 있습니다.

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

내 경우 pypdfocr에는 탐욕을 시작합니다 tesseract.

또한 어떤 경우에는 CPU가 꽤 좋았으므로 다음 renice과 같이 사용할 수 있습니다 .

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.