Docker Cgroup
2015.2박문식
Cgroup?
시작은 “process containers”
Merge to Kernel 2.6.24
리소스가 부족하던 시절
CPU / Memory / Disk
리소스 풍요의 시대
CPU / Memory / Disk
WWW 로그인서비스 파일서비스 미디어서버
DB 서버 포털 중계 캐쉬
효과적인 자원의 분배와 활용
고비용!!!
전통적인 자원 사용 방법
Kernel
task task task
Resources
netcpu Memory disk …
Cgroups 에서의 자원 사용
Cgroups
task task task
subsystems
netcpu Memory disk …
Cgroups vs Process* 계층적이며 상속의 속성을 갖는다는 공통점
* 프로세스는 단일 상속 구조인데 반해 Cgroups 는 다중 구조를 갖는다.
Parrent
ChildParrent
ChildParrent
Child Child Child Child Child
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
Subsystem?? task??
* subsystem은 시스템의 자원들을 지칭한다예를 들어 memory, disk, cpu, network 등...자원의 사용을 제한하는 기능을 제공하는 경우
* 디바이스와 다른점DMA 등과 같은 디바이스는 특정 기능을 수행하는 자원
* Croups 의 task는tid 로 구분되는 프로세스를 의미한다
* Cgroups는 task 들을 관리하는 기능만 갖고 있다
* 각 Subsystem 에서 제한의 기능들은 수행된다
Cgroups - 특징
직관적 인터페이스
Cgroups - 특징
모든 Cgroups에공통적으로 존해하는tasks 파일들...
여기가 tid 집합소
Cgroups – 그룹에 포함시키기
그룹으로 묶는 것은오로지 tasks 라는파일에 tid를 넣는것으로 끝이난다.
새로 생성되는 task 는자동으로 부모의 그룹에 속한다
Cgroups - 그룹 만들기, 삭제하기
root@boggle70:/sys/fs/cgroup/cpu# mkdir mycpusudo 권한 필요
root@boggle70:/sys/fs/cgroup/cpu# rmdir mycputasks 파일내에 tid 가 모두 비워져야 가능
Cgroups - 그룹 정보
root@boggle70:/sys/fs/cgroup/cpu# cat /proc/cgroups현재 지원되는 subsystem 과 몇개가 생성되었는지 보여준다
Cgroups – kernel space
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
Cgroups – kernel space
task_structinit_task
cgrp_dfl_rootinit_css_set
cgroup_subsys
css_set
subsystem subsystem subsystem subsystem subsystem
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
Cgroups – kernel space
DETACH : delete task from cgroup
Remove task cg_list
Move to init_css_set
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 - 콘트럴러에서 리소스를 관리하는 편리한 방법을 제공한다몇번이나 사용되었지는 성공 실패등에 대한 것들을 관리한다
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
Cgroups – blkio Weight time
CFQ 스케쥴러를 이용한 두개의 제한 정책을 지원* Weight time - 점유 시간 제한 정책* Throttling policy - 밴드위스 제한 정책
blkio.weight : 점유율blkio.leaf_weight : 유휴 점유율
Weight 설정 root 의 분배
그룹 구성 그룹 A 에 분배된 양에 대한 하위 그룹과의 분
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
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 수
Cgroups – accounting Contreller
CPU 사용량에 대한 통계를 보여준다
cpuacct.statUser mode 와 system mode 에서 사용된 통계를 보여준다 (USER_HZ)
cpuacct.usage그룹에서 사용된 총 cpu 사용시간 (ns)
cpuacct.usage_percpu그룹에서 사용된 각 cpu 별 사용시간 (ns)
Cgroups - cpusetsTasks 에 cpu 와 momory nodes 를 할당
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 에서 다른 노드에 사용되는 것을 허용
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 에 대한 메모리 사용정보
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 에 대해서만 적용
Cgroups - net_cls
Network classifier : 패킷에 tag 를 붙여서 사용한다
Tag 는 classid 를 사용하며 패킷 처리에서 traffic controller 에서 서로 다른 우순 순위 정책에 따라 패킷을 처리할 수 있도록 제공한다
Cgroups - resource_counter
컨트롤러에 의한 리소스 관리를 용이하게 하기 위한 기능커널 레벨 지원Kernel/res_counter.c
Usage : read only 통계Max_usage : 최대 사용 countLimit : 최대 사용 가능 countFailcnt : limit 에 도달한 횟수Lock : spinlock
Cgroups - hugetlb
큰 메모리 사용에 대한 제한
hugetlb.<hugepagesize>.limit_in_bytes : 최대 사용 제한hugetlb.<hugepagesize>.max_usage_in_bytes : 최대 사용 기록hugetlb.<hugepagesize>.usage_in_bytes : 현재 사용 횟수hugetlb.<hugepagesize>.failcnt : 실패 횟수
Hugepagesize 정보는 /proc/meminfo 에 있다 (부트 설정)
Cgroups - freezer
Job management 시에 사용되는 기능그룹에 속하는 tasks 를 스톱시켜 checkpoint 를 사용할수 있게 한다결과적으로 특정 상황에서의 consistent image 를 생성 시킬수 있게 된다.이렇게 얻게된 image 는 이후에 에러 복구등에 사용할수 있게 된다.
Freezer 에서는 SIGSTOP, SIGCONT 시그널을 사용한다.
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
감사합니다