개발/컴퓨터사이언스

Cgroup (Control Group)

kwony 2018. 9. 15. 13:37

Cgroup (Control Group)


Cgroup은 CPU, Network, Memory 등 하드웨어 자원을 그룹별로 관리 할 수 있는 리눅스의 모듈이다. 하나 또는 복수의 장치를 묶어서 하나의 그룹을 만들 수 있으며 개별 그룹은 시스템에서 설정한 값만큼 하드웨어를 사용할 수 있다. 설정하는 값은 예를 들면 이런 것들이다.

  • 어떤 그룹이 CPU를 더 많이 차지 할 것인지?
  • 그룹이 얼마만큼 메모리를 사용 할 수 있는지?
  • 네트워크 우선순위를 얼만큼 줄 것인가.
시스템에 생성된 프로세스들은 장치 별로 특정한 cgroup에 속하며 프로세스가 사용하는 하드웨어 자원의 총량은 속한 cgroup의 통제를 받게 된다. 이말은 곧 프로세스가 아무리 효율적으로 동작하도록 만들어져 있어도 cpu 점유율이 낮은 cgroup에 속해 있으면 속도가 느릴 수 밖에 없고 cgroup 자체가 CPU 점유율이 높아도 이 그룹에 속한 프로세스가 많으면 전반적인 속도가 저하 될 수 밖에없다. 리눅스에선 하드웨어와 프로세스 사이에 cgroup 계층을 두어서 자원을 관리할 수 있도록 만들었다.

하드웨어와 cgroup, 프로세스간의 관계는 아래의 그림처럼 표현 할 수 있다.



시스템에 어떤 cgroup이 있는지 그리고 프로세스가 어떤 cgroup에 매핑되어 있는지는 리눅스 파일 시스템에 모두 매핑 되어 있다. 간단히 cat과 ls 명령어로 조회가 가능하다.


// System에 설치된 cgroup 목록
kwony@kwony:~$ ls /sys/fs/cgroup/
blkio      cpuacct      devices  memory            net_prio    systemd
cgmanager  cpu,cpuacct  freezer  net_cls           perf_event
cpu        cpuset       hugetlb  net_cls,net_prio  pids

// 프로세스별 cgroup 정보. /proc/[pid]/cgroup
kwony@kwony:~$ cat /proc/8502/cgroup 
11:pids:/user.slice/user-1000.slice
10:cpuset:/
9:net_cls,net_prio:/
8:devices:/user.slice
7:freezer:/
6:perf_event:/
5:hugetlb:/
4:cpu,cpuacct:/
3:blkio:/
2:memory:/
1:name=systemd:/user.slice/user-1000.slice/session-c2.scope