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组应用的各种限制项,包括:


  1. $ cd /sys/fs/cgroup/memory/docker
  2. $ ls
  3. 1b3591fb9451d11292f2ce074d786f46fa68b37d1c483c241c63d69ab4335a50
  4. memory.kmem.limit_in_bytes memory.limit_in_bytes
  5. memory.swappiness
  6. 6cac1e322cb8fd185b8ee5d60e049b2b5d86c6a51b7457523b368f025fe57b2c
  7. memory.kmem.max_usage_in_bytes memory.max_usage_in_bytes
  8. memory.usage_in_bytes
  9. cgroup.clone_children
  10. memory.kmem.slabinfo memory.move_charge_at_immigrate
  11. memory.use_hierarchy
  12. cgroup.event_control
  13. memory.kmem.tcp.failcnt memory.numa_stat
  14. notify_on_release
  15. cgroup.procs
  16. memory.kmem.tcp.limit_in_bytes memory.oom_control
  17. tasks
  18. memory.failcnt
  19. memory.kmem.tcp.max_usage_in_bytes memory.pressure_level
  20. memory.force_empty
  21. memory.kmem.tcp.usage_in_bytes memory.soft_limit_in_bytes
  22. memory.kmem.failcnt
  23. memory.kmem.usage_in_bytes memory.stat

用户可以通过修改这些文件值来控制组限制Docker应用资源。例如,通过下面的命令可限制Docker组中所有进程使用的物理内存总量不超过100MB:


  1. $ sudo echo 104857600 >/sys/fs/cgroup/memory/docker/memory.limit_in_bytes

进入对应的容器文件夹,可以看到对应容器的一些状态:


  1. $ cd 42352bb6c1d1c5c411be8fa04e97842da87d14623495189c4d865dfc444d12ae/
  2. $ ls
  3. cgroup.clone_children memory.max_usage_in_bytes memory.stat
  4. cgroup.event_control memory.move_charge_at_immigrate memory.swappiness
  5. cgroup.procs memory.numa_stat memory.usage_in_bytes
  6. memory.failcnt memory.oom_control memory.use_hierarchy
  7. memory.force_empty memory.pressure_level notify_on_release
  8. memory.limit_in_bytes memory.soft_limit_in_bytes tasks
  9. $ cat memory.stat
  10. cache 110592
  11. rss 107286528
  12. rss_huge 16777216
  13. mapped_file 0
  14. writeback 0
  15. pgpgin 74766
  16. pgpgout 52634
  17. pgfault 115722
  18. pgmajfault 0
  19. inactive_anon 12288
  20. active_anon 107384832
  21. inactive_file 0
  22. active_file 0
  23. unevictable 0
  24. hierarchical_memory_limit 18446744073709551615
  25. total_cache 110592
  26. total_rss 107286528
  27. total_rss_huge 16777216
  28. total_mapped_file 0
  29. total_writeback 0
  30. total_pgpgin 74766
  31. total_pgpgout 52634
  32. total_pgfault 115722
  33. total_pgmajfault 0
  34. total_inactive_anon 12288
  35. total_active_anon 107384832
  36. total_inactive_file 0
  37. total_active_file 0
  38. total_unevictable 0

在开发容器工具时,往往需要一些容器运行状态数据,这时就可以从这里得到更多的信息。

17.3 控制组 - 图1注意

可以在创建或启动容器时为每个容器指定资源的限制,例如使用-c|—cpu-shares[=0]参数来调整容器使用CPU的权重;使用-m|—memory[=MEMORY]参数来调整容器使用内存的大小。