4. cpu, cpuset, cpuaccet

Subsystem - cpu, cpuset

이번 글에서는 Cgroup의 서브시스템 중 cpu와 cpuset 에 대해 정리해보겠습니다.

cpu subsystem

cpu 서브시스템은 cgroup 계층 및 해당 작업에 대한 CPU 시간을 스케쥴링 할 수 있습니다. 시스템이 busy 상태일 때 CPU 공유를 최소화 즉 사용량을 제한 할 수 있습니다. 이 서브시스템은 CPU에 cgroup 작업 액세스를 제공하기 위한 스케줄러(Documentation/scheduler/sched-design-CFS.txt)를 제공합니다.

cpuset subsystem

cpuset 서브시스템은 개별 CPU 및 메모리 노드를 cgroup에 바인딩 하기 위한 서브시스템입니다. 리눅스의 testset 명령과 유사하게 CPU 코어를 할당 할 수 있는 서브시스템 입니다.

cpu, cpuset

이 두 서브시스템을 이용하면 CPU 사용량이 많은 어플리케이션에 대해 프로세서 코어들을 할당 및 제어할 수 있으므로 더욱 좋은 활용성을 가질 수 있습니다.

CPU 할당 image 참고 : 문C블로그 (http://jake.dothome.co.kr/control-groups/)

CPU 코어 별로 원하는 Task 들을 할당할 수 있어 코어 간 스위칭 되는 로드를 감소할 수 있으며 입맛에 맞게 그룹을 조정할 수 있습니다. 즉 컨테이너 환경에서도 각 컨테이너 별로 다양한 인스터스를 생성할 수 있습니다.

CPU 예제 살펴보기

몇몇의 프로세스에 대해 설정하는 방법에 대해 알아보겠습니다. 여기서는 cpu와 cpuacct 함께 설정합니다.

  1. cgroup 가상파일시스템을 마운트합니다.
$ sudo mkdir -p /cgroup/cpu
$ sudo mount -t cgroup -o cpu,cpuacct cpu,cpuacct /cgroup/cpu
  1. 마운트 여부 확인하기. 아래 명령어를 수행해서 결과가 표시된다면 정상적으로 마운트되었습니다.
$ mount | grep cgroup
cpu,cpuacct on /cgroup/cpu type cgroup (rw,relatime,cpu,cpuacct)
or
$ cat /proc/mount | grep cgroup
cpu,cpuacct /cgroup/cpu cgroup rw,relatime,cpu,cpuacct 0 0
  1. mount 상태 확인해보기.
$ ls -al
total 4
dr-xr-xr-x 2 root root    0  8월 11 20:22 .
drwxr-xr-x 6 root root 4096  8월 11 20:21 ..
-rw-r--r-- 1 root root    0  8월 11 20:22 cgroup.clone_children
-rw-r--r-- 1 root root    0  8월 11 20:22 cgroup.procs
-r--r--r-- 1 root root    0  8월 11 20:22 cgroup.sane_behavior
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.cpu_exclusive
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.cpus
-r--r--r-- 1 root root    0  8월 11 20:22 cpuset.effective_cpus
-r--r--r-- 1 root root    0  8월 11 20:22 cpuset.effective_mems
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.mem_exclusive
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.mem_hardwall
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_migrate
-r--r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_pressure
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_pressure_enabled
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_spread_page
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_spread_slab
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.mems
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.sched_load_balance
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.sched_relax_domain_level
-rw-r--r-- 1 root root    0  8월 11 20:22 notify_on_release
-rw-r--r-- 1 root root    0  8월 11 20:22 release_agent
-rw-r--r-- 1 root root    0  8월 11 20:22 tasks

마운트한 디렉토리에서 내부 리스트를 확인해보니 위와 같이 많은 파일들이 생성되었습니다. 그 중 우리가 write할 수 있는 파일은 몇 개 되지 않네요. 나머지는 모두 read만 할 수 있습니다. 그 말은 우리가 cgroup blkio 서브시스템을 사용하여 제어할 수 있는 요소들은 write 권한이 있는 파일들을 유심히 보면 될 것 같습니다.

  1. 특정 프로세스의 CPU 제한 설정하기. 새로운 계층구조를 생성하고 60%를 할당합니다.
$ sudo mkdir /cgroup/cpu/limit_60_percent
$ sudo echo 600 > /cgroup/cpu/limit_60_percent/cpu.shares
  1. cgroup에 적용하기. test process의 pid가 10001 이라고 할 때 아래와 같이 설정해 줍니다.
$ echo 10001 >> /cgroup/cpu/limit_60_percent/tasks

위와 같이 설정하거나 프로세스의 이름이 test 라고 할 때

$pidof test | while read PID; do echo $PID >> /cgroup/cpu/limit_60_percent/tasks; done

CPUSET 예제 살펴보기

몇몇의 프로세스에 대해 설정하는 방법에 대해 알아보겠습니다.

  1. cgroup 가상파일시스템을 마운트합니다.
$ sudo mkdir -p /cgroup/cpuset
$ sudo mount -t cgroup -o cpuset cpuset /cgroup/cpuset
  1. 마운트 여부 확인하기. 아래 명령어를 수행해서 결과가 표시된다면 정상적으로 마운트되었습니다.
$ mount | grep cgroup
cpuset on /cgroup/cpuset type cgroup (rw,relatime,cpuset)
or
$ cat /proc/mount | grep cgroup
cpuset /cgroup/cpuset cgroup rw,relatime,cpuset 0 0
  1. mount 상태 확인해보기.
$ ls -al
total 4
dr-xr-xr-x 2 root root    0  8월 11 20:22 .
drwxr-xr-x 6 root root 4096  8월 11 20:21 ..
-rw-r--r-- 1 root root    0  8월 11 20:22 cgroup.clone_children
-rw-r--r-- 1 root root    0  8월 11 20:22 cgroup.procs
-r--r--r-- 1 root root    0  8월 11 20:22 cgroup.sane_behavior
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.cpu_exclusive
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.cpus
-r--r--r-- 1 root root    0  8월 11 20:22 cpuset.effective_cpus
-r--r--r-- 1 root root    0  8월 11 20:22 cpuset.effective_mems
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.mem_exclusive
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.mem_hardwall
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_migrate
-r--r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_pressure
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_pressure_enabled
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_spread_page
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.memory_spread_slab
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.mems
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.sched_load_balance
-rw-r--r-- 1 root root    0  8월 11 20:22 cpuset.sched_relax_domain_level
-rw-r--r-- 1 root root    0  8월 11 20:22 notify_on_release
-rw-r--r-- 1 root root    0  8월 11 20:22 release_agent
-rw-r--r-- 1 root root    0  8월 11 20:22 tasks

마운트한 디렉토리에서 내부 리스트를 확인해보니 위와 같이 많은 파일들이 생성되었습니다. 그 중 우리가 write할 수 있는 파일은 몇 개 되지 않네요. 나머지는 모두 read만 할 수 있습니다. 그 말은 우리가 cgroup blkio 서브시스템을 사용하여 제어할 수 있는 요소들은 write 권한이 있는 파일들을 유심히 보면 될 것 같습니다.

  1. 특정 프로세스의 cpucore 할당 설정하기.
$ sudo mkdir /cgroup/cpuset/test
$ sudo echo 0-1 > /cgroup/cpuset/test/cpuset/cpus
  1. cgroup에 적용하기. test process의 pid가 10001 이라고 할 때 아래와 같이 설정해 줍니다.
$ echo 10001 >> /cgroup/cpuset/test/cpuset.cpus

위와 같이 설정하거나 프로세스의 이름이 test 라고 할 때

$pidof test | while read PID; do echo $PID >> /cgroup/cpuset/test/cpuset.cpus; done

참고자료