3.4. cpuset

cpuset 서브시스템은 개별 CPU와 메모리 노드를 cgroup에 할당합니다. 각각의 cpuset은 cgroup 가상 파일 시스템 내의 별도의 가상 파일 (pseudofile)에 각각 다음 매개변수를 통해 지정될 수 있습니다.

중요

일부 서브시스템은 이러한 서브시스템을 사용하는 cgroup으로 작업을 이동하기 전 설정해야 하는 필수 매개 변수를 갖습니다. 예를 들어, cpuset 서브시스템을 사용하는 cgroup에 작업을 이동하기 전 cpuset.cpuscpuset.mems 매개 변수를 반드시 정의해야 합니다.
cpuset.cpus (필수)
cgroup에 속한 작업에대해 액세스가 허용된 CPU를 지정합니다. 이것은 ASCII 형태로 된 콤마로 구분된 목록입니다. 범위를 표현할 때는 대시("-")를 사용합니다. 예:
0-2,16
위와 같은 것은 CPU 0,1,2와 16을 표현합니다.
cpuset.mems (필수)
cgroup에 있는 작업에 대해 액세스가 허용된 메모리 노드를 지정합니다. 이는 ASCII 형식으로된 콤마로 분리된 목록입니다. 범위를 표현할 때는 대시 ("-")를 사용합니다. 예:
0-2,16
위와 같은 것은 메모리 노드 0,1,2와 16을 표현합니다.
cpuset.memory_migrate
cpuset.mems의 값이 변경되면 메모리의 페이지가 새로운 노드로 이동해야 하는지를 지정하는 플래그(0또는 1)를 포함합니다. 디폴트로 메모리 이동은 금지(0)되어 있으며, 페이지는 최초 할당된 메모리 노드에 남아있게 됩니다. 심지어 cpuset.mems에 새롭게 지정된 노드가 최초 할당된 노드와 달라지는 경우에도 그렇습니다. 만약 활성화(1)되면 시스템은 페이지를 cpuset.mems에 지정된 새로운 매개변수에 맞춰, 가능하면 상대적인 위치도 유지하면서, 이동시킬 것입니다. 예를 들어 cpuset.mems에 의해 최초 두번째 노드에 있도록 지정된 페이지들은 cpuset.mems에 의해 새로 지정된 두번째 노드가 사용 가능하다면 그 노드에 할당될 것입니다.
cpuset.cpu_exclusive
부모, 자식, cpuset 이외에 다른 cpuset이 이 cpuset에 의해 지정된 CPU를 공유해야 할지 여부를 지정하는 플래그 (0또는 1)를 포함합니다. 디폴트(0)로 CPU는 한 cpuset에만 배타적으로 할당되지 않습니다.
cpuset.mem_exclusive
다른 cpuset들이 이 cpuset에 의해 지정된 메모리 노드들을 공유할 수 있는지를 지정하는 플래그(0또는 1)를 포함합니다. 디폴트(0)로 메모리 노드들은 한 cpuset에만 배타적으로 할당되지 않습니다. 특정 cpuset에서만 메모리 노드를 사용하도록 독점권을 부여하는 것은(1) cpuset.mem_hardwall로 메모리 격벽(memory hardwall)을 설정하는 것과 기능적으로 동일한 것입니다.
cpuset.mem_hardwall
커널의 메모리 페이지와 버퍼 데이터 할당이 이 cpuset에 지정된 메모리 노드들로만 제한되야 하는지 여부를 지정하는 플래그(0또는 1)를 포함합니다. 디폴트(0)로, 페이지와 버퍼 데이터는 여러 사용자에 속하는 프로세스들 사이에서 공유됩니다. 격벽을 설정(1)시, 각각의 태스크의 메모리 할당은 별도로 유지됩니다.
cpuset.memory_pressure
이 cpuset에 속한 프로세스들에 의한 메모리 압력(memory pressure)의 현재 평균값을 포함하는 읽기 전용 파일입니다. 이 가상파일(pseudofile)의 값은 cpuset.memory_pressure_enabled가 지정된 경우 자동으로 업데이트됩니다. 그렇지 않은 경우 0 값을 포함합니다.
cpuset.memory_pressure_enabled
이 cgroup에 있는 프로세스에 의해 생성된 메모리 압력(memory pressure)을 시스템이 계산해야 할 지를 결정하는 플래그(0,1)를 포함합니다. 계산된 값은 cpuset.memory_pressure에 지정된 파일에 기록되며, 그 값은 초당 메모리 재할당 요청 횟수를 1000으로 곱한 정수값으로 표현되는, 프로세스가 사용중인 메모리를 해제하려는 경향을 표시합니다.
cpuset.memory_spread_page
파일시스템 버퍼가 이 cpuset에 할당된 메모리 노드 사이에 균등하게 배분되어야 할지를 지정하는 플래그(0,1)를 포함합니다. 디폴트(0)로 균등화를 위한 노력을 시도하지 않으며, 버퍼는 그 버퍼를 생성한 프로세스가 실행중인 것과 같은 노드에 할당됩니다.
cpuset.memory_spread_slab
파일 입출력을 위한 커널 슬랩(slab) 캐시가 cpuset 전체에 걸쳐 균일하게 배분되어야 할지를 지정하는 플래그(0,1)를 포함합니다. 디폴트(0)로, 커널 슬랩 캐시를 균일하게 하려는 노력을 하지 않습니다. 슬랩 캐시는 그것을 생성한 프로세스가 실행중인 메모리 노드와 동일한 것에 위치하게 됩니다.
cpuset.sched_load_balance
커널이 cpuset내의 CPU 사이에 부하를 균일하게 배분할지를 지정하는 플래그(0,1)를 포함합니다. 디폴트(1)로, 커널은 과부화인 CPU에서 부하가 더 적은 CPU로 프로세스를 옮겨서 부하를 균일화합니다.
하지만 부모 cgroup에서 로드 밸런싱이 활성화되어 있는 경우 로드 밸런싱은 높은 수준에서 이미 실행되고 있으므로 cgroup에서 이 플래그를 설정하는 것은 영향을 미치지 않습니다. 따라서 cgroup에서 로드 밸런싱을 비활성화하려면 계층의 각 부모 cgroup에 있는 로드 밸런싱을 비활성화해야 합니다. 이 경우 cgroup의 형제 관계에 있는 그룹에 대해서도 로드 밸런싱을 활성화해야 할 지에 대한 여부도 고려해야 합니다.
cpuset.sched_relax_domain_level
-1과 어떤 작은 양수값 사이의 정수를 포함하며, 이 숫자는 커널이 부하를 균등화하기 위해 사용해야 하는 CPU의 갯수를 표현합니다. 만약 cpuset.sched_load_balance가 비활성화 되어 있다면 이 값은 의미가 없습니다.
지정된 값의 효과는 시스템 아키텍쳐에 따라 달라지지만, 다음과 같은 값을 일반적으로 사용합니다:
cpuset.sched_relax_domain_level의 값
효과
-1부하 균등화에 시스템 디폴트값을 사용함
0직접적인 부하 균일화를 수행하지 않음; 주기적으로만 부하를 균등화함
1동일한 코어상의 쓰레드간 부하를 직접 균등화
2동일한 패키지 내의 코어간 부하를 직접 균등화
3동일한 노드/블레이드 상의 CPU간의 부하를 직접 균등화
4NUMA(비균등 메모리 액세스,non-uniform memory access) 아키텍쳐상에서 여러 CPU간에 직접적으로 부하 균등화
5NUMA 아키텍쳐상에서 모든 CPU간의 부하를 직접적으로 균등화