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

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

하나 있다Red Hat cgroup 가이드이것은 약간 도움이 될 수 있지만 질문에 대답하지는 않습니다.

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

먼저 다음 *in을 입력하세요 /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이 이 작업을 수행할 수 없는 경우(나는 지금 그렇게 의심한다),솔루션의 일부에 대한 내 생각이 맞습니까? 내가 상상한 대로 작동할까요?

*면책조항: 이것은 최소한의 코드 예제가 아닐 수도 있습니다.모두그래서 어떤 부분이 불필요한지 모르겠습니다.

답변1

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


이 질문을 게시한 이후 위에 링크된 전체 가이드를 연구했으며 대부분cgroups.txt문서화 및cpusets.txt. 이제 나는 예상했던 것보다 cgroup에 대해 더 많이 알고 있으므로 여기서 내 질문에 대답하겠습니다.

취할 수 있는 접근 방식에는 여러 가지가 있습니다. Red Hat의 기업 담당자(기술 설계자)는 모든 프로세스에 대한 포괄적인 제한이 아니라, 특별히 제한하고 싶은 프로세스만 제한하는 보다 선언적인 접근 방식을 제안했습니다. 주제에 대한 그의 진술에 따르면, 그 이유는 시스템 호출이 사용자 공간 코드(예: LVM 프로세스)에 의존할 수 있기 때문입니다. 이 코드가 제한되면 시스템 속도가 느려질 수 있으며 이는 의도한 효과와 반대입니다. 그래서 결국 특정 이름으로 몇 가지 프로세스를 제한하고 나머지는 모두 그대로 두었습니다.

그 외에도 몇 가지 언급하고 싶습니다.cgroup 기본 데이터질문을 게시할 때 누락된 내용이 있었습니다.


Cgroup은아니요libcgroup설치 여부 에 따라 다릅니다 . 그러나 이는 cgroup 구성 및 cgroup 프로세스 할당을 자동화하기 위한 도구 세트이며 매우 유용할 수 있습니다.

libcgroup 패키지가 그 위에 구축되어 있기 때문에 libcgroup 도구도 오해의 소지가 있을 수 있다는 것을 알았습니다.내 자신의cgroup의 실제 커널 수준 구현과 약간 다른 cgroup 사용에 대한 일련의 추상화 및 가정입니다. (몇 가지 예를 들 수 있지만 약간의 작업이 필요합니다. 관심이 있으시면 댓글을 남겨주세요.)

따라서 libcgroup 도구(예: /etc/cgconfig.conf,,,,, 등) 를 사용하기 전에/etc/cgrules.confcgexeccgcreatecgclassify높은가상 파일 시스템 자체 에 대해 잘 알고 /cgroup수동으로 cgroup, cgroup 계층 구조(여러 하위 시스템이 연결된 계층 구조 포함, libcgroup은 이러한 계층 구조를 은밀하고 누출되게 추상화함)를 생성하고, 를 실행하여 다른 cgroup에 프로세스를 재할당하는 것이 좋습니다 echo $the_pid > /cgroup/some_cgroup_hierarchy/a_cgroup_within_that_hierarchy/tasks. 후드 아래에서 수행되는 마법 작업 libcgroup.


제가 놓치고 있는 또 다른 기본 개념은 /cgroup가상 파일 시스템이 시스템에 완전히 마운트된 경우(더 정확하게는 "컨트롤러"라고 불리는 cgroup 하위 시스템이 완전히 마운트된 경우)입니다.모든전체 시스템 프로세스에 있습니다c그룹. "일부 프로세스는 cgroup에 있고 일부는 그렇지 않습니다"와 같은 것은 없습니다.

이라는 것이 있습니다.뿌리cgroup 특정 계층 구조에 대해 다음을 갖습니다.모두추가 하위 시스템을 위한 시스템 리소스입니다. 예를 들어, cpuset 및 blkio 하위 시스템이 연결된 cgroup 계층 구조에는 다음을 소유하는 루트 cgroup이 있습니다.모두시스템의 CPU와 시스템의 모든 blkio 및 이러한 리소스 중 일부는 다음과 공유될 수 있습니다.어린이cgroups. 루트 cgroup은 제한할 수 없습니다.모두시스템 리소스를 제한하는 것은 의미가 없습니다.


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

를 사용하는 경우 시스템 부팅 시 디스플레이가 실행되도록 /etc/cgconfig.conf설정해야 합니다 .chkconfig --list cgconfigcgconfig

변경된 경우 변경 사항을 로드하려면 /etc/cgconfig.conf실행해야 합니다 . service cgconfig restart(서비스 중지 또는 실행 관련 문제는 테스트할 때 매우 일반적입니다 cgclear. 디버깅을 위해 예를 들어 lsof /cgroup/cpusetif cpuset는 사용 중인 cgroup 계층 구조의 이름을 사용하는 것이 좋습니다.)

를 사용하려면 "cgroup 규칙 엔진 데몬"( )이 실행 중인지 /etc/cgrules.conf확인해야 합니다 . (그리고 이 서비스와 관련하여 가능성은 있지만 가능성은 희박한 경쟁 조건을 알고 있어야 합니다.cgrulesengdservice cgred startchkconfig cgred onRed Hat 리소스 관리 가이드페이지 하단의 섹션 2.8.1에서. )

가상 파일 시스템(처음 사용하는 경우 권장함)을 사용하여 cgroup을 수동으로 설정하고 싶다면 그렇게 한 다음 다양한 옵션을 사용하여 cgconfig.conf설정을 반영하는 파일을 생성할 수 있습니다.cgsnapshot


마지막으로 다음을 작성할 때 주요 정보를 생략했습니다.

그러나 이에 대한 주의 사항은... myprocessname의 하위 프로세스가 제한된 cpu0only cgroup에 재할당된다는 것입니다.

내 말이 맞았지만, 내가 몰랐던 대안이 있었다.

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

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

이 두 가지 모두 지정된 프로세스가 를 기반으로 하는 다른 cgroup에 재할당되는 것을 cgred방지 합니다 .cgrulesengd/etc/cgrules.conf

cgexeccgclassify--sticky플래그는 및또한cgred재할당 방지어린이프로세스는 를 기반으로 합니다 /etc/cgrules.conf.


그래서,내가 쓴 질문에 대한 답변(위에서 언급한 Red Hat Technical Architect의 조언에 따라 최종적으로 구현한 설정은 아니지만) 다음과 같습니다.

내 질문에 설명된 대로 Make와 cgroup을 만드세요 cpu0only. ( 시작시 실행되도록 설정되어 있는지 anycpu확인하세요 .)cgconfig

* cpuset cpu0only내 질문에 설명된 대로 규칙을 만드세요. (그리고 cgred시작 시 실행되도록 설정되어 있는지 확인하세요 .)

내가 원하는 프로세스를 시작하세요무제한그리고: cgexec -g cpuset:anycpu --sticky myprocessname.

이러한 프로세스는 제한이 없으며 모든 하위 프로세스도 마찬가지입니다. 시스템의 다른 모든 것CPU 0으로 제한됩니다( cgredEUID를 변경하지 않는 한 cgrule은 이미 실행 중인 프로세스에 적용되지 않으므로 재부팅하면 됩니다). 이것은 완전히 바람직하지는 않지만 이것이 나의 첫 번째 요청이었고할 수 있는cgroup을 통해 수행됩니다.

관련 정보