프로세스가 사용할 수 있는 자원(CPU, Memory, Disk 등)을 제한하는 수단으로 사용되는 cgroup에 대해서 정리한다.
제어 그룹 - Control Group (cgroup)
프로세스들이 사용할 수 있는 자원을 제한하는데 사용하는 기능이다. cgroup(제어그룹)을 통해서 한 프로세스가 자원을 너무 많이 사용해서 다른 프로세스에게 영향을 끼치는 행위를 방지할 수 있다. 제어 그룹은 /sys/fs/cgroup에 있는 파일과 디렉터리를 쓰거나 읽어서 자원의 제한 수치를 설정하거나 현재 상태를 조회할 수 있도록 지원한다.
제어 그룹 구성
cgroup의 버전 2부터는 단일 계층 구조로 구성된다. 기존의 cgroup 버전 1에서는 제어 그룹이 디렉터리 트리 구조로 구성되어 다수의 제어 그룹 제어기가 있었다. 프로세스 별로 디렉터리 트리 형태로 구성되어 제어기가 별도로 구성되었으나 현재는 단일 제어기를 통해서 통합 관리된다.
- cgroup 기본 구조
ubuntu@ip-10-0-0-220:/Workshop$ sudo ls /sys/fs/cgroup/
cgroup.controllers cgroup.subtree_control cpu.stat io.cost.model memory.numa_stat misc.current system.slice
cgroup.max.depth cgroup.threads cpu.stat.local io.cost.qos memory.pressure proc-sys-fs-binfmt_misc.mount user.slice
cgroup.max.descendants cpu.pressure dev-hugepages.mount io.pressure memory.reclaim sys-fs-fuse-connections.mount
cgroup.pressure cpuset.cpus.effective dev-mqueue.mount io.prio.class memory.stat sys-kernel-config.mount
cgroup.procs cpuset.cpus.isolated example io.stat memory.zswap.writeback sys-kernel-debug.mount
cgroup.stat cpuset.mems.effective init.scope memory misc.capacity sys-kernel-tracing.mount
- 구성 파일 설명
파일명 | 설명 |
cgroup.controllers | 사용 가능한 컨트롤러 목록 (cpuset, cpu, io, memory, hugetlb, pids, rdma, misc) |
cgroup.procs | 현재 cgroup에 속한 프로세스 PID 목록 |
cgroup.threads | 현재 cgroup에 속한 스레드 목록 |
cgroup.stat | cgroup의 통계 정보 |
cgroup.type | 현재 cgroup의 유형 (도메인, 스레드 등) |
cpu.max | CPU 사용량 제한 설정 |
cpu.pressure | CPU 사용 압박 (Pressure Stall information, PSI) |
io.max | I/O 사용량 제한 설정 |
io.pressure | I/O 사용 압박 |
memory.current | 현재 사용 중인 메모리 |
memory.max | 메모리 사용량 제한 설정 |
memory.pressure | 메모리 사용 압박 |
제어 그룹 생성
cgroup 디렉터리에 새로운 디렉터리를 생성하여 제어 그룹을 추가할 수 있다. 기본적으로 부모 cgroup 설정을 상속 받는다.
- 새로운 cgroup 디렉터리 생성
ubuntu@ip-10-0-0-220:/Workshop$ sudo mkdir /sys/fs/cgroup/custom_cgroup
- cgroup 구조 확인
ubuntu@ip-10-0-0-220:/Workshop$ sudo ls /sys/fs/cgroup/custom_cgroup
cgroup.controllers cgroup.subtree_control cpuset.cpus.exclusive cpu.weight memory.events.local memory.reclaim memory.zswap.writeback
cgroup.events cgroup.threads cpuset.cpus.exclusive.effective cpu.weight.nice memory.high memory.stat pids.current
cgroup.freeze cgroup.type cpuset.cpus.partition io.max memory.low memory.swap.current pids.events
cgroup.kill cpu.idle cpuset.mems io.pressure memory.max memory.swap.events pids.max
cgroup.max.depth cpu.max cpuset.mems.effective io.prio.class memory.min memory.swap.high pids.peak
cgroup.max.descendants cpu.max.burst cpu.stat io.stat memory.numa_stat memory.swap.max
cgroup.pressure cpu.pressure cpu.stat.local io.weight memory.oom.group memory.swap.peak
cgroup.procs cpuset.cpus cpu.uclamp.max memory.current memory.peak memory.zswap.current
cgroup.stat cpuset.cpus.effective cpu.uclamp.min memory.events memory.pressure memory.zswap.max
- 신규로 추가한 cgroup에서 관리할 리소스 지정
ubuntu@ip-10-0-0-220:/Workshop$ sudo cat /sys/fs/cgroup/custom_cgroup/cgroup.subtree_control
ubuntu@ip-10-0-0-220:/Workshop$ echo "+cpu +memory" | sudo tee /sys/fs/cgroup/custom_cgroup/cgroup.subtree_control
ubuntu@ip-10-0-0-220:/Workshop$ sudo cat /sys/fs/cgroup/custom_cgroup/cgroup.subtree_control
cpu memory
자원 한계 설정
특정 프로세스의 자원 최대 사용량을 설정한다. 별도의 설정이 없는 경우 호스트의 전체 메모리 크기를 사용할 수 있도록 구성되는데, 사용에 제한이 없는 경우 다른 프로세스들을 고갈 시킬 위험이 있다.
- Apache PID 확인
ubuntu@ip-10-0-0-220:/Workshop$ sudo netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
...
tcp6 0 0 :::80 :::* LISTEN 708/apache2
...
- Apache 가 사용하고 있는 제어 그룹 확인
ubuntu@ip-10-0-0-220:/Workshop$ cat /proc/708/cgroup
0::/system.slice/apache2.service
- Apache의 제어 그룹에 할당된 최대 메모리 사용량 확인
ubuntu@ip-10-0-0-220:/Workshop$ cat /sys/fs/cgroup/system.slice/apache2.service/memory.max
max
- Apache의 현재 메모리 사용량 확인
ubuntu@ip-10-0-0-220:/Workshop$ cat /sys/fs/cgroup/system.slice/apache2.service/memory.current
11206656
- 최대 메모리 사용량 12MB로 설정
ubuntu@ip-10-0-0-220:/Workshop$ echo 12000000 | sudo tee /sys/fs/cgroup/system.slice/apache2.service/memory.max
12000000
- 설정한 최대 메모리 사용량 확인
ubuntu@ip-10-0-0-220:/Workshop$ cat /sys/fs/cgroup/system.slice/apache2.service/memory.max
11997184
'Infrastructure & Systems > Linux' 카테고리의 다른 글
[Linux] iptables 초기화 (0) | 2025.05.20 |
---|---|
[Linux] namespace (unshare, chroot) (1) | 2025.03.14 |
[Linux] system call, capability, access control (0) | 2025.03.13 |
[Linux] SSH config 파일 설정 (0) | 2024.11.25 |
[Linux] Server Command Logging (0) | 2024.11.23 |