17.3 控制组
控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免多个容器同时运行时对宿主机系统的资源竞争。
控制组技术最早是由Google的程序员2006年起提出,Linux内核自2.6.24开始原生支持。控制组可以提供对容器的内存、CPU、磁盘IO等资源进行限制和计费管理。控制组的设计目标是为不同的应用情况提供统一的接口,从控制单一进程(比如nice工具)到系统级虚拟化(包括OpenVZ、Linux-VServer、LXC等)。
具体来看,控制组提供:
·资源限制(Resource limiting):可以将组设置为不超过设定的内存限制。比如:内存子系统可以为进程组设定一个内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发Out of Memory警告。
·优先级(Prioritization):通过优先级让一些组优先得到更多的CPU等资源。
·资源审计(Accounting):用来统计系统实际上把多少资源用到适合的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间。
·隔离(isolation):为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统。
·控制(Control):挂起、恢复和重启动等操作。
安装Docker后,用户可以在/sys/fs/cgroup/memory/docker/目录下看到对Docker组应用的各种限制项,包括:
- $ cd /sys/fs/cgroup/memory/docker
- $ ls
- 1b3591fb9451d11292f2ce074d786f46fa68b37d1c483c241c63d69ab4335a50
- memory.kmem.limit_in_bytes memory.limit_in_bytes
- memory.swappiness
- 6cac1e322cb8fd185b8ee5d60e049b2b5d86c6a51b7457523b368f025fe57b2c
- memory.kmem.max_usage_in_bytes memory.max_usage_in_bytes
- memory.usage_in_bytes
- cgroup.clone_children
- memory.kmem.slabinfo memory.move_charge_at_immigrate
- memory.use_hierarchy
- cgroup.event_control
- memory.kmem.tcp.failcnt memory.numa_stat
- notify_on_release
- cgroup.procs
- memory.kmem.tcp.limit_in_bytes memory.oom_control
- tasks
- memory.failcnt
- memory.kmem.tcp.max_usage_in_bytes memory.pressure_level
- memory.force_empty
- memory.kmem.tcp.usage_in_bytes memory.soft_limit_in_bytes
- memory.kmem.failcnt
- memory.kmem.usage_in_bytes memory.stat
用户可以通过修改这些文件值来控制组限制Docker应用资源。例如,通过下面的命令可限制Docker组中所有进程使用的物理内存总量不超过100MB:
- $ sudo echo 104857600 >/sys/fs/cgroup/memory/docker/memory.limit_in_bytes
进入对应的容器文件夹,可以看到对应容器的一些状态:
- $ cd 42352bb6c1d1c5c411be8fa04e97842da87d14623495189c4d865dfc444d12ae/
- $ ls
- cgroup.clone_children memory.max_usage_in_bytes memory.stat
- cgroup.event_control memory.move_charge_at_immigrate memory.swappiness
- cgroup.procs memory.numa_stat memory.usage_in_bytes
- memory.failcnt memory.oom_control memory.use_hierarchy
- memory.force_empty memory.pressure_level notify_on_release
- memory.limit_in_bytes memory.soft_limit_in_bytes tasks
- $ cat memory.stat
- cache 110592
- rss 107286528
- rss_huge 16777216
- mapped_file 0
- writeback 0
- pgpgin 74766
- pgpgout 52634
- pgfault 115722
- pgmajfault 0
- inactive_anon 12288
- active_anon 107384832
- inactive_file 0
- active_file 0
- unevictable 0
- hierarchical_memory_limit 18446744073709551615
- total_cache 110592
- total_rss 107286528
- total_rss_huge 16777216
- total_mapped_file 0
- total_writeback 0
- total_pgpgin 74766
- total_pgpgout 52634
- total_pgfault 115722
- total_pgmajfault 0
- total_inactive_anon 12288
- total_active_anon 107384832
- total_inactive_file 0
- total_active_file 0
- total_unevictable 0
在开发容器工具时,往往需要一些容器运行状态数据,这时就可以从这里得到更多的信息。
注意
可以在创建或启动容器时为每个容器指定资源的限制,例如使用-c|—cpu-shares[=0]参数来调整容器使用CPU的权重;使用-m|—memory[=MEMORY]参数来调整容器使用内存的大小。
