3.4. cpuset
cpuset
서브시스템은 개별 CPU와 메모리 노드를 cgroup에 할당합니다. 각각의 cpuset은 cgroup 가상 파일 시스템 내의 별도의 가상 파일 (pseudofile)에 각각 다음 매개변수를 통해 지정될 수 있습니다.
중요
일부 서브시스템은 이러한 서브시스템을 사용하는 cgroup으로 작업을 이동하기 전 설정해야 하는 필수 매개 변수를 갖습니다. 예를 들어,
cpuset
서브시스템을 사용하는 cgroup에 작업을 이동하기 전 cpuset.cpus
및 cpuset.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간의 부하를 직접 균등화 4
NUMA(비균등 메모리 액세스,non-uniform memory access) 아키텍쳐상에서 여러 CPU간에 직접적으로 부하 균등화 5
NUMA 아키텍쳐상에서 모든 CPU간의 부하를 직접적으로 균등화