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 코어 별로 원하는 Task 들을 할당할 수 있어 코어 간 스위칭 되는 로드를 감소할 수 있으며 입맛에 맞게 그룹을 조정할 수 있습니다. 즉 컨테이너 환경에서도 각 컨테이너 별로 다양한 인스터스를 생성할 수 있습니다.
CPU 예제 살펴보기
몇몇의 프로세스에 대해 설정하는 방법에 대해 알아보겠습니다. 여기서는 cpu와 cpuacct 함께 설정합니다.
1. cgroup 가상파일시스템을 마운트합니다.
$ sudo mkdir -p /cgroup/cpu
$ sudo mount -t cgroup -o cpu,cpuacct cpu,cpuacct /cgroup/cpu
2. 마운트 여부 확인하기.
아래 명령어를 수행해서 결과가 표시된다면 정상적으로 마운트되었습니다.
$ 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
3. 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 권한이 있는 파일들을 유심히 보면 될 것 같습니다.
4. 특정 프로세스의 CPU 제한 설정하기.
새로운 계층구조를 생성하고 60%를 할당합니다.
$ sudo mkdir /cgroup/cpu/limit_60_percent
$ sudo echo 600 > /cgroup/cpu/limit_60_percent/cpu.shares
5. 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
2. 마운트 여부 확인하기.
아래 명령어를 수행해서 결과가 표시된다면 정상적으로 마운트되었습니다.
$ 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
3. 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 권한이 있는 파일들을 유심히 보면 될 것 같습니다.
4. 특정 프로세스의 cpucore 할당 설정하기.
$ sudo mkdir /cgroup/cpuset/test
$ sudo echo 0-1 > /cgroup/cpuset/test/cpuset/cpus
5. 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
참고자료
- Containerization with LXC | Konstantin Ivanov
- [Linux] cgroup - (task) control group (1) (http://egloos.zum.com/studyfoss/v/5505982)
- [Linux] cgroup - (task) control group (1)(http://studyfoss.egloos.com/5506102)
- Docker(container)의 작동 원리: namespaces and cgroups(https://tech.ssut.me/what-even-is-a-container/)
- Control Groups | 문C 블로그(http://jake.dothome.co.kr/control-groups/)
- CGROUPS(7) linux manual page
- https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt
- https://www.kernel.org/doc/Documentation/cgroup-v1/cpuacct.txt
'Linux > Container' 카테고리의 다른 글
[Docker] 도커 저장소! Storage 알아보기 (0) | 2022.07.30 |
---|---|
[Docker] Docker 기본 명령어 알아보기 (0) | 2022.07.30 |
[cgroup] memory (0) | 2019.08.11 |
[cgroup] blkio (0) | 2019.08.11 |
[cgroup] 1. cgroup 이란? (0) | 2019.08.06 |