Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 *...

36
Docker Cgroup 2015.2 박문식

Transcript of Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 *...

Page 1: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Docker Cgroup

2015.2박문식

Page 2: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroup?

시작은 “process containers”

Merge to Kernel 2.6.24

Page 3: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

리소스가 부족하던 시절

CPU / Memory / Disk

Page 4: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

리소스 풍요의 시대

CPU / Memory / Disk

WWW 로그인서비스 파일서비스 미디어서버

DB 서버 포털 중계 캐쉬

Page 5: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

효과적인 자원의 분배와 활용

고비용!!!

Page 6: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

전통적인 자원 사용 방법

Kernel

task task task

Resources

netcpu Memory disk …

Page 7: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups 에서의 자원 사용

Cgroups

task task task

subsystems

netcpu Memory disk …

Page 8: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups vs Process* 계층적이며 상속의 속성을 갖는다는 공통점

* 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Parrent

ChildParrent

ChildParrent

Child Child Child Child Child

Page 9: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups vs Process* 계층적이며 상속의 속성을 갖는다는 공통점

* 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

CPU0 CPU1

CPU2 CPU3

CPU4 CPU5

CPU6 CPU7

mem1 mem2

mem3 mem4

mem5 mem6

mem7 mem8

Group 1CPU 1,3,5Mem 2,3,7

Group 2CPU 0,2,6Mem 1,4,8

Task 123Task 124Task 125Task 126

Task 234Task 235Task 236Task 237

Page 10: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Subsystem?? task??

* subsystem은 시스템의 자원들을 지칭한다예를 들어 memory, disk, cpu, network 등...자원의 사용을 제한하는 기능을 제공하는 경우

* 디바이스와 다른점DMA 등과 같은 디바이스는 특정 기능을 수행하는 자원

* Croups 의 task는tid 로 구분되는 프로세스를 의미한다

* Cgroups는 task 들을 관리하는 기능만 갖고 있다

* 각 Subsystem 에서 제한의 기능들은 수행된다

Page 11: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - 특징

직관적 인터페이스

Page 12: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - 특징

모든 Cgroups에공통적으로 존해하는tasks 파일들...

여기가 tid 집합소

Page 13: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups – 그룹에 포함시키기

그룹으로 묶는 것은오로지 tasks 라는파일에 tid를 넣는것으로 끝이난다.

새로 생성되는 task 는자동으로 부모의 그룹에 속한다

Page 14: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - 그룹 만들기, 삭제하기

root@boggle70:/sys/fs/cgroup/cpu# mkdir mycpusudo 권한 필요

root@boggle70:/sys/fs/cgroup/cpu# rmdir mycputasks 파일내에 tid 가 모두 비워져야 가능

Page 15: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - 그룹 정보

root@boggle70:/sys/fs/cgroup/cpu# cat /proc/cgroups현재 지원되는 subsystem 과 몇개가 생성되었는지 보여준다

Page 16: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups – kernel space

Page 17: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups – kernel space

task_struct : pointer to cgroupcgroup 의 linked list

css_set : subsystem object 의 pointer list task_struct 와의 list

cgrp_dfl_root : struct cgroup_root (default root subsystem)

cgroup_subsys : cgroup subsystem arrayCpuset, cpu, cpuacct, memory, devicesFreezer, net_cls, blkio, perf_eventnet_prio, hugetlb, debug

Page 18: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups – kernel space

task_structinit_task

cgrp_dfl_rootinit_css_set

cgroup_subsys

css_set

subsystem subsystem subsystem subsystem subsystem

Page 19: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups – kernel space

ATTACH: add task to group and migrate task

Tasks file 에 pid 를 써 넣으면 어떤 일이 일어날까?

cgroup_tasks_write → __cgroup_procs_write

__cgroup_procs_write → cgroup_attach_task

cgroup_attach_task → add migrate list

Migrate prepare → migrate → migrate finish

Page 20: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups – kernel space

DETACH : delete task from cgroup

Remove task cg_list

Move to init_css_set

Page 21: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - subsystem

Blkio - 블록장치의 입출력 제한

Cpuacct - 그룹별 cpu 사용에 대한 통계를 보여줍니다

Cpuset - 각 cpu 와 메모리 노드를 할당합니다

Devices - 장치 파일에 대한 access 를 허용하거나 거부합니다

Freezer - 그룹에 대해서 작업을 start or stop 시킬수 있다

Hugetlb - HugeTLB 에 대한 제한을 할수 있다

Memory - 메모리의 사용을 제한한다

nel_cls - 네트워크 패킷에 class identifer tag 를 부여하여 traffic controller 에서사용할수 있도록 해준다

resource_counter - 콘트럴러에서 리소스를 관리하는 편리한 방법을 제공한다몇번이나 사용되었지는 성공 실패등에 대한 것들을 관리한다

Page 22: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - Common

cgroup.clone_childrenCpuset controller 에서만 사용된다활성화 될 경우 cpuset 의 하위 그룹은 상위 그룹의 설정을 그대로 복제된다

cgroup.event_controlUser 영역에서 사용되는 이벤트 통지를 기록할 fd 를 설정합니다

cgroup.procs그룹에 속해 있는 Thread group ID

cgroup.sane_behaviorSubsystem 에서 cgroup 에서 설정된 hierarchy 를 적용하도록 허용

notify_on_release해당 그룹이 삭제될때 nitify 를 할것인지 여부

release_agentNotify 에 사용되는 파일의 경로

Tasks그룹에 속해 있는 task list

Page 23: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups – blkio Weight time

CFQ 스케쥴러를 이용한 두개의 제한 정책을 지원* Weight time - 점유 시간 제한 정책* Throttling policy - 밴드위스 제한 정책

blkio.weight : 점유율blkio.leaf_weight : 유휴 점유율

Weight 설정 root 의 분배

그룹 구성 그룹 A 에 분배된 양에 대한 하위 그룹과의 분

Page 24: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups – blkio Throttling policy

* Throttling policy - bandwidth 제한 정책

blkio.throttle.read_bps_device: 디바이스로부터 초당 byte 읽기 제한: echo “major:minor” limit > blkio.throttle.read_bps_device

blkio.throttle.write_bps_device: 디바이스에 초당 byte 쓰기 제한: echo “major:minor” limit > blkio.throttle.write_bps_device

blkio.throttle.read_iops_device: 디바이스에 초당 io 읽기 횟수 제한: echo “major:minor” limit > blkio.throttle.read_iops_device

blkio.throttle.write_iops_device: 디바이스에 초당 io 쓰기 횟수 제한: echo “major:minor” limit > blkio.throttle.write_iops_device

Page 25: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - blkio

blkio.throttle.io_serviced : 그룹 bio 를 수행한 횟수blkio.throttle.io_service_bytes : 그룹 전송 byteblkio.io_merged : 그룹에서 요청되어 bio queue 에 merge 된 수blkio.io_queued : 그룹에서 queue 요청된 횟수blkio.io_service_bytes : 그룹에서 디스크에 전송이 요청된 바이트수blkio.io_service_time : 그룹에서 io 전송과 종료에 소요된 시간blkio.io_serviced : 그룹에서 디스크에 전송이 완료된 IO 횟수blkio.io_wait_time : 그룹에서 디스크 전송에서 기다린 시간blkio.sectors : 그룹에서 전송되어진 섹터수

blkio.throttle.io_serviced : throttling policy 에 의해 전송된 io 횟수blkio.throttle.io_service_bytes : throttling policy 에 의해 전송된 byte 수

Page 26: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups – accounting Contreller

CPU 사용량에 대한 통계를 보여준다

cpuacct.statUser mode 와 system mode 에서 사용된 통계를 보여준다 (USER_HZ)

cpuacct.usage그룹에서 사용된 총 cpu 사용시간 (ns)

cpuacct.usage_percpu그룹에서 사용된 각 cpu 별 사용시간 (ns)

Page 27: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - cpusetsTasks 에 cpu 와 momory nodes 를 할당

Page 28: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - cpusets

Tasks 에 cpu 와 momory nodes 를 할당

cpuset.cpus : 할당된 cpu listcpuset.mems : 할당된 memory node listcpuset.memory_migrate : page 가 할당된 nodes 로 이동한다cpuset.cpu_exclusive : cpu 가 다른 그룹에 할당 되는 것을 허용cpuset.mem_exclusive : 메모리가 다른 그룹에 공유 되는 것을 허용cpuset.mem_hardwall : 커널에서 페이지와 버퍼데이타에 대한 제한을

허용할 것인지 여부 cpuset.memory_pressure : 평균 메모리 사용 통계에cpuset.memory_spread_page : page cache 에서 다른 노드에 사용되는 것을 허용

Page 29: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - memory

메모리 사용에 대한 제한 기능

memory.memsw.usage_in_bytes : memory+swap 사용량memory.limit_in_bytes : memory limit 설정memory.memsw.limit_in_bytes : memory+swap 설정memory.failcnt : memory limit 데 걸린 횟수memory.memsw.failcnt : memory+swap limit 에 걸린 횟수memory.max_usage_in_bytes : 최대 memory 사용량memory.memsw.max_usage_in_bytes : 최대 memory+swap 사용량memory.soft_limit_in_bytes : soft_limit 제한. 최대 hard_limit

허용 시간 동안 soft_limit 은 초과 허용memory.stat : 여러가지 통계를 보여준다memory.use_hierarchy : 상위 그룹에 대한 제한을 따른다memory.force_empty : 메모리 사용량을 비운다memory.pressure_level : eventfd 와 함께 notification 에 사용된다memory.swappiness : /proc/sys/vm/swappinessmemory.move_charge_at_immigrate : tasks migration 시 page 처리 옵션memory.oom_control : enable oommemory.numa_stat : numa node 에 대한 메모리 사용정보

Page 30: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - memory

메모리 사용에 대한 제한 기능

memory.kmem.limit_in_bytes : 커널 메모리 사용 제한 memory.kmem.usage_in_bytes : 커널 메모리 사용량memory.kmem.failcnt : 커널 메모리 제한에 걸린 횟수memory.kmem.max_usage_in_bytes : 커널 메모리 최대 사용량

memory.kmem.tcp.limit_in_bytes : tcp buffer 메모리 사용제한 memory.kmem.tcp.usage_in_bytes : tcp buffer 메메리 사용량memory.kmem.tcp.failcnt : tcp buffer 메모리 제한에 걸린 횟수memory.kmem.tcp.max_usage_in_bytes : tcp buffer 최대 사용량

커널 메모리의 경우 여러가지 이유로 메모리 사용 제한에 대한 예외가 존재- kernel memory no swap out- root cgroup 에는 적용하지 않는다- 현재는 tcp memory 에 대해서만 적용

Page 31: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - net_cls

Network classifier : 패킷에 tag 를 붙여서 사용한다

Tag 는 classid 를 사용하며 패킷 처리에서 traffic controller 에서 서로 다른 우순 순위 정책에 따라 패킷을 처리할 수 있도록 제공한다

Page 32: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - resource_counter

컨트롤러에 의한 리소스 관리를 용이하게 하기 위한 기능커널 레벨 지원Kernel/res_counter.c

Usage : read only 통계Max_usage : 최대 사용 countLimit : 최대 사용 가능 countFailcnt : limit 에 도달한 횟수Lock : spinlock

Page 33: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - hugetlb

큰 메모리 사용에 대한 제한

hugetlb.<hugepagesize>.limit_in_bytes : 최대 사용 제한hugetlb.<hugepagesize>.max_usage_in_bytes : 최대 사용 기록hugetlb.<hugepagesize>.usage_in_bytes : 현재 사용 횟수hugetlb.<hugepagesize>.failcnt : 실패 횟수

Hugepagesize 정보는 /proc/meminfo 에 있다 (부트 설정)

Page 34: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - freezer

Job management 시에 사용되는 기능그룹에 속하는 tasks 를 스톱시켜 checkpoint 를 사용할수 있게 한다결과적으로 특정 상황에서의 consistent image 를 생성 시킬수 있게 된다.이렇게 얻게된 image 는 이후에 에러 복구등에 사용할수 있게 된다.

Freezer 에서는 SIGSTOP, SIGCONT 시그널을 사용한다.

Page 35: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

Cgroups - freezer

Freezer.stat : read-write. 세가지 상태를 갖게 된다.THAWED, FREEZING, FROZEN

freezer.self_freezing : read-only. 자신의 상태를 보여준다.

freezer.parent_freezing : read-only. parent 의 freezeing 상태를 보여준다

Root cgroup 은 no-freezable

Freezing

Unfreezing

Page 36: Docker Cgroup · Cgroups vs Process * 계층적이며 상속의 속성을 갖는다는 공통점 * 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.

감사합니다