Docker 구현 확인 - cgroups 편 -



배경



커널에는 컨테이너라는 기능이 없으며,
Docker는 커널 기능의 조합으로 구현됩니다.
그 중에서도 주요한 것이 "cgroups"와 "namespace"이다.

이번에는 cgroups에 대해 조사해 보았습니다.

cgroups는?



cgroups는 control groups의 약자로 작업을 그룹화하거나,
그 그룹내의 태스크에 대해서 다양한 자원 제어를 실시하기 위한 구조입니다.
네임 스페이스와의 차이는 네임 스페이스 제어가 아니라 CPU 나 메모리와 같은 물리적 리소스를
제어하는 기능인 점.

구체적으로는 각 컨테이너에 대한 CPU 시간의 할당 우선도나, 메모리 사용량,
데이터 전송에 수반하는 대역 등을 조정하고 있다.

다이쇼의 wikipedia님으로부터 인용



조금 정확하게 알고 싶은 분들에게 cgroups에 대해서 인용

cgroups (control groups)는 프로세스 그룹 리소스 (CPU, 메모리, 디스크 I/O 등)의 사용을 제한하고 격리하는 Linux 커널의 기능입니다. "process containers"라는 이름으로 Rohit Seth가 2006년 9월부터 개발을 시작하고[1], 2007년에 cgroups로 이름이 바뀌고, 2008년 1월에 Linux 커널 2.6.24로 병합되었다[2]. 그 이후로 많은 기능과 컨트롤러가 추가되었습니다.

실제로 제어 가능한 리소스



/sys/fs/cgroup 아래에는 가상 파일 시스템으로 인터페이스가 제공됩니다.
여기서 파일/디렉토리 조작을 하는 것으로 다양한 리소스 제어를 실시합니다.
$ ls -l /sys/fs/cgroup/
total 0
dr-xr-xr-x 6 root root  0 Nov  3  2016 blkio
lrwxrwxrwx 1 root root 11 Nov  3  2016 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Nov  3  2016 cpuacct -> cpu,cpuacct
dr-xr-xr-x 6 root root  0 Nov  3  2016 cpu,cpuacct
dr-xr-xr-x 3 root root  0 Nov  3  2016 cpuset
dr-xr-xr-x 6 root root  0 Nov  3  2016 devices
dr-xr-xr-x 3 root root  0 Nov  3  2016 freezer
dr-xr-xr-x 6 root root  0 Nov  3  2016 memory
dr-xr-xr-x 3 root root  0 Nov  3  2016 net_cls
dr-xr-xr-x 6 root root  0 Nov  3  2016 systemd

이들을 서브시스템이라고 합니다.
각각에 대해서는 아래를 참조하십시오.


서브시스템
개요


blkio
블록 디바이스 입출력

cpu
CPU 리소스 할당 및 제한

cpuacct
작업이 소비하는 CPU 시간 보고서

cpuset
그룹에 CPU, 메모리 노드 할당

devices
기기에 대한 액세스 제한

freezer
그룹에 속한 프로세스 일시중지/재개

hugetlb
cgroup에서 hugetlb 사용

memory
작업이 소비하는 메모리 리소스 보고 및 제한

perf_event
cgroup 단위로 perf 도구 사용


cgroup 구현



실제로 코드를 읽자! 나는 생각했지만 특별한 동기 부여가 없었기 때문에 할애
읽으면
  • kernel/cgroup/cgroup.c
  • security/device_cgroup.c
  • mm/hugetlb_cgroup.c

  • 근처입니까 (자세한 방법을 알려주세요)

    조금 자세히



    Linux 프로세스는 task_struct 구조체라는 데이터 구조로 표현됩니다.
    그 구조체의 멤버인 "css_set"이 cgroup을 관리하기 위한 구조체.

    include/linux/sched.h
    #ifdef CONFIG_CGROUPS
      /* Control Group info protected by css_set_lock */
      struct css_set __rcu *cgroups;
      /* cg_list protected by css_set_lock and tsk->alloc_lock */
      struct list_head cg_list;
    #endif
    

    이 구조체를 따라가면 처리는 보일 것 같습니다. (쫓지 않지만)

    요약



    docker로 구현 된 cpu 할당 또는 리소스 할당
    어떻게 행해지고 있는지의 개요만으로도 잡았기 때문에 개인적으로는 만족.

    더 이상 깊이 들어가지 않는다 (할 수 없다)

    좋은 웹페이지 즐겨찾기