cgroup을 사용하여 화이트리스트를 제외한 모든 프로세스를 단일 CPU로 제한하는 방법은 무엇입니까?


26

Red Hat의 cgroup에 대한 안내서가 도움이 될 것입니다 (그러나이 질문에 대답하지는 않습니다).

프로세스를 시작하는 명령 중에 특정 프로세스를 특정 CPU로 제한하는 방법을 알고 있습니다.

먼저 다음을 *에 넣습니다 /etc/cgconfig.conf.

mount {
  cpuset =  /cgroup/cpuset;
  cpu =     /cgroup/cpu;
  cpuacct = /cgroup/cpuacct;
  memory =  /cgroup/memory;
  devices = /cgroup/devices;
  freezer = /cgroup/freezer;
  net_cls = /cgroup/net_cls;
  blkio =   /cgroup/blkio;
}

group cpu0only {
  cpuset {
    cpuset.cpus = 0;
    cpuset.mems = 0;
  }
}

그런 다음 프로세스를 시작하고 다음을 사용하여 해당 cgroup에 구체적으로 지정하십시오.

cgexec -g cpuset:cpu0only myprocessname

다음을 입력하여 특정 프로세스 이름의 모든 인스턴스를 자동으로 제한 할 수 있습니다 ( 정확 하다고 생각 합니다) /etc/cgrules.conf.

# user:process  controller  destination
*:myprocessname cpuset      cpu0only

내 질문은 : 어떻게 반대로 할 수 있습니까?

다시 말해, 특정 화이트리스트 프로세스 와 그 하위제외한 모든 프로세스 를 제한된 cgroup에 어떻게 할당 할 수 있습니까?


내가 공부하지만, 테스트를하지 않은 것을 바탕으로, 나는 생각 • 그래도 부분적인 해결책이 될 것이다 :

"제한되지 않은"cgroup을 추가하십시오.

group anycpu {
  cpuset {
    cpuset.cpus = 0-31;
    cpuset.mems = 0;  # Not sure about this param but it seems to be required
  }
}

프로세스를 무제한 그룹에 명시 적으로 지정하고 그 밖의 모든 것을 제한된 그룹에 지정하십시오.

# user:process  controller  destination
*:myprocessname cpuset      anycpu
*               cpuset      cpu0only

그러나 이것에 대한주의는 (시험을하지 않고 문서를 읽거나 소금을 뿌린 것에서) 아이들 myprocessname이 제한된 cpu0onlycgroup에 다시 할당되는 것 같습니다 .

가능한 대안은 사용자를 작성하여 실행 myprocessname하고 해당 사용자의 모든 프로세스를 제한하지 않고 다른 모든 것을 제한하는 것입니다. 그러나 실제 사용 사례에서 프로세스는 루트로 실행해야하며 루트로 실행 해야하는 다른 프로세스 있으며 제한 해야 합니다.

cgroup으로 어떻게 이것을 할 수 있습니까?


cgroup에서 이것이 가능하지 않은 경우 (지금은 의심되는 경우) 부분 솔루션에 대한 아이디어가 정확하고 생각대로 작동합니까?

* 면책 조항 : 이것은 아마도 최소한의 코드 예제가 아닙니다. 모든 부분을 이해하지 못 하므로 필요하지 않은 부분을 모릅니다.

답변:


30

업데이트 : 아래 답변은 RHEL 6에 적용됩니다. RHEL 7에서 대부분의 cgroup은 systemd로 관리되며 libcgroup은 더 이상 사용되지 않습니다.


이 질문을 게시하기 때문에 나는이의 대부분뿐만 아니라, 위의 링크하는 전체 가이드를 공부 한 cgroups.txt의 문서와 cpusets.txt . 나는 이제 cgroup에 대해 배울 것으로 예상했던 것보다 더 많은 것을 알고 있으므로 여기에서 내 자신의 질문에 대답 할 것입니다.

여러 가지 접근 방식이 있습니다. Red Hat (기술 아키텍트)과의 연락은 우리가 구체적으로 제한하고 싶었던 프로세스 만 제한하는보다 선언적인 접근 방식에 우선하여 모든 프로세스의 포괄적 인 제한을 권장하지 않습니다. 주제에 대한 그의 진술에 따르면, 그 이유는 시스템 호출이 사용자 공간 코드 (LVM 프로세스와 같은)에 의존하여 제한 될 경우 의도 한 효과의 반대 인 시스템 속도를 늦출 수 있기 때문입니다. 그래서 나는 구체적으로 명명 된 여러 프로세스를 제한하고 나머지는 모두 내버려 두었습니다.

또한 질문을 게시 할 때 누락 된 cgroup 기본 데이터 에 대해 언급하고 싶습니다 .


Cgroup은 설치에 의존 하지 않습니다libcgroup . 그러나 이는 cgroup 구성 및 cgroup에 대한 프로세스 할당을 자동으로 처리하기위한 도구 모음이며 매우 유용 할 수 있습니다.

libcgroup 패키지는 cgroup의 실제 커널 수준의 cgroup 구현과 약간 다른 cgroup 사용 에 대한 자체 추상화 및 가정 세트에 기반을두고 있기 때문에 libcgroup 도구가 잘못 될 수 있음을 발견했습니다 . (예제를 넣을 수는 있지만 약간의 작업이 필요합니다. 관심이 있다면 의견을 말하십시오.)

따라서, libcgroup 도구를 사용하기 전에 (예 : /etc/cgconfig.conf, /etc/cgrules.conf, cgexec, cgcreate, cgclassify, 등) 나는 매우 에 매우 익숙해 추천 /cgroup가상 파일 시스템 자체를 수동으로 저변에서 libcgroup cgroup에 부착 된 여러 개의 서브 시스템과 계층 구조를 포함하여 cgroup의 계층 구조 (및 leakily 초록을 만드는 )을 실행하여 프로세스를 다른 cgroup에 다시 할당 하고 후드 아래에서 수행되는 echo $the_pid > /cgroup/some_cgroup_hierarchy/a_cgroup_within_that_hierarchy/tasks겉보기에는 마술 같은 작업을 libcgroup수행합니다.


내가 실종 된 또 다른 기본 개념이었다 그 경우 /cgroup가상 파일 시스템은 전혀 시스템에 마운트 (또는 더 정확하게, 일명 "컨트롤러"모두에 설치되어있는 cgroup의 서브 시스템의 경우), 다음 모든 전체 시스템의 과정 cgroup. "일부 프로세스는 cgroup에 있고 일부는 그렇지 않습니다"와 같은 것은 없습니다.

주어진 계층 구조에 대해 루트 cgroup 이라고하는 것이 있는데 , 연결된 서브 시스템에 대한 모든 시스템 자원을 소유 합니다 . 예를 들어 cpuset 및 blkio 하위 시스템이 연결된 cgroup 계층에는 시스템의 모든 cpus와 시스템의 모든 blkio를 소유 하고 하위 cgroup 과 해당 리소스를 공유 할 수 있는 루트 cgroup이 있습니다 . 루트 cgroup은 모든 시스템 리소스를 소유 하므로 제한 할 수 없으므로 제한해도 의미가 없습니다.


libcgroup에 대해 누락 된 다른 간단한 데이터 :

당신이 사용하는 경우 /etc/cgconfig.conf, 당신은 확인해야합니다 chkconfig --list cgconfigcgconfig시스템 부팅시 실행되도록 설정되어 있습니다.

변경하면 변경 사항을로드 /etc/cgconfig.conf하기 위해 실행해야합니다 service cgconfig restart. (그리고 cgclear테스트 를 중단 할 때 서비스 중지 또는 실행 문제 는 매우 일반적입니다. 디버깅의 lsof /cgroup/cpuset경우 예를 들어 cpuset사용중인 cgroup 계층의 이름 인 경우 를 권장 합니다.)

당신이 사용하려는 경우 /etc/cgrules.conf, 당신은 (이하 "cgroup에 규칙 엔진 데몬"을 확인해야 cgrulesengd실행) : service cgred startchkconfig cgred on. (그리고 페이지 하단의 2.8.1 섹션 에있는 Red Hat 리소스 관리 가이드 에 설명 된 대로이 서비스와 관련하여 가능하지만 경쟁이되지 않는 경쟁 조건을 알고 있어야 합니다.)

수동으로 바보를 만들고 가상 파일 시스템을 사용하여 cgroup을 설정하려면 (처음 사용하는 것이 좋습니다) 다양한 옵션과 함께 cgconfig.conf사용하여 설정을 미러링 하는 파일을 만들 수 cgsnapshot있습니다.


마지막으로 다음을 작성할 때 누락 된 주요 정보가 있습니다.

그러나 이것에 대한주의 사항은 myprocessname의 자식이 제한된 cpu0only cgroup에 다시 할당되는 것 같습니다.

나는 맞았지만 알지 못하는 옵션이 있습니다.

cgexec 프로세스를 시작 / 명령을 실행하고 cgroup에 할당하는 명령입니다.

cgclassify 이미 실행중인 프로세스를 cgroup에 할당하는 명령입니다.

이 두 가지 모두 cgred( cgrulesengd)가 지정된 프로세스를 기반으로 다른 cgroup에 재 할당 하지 못하게 합니다 /etc/cgrules.conf.

모두 cgexeccgclassify지원 --sticky플래그를 추가로 방지 cgred재 할당에서 자식 프로세스에 기반을 /etc/cgrules.conf.


따라서 내가 작성한 질문에 대한 답변은 위에서 언급 한 Red Hat 기술 설계자의 조언으로 인해 구현이 끝나지 않았지만 다음과 같습니다.

내 질문에 설명 된대로 cpu0onlyand anycpucgroup을 만드십시오 . (확인 cgconfig부팅시 실행되도록 설정되어 있습니다.)

* cpuset cpu0only내 질문에 설명 된대로 규칙을 만드십시오 . (그리고 확인 cgred부팅시 실행되도록 설정되어 있습니다.)

무제한 으로 원하는 프로세스를 시작하십시오 cgexec -g cpuset:anycpu --sticky myprocessname.

이러한 프로세스는 제한이 없으며 모든 하위 프로세스도 제한되지 않습니다. 시스템의 다른 모든 것은 CPU 0으로 제한됩니다 (재부팅 cgred한 후에는 EUID를 변경하지 않는 한 이미 실행중인 프로세스에 크 러플을 적용하지 않기 때문에 ). 이것은 완전히 권장되는 것은 아니지만 처음에 요청한 것이며 cgroup으로 수행 할 있습니다.


와우. 시원한. 이것은 어떻게 투표를 했습니까?
mikeserv

@ mikeserv 감사합니다. :) 귀하의 질문에 대한 답변 : 날짜를 확인하십시오; 방금 어제이 답변을 썼습니다.
와일드 카드

1
나는 것을보고. 24 시간 전 이었어요 아마 그 원인은 길다. 좋은 물건은 때때로 그렇게 간과 될 수 있습니다. 어쨌든 많은 표를 얻은 답변 이 곧 좋은 답변 은 아닙니다. 많은 사람들이 이미 알고 있다면 정보는 그렇게 유용 할 수 없습니다. 그러나 이것은 좋은 것 중 하나입니다. cgroup은 신비 롭습니다.
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.