업데이트 : 아래 답변은 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 cgconfig쇼 cgconfig시스템 부팅시 실행되도록 설정되어 있습니다.
변경하면 변경 사항을로드 /etc/cgconfig.conf하기 위해 실행해야합니다 service cgconfig restart. (그리고 cgclear테스트 를 중단 할 때 서비스 중지 또는 실행 문제 는 매우 일반적입니다. 디버깅의 lsof /cgroup/cpuset경우 예를 들어 cpuset사용중인 cgroup 계층의 이름 인 경우 를 권장 합니다.)
당신이 사용하려는 경우 /etc/cgrules.conf, 당신은 (이하 "cgroup에 규칙 엔진 데몬"을 확인해야 cgrulesengd실행) : service cgred start와 chkconfig cgred on. (그리고 페이지 하단의 2.8.1 섹션 에있는 Red Hat 리소스 관리 가이드 에 설명 된 대로이 서비스와 관련하여 가능하지만 경쟁이되지 않는 경쟁 조건을 알고 있어야 합니다.)
수동으로 바보를 만들고 가상 파일 시스템을 사용하여 cgroup을 설정하려면 (처음 사용하는 것이 좋습니다) 다양한 옵션과 함께 cgconfig.conf사용하여 설정을 미러링 하는 파일을 만들 수 cgsnapshot있습니다.
마지막으로 다음을 작성할 때 누락 된 주요 정보가 있습니다.
그러나 이것에 대한주의 사항은 myprocessname의 자식이 제한된 cpu0only cgroup에 다시 할당되는 것 같습니다.
나는 맞았지만 알지 못하는 옵션이 있습니다.
cgexec 프로세스를 시작 / 명령을 실행하고 cgroup에 할당하는 명령입니다.
cgclassify 이미 실행중인 프로세스를 cgroup에 할당하는 명령입니다.
이 두 가지 모두 cgred( cgrulesengd)가 지정된 프로세스를 기반으로 다른 cgroup에 재 할당 하지 못하게 합니다 /etc/cgrules.conf.
모두 cgexec와 cgclassify지원 --sticky플래그를 추가로 방지 cgred재 할당에서 자식 프로세스에 기반을 /etc/cgrules.conf.
따라서 내가 작성한 질문에 대한 답변은 위에서 언급 한 Red Hat 기술 설계자의 조언으로 인해 구현이 끝나지 않았지만 다음과 같습니다.
내 질문에 설명 된대로 cpu0onlyand anycpucgroup을 만드십시오 . (확인 cgconfig부팅시 실행되도록 설정되어 있습니다.)
* cpuset cpu0only내 질문에 설명 된대로 규칙을 만드십시오 . (그리고 확인 cgred부팅시 실행되도록 설정되어 있습니다.)
무제한 으로 원하는 프로세스를 시작하십시오 cgexec -g cpuset:anycpu --sticky myprocessname.
이러한 프로세스는 제한이 없으며 모든 하위 프로세스도 제한되지 않습니다. 시스템의 다른 모든 것은 CPU 0으로 제한됩니다 (재부팅 cgred한 후에는 EUID를 변경하지 않는 한 이미 실행중인 프로세스에 크 러플을 적용하지 않기 때문에 ). 이것은 완전히 권장되는 것은 아니지만 처음에 요청한 것이며 cgroup으로 수행 할 수 있습니다.