可配额/可度量:Docker基础Cgroup
在一个容器,如果不做任何资源限制,则允许其占用无限大的内存空间,有时候会因为代码Bug程序会一直申请内存,直到把宿主机内存占满;为避免此类状况的出现,宿主机内有必要对容器进行资源分配限制,比如CPU、内存等;Linux Cgroup的全程是Linux Control Groups,它最主要的作用是限制一个进程能够使用的资源上线,包括CPU、内存、磁盘、网络带宽等等。此外还能够对进程进行优先级设置,以及进程挂起和恢复等操作。
docker pause就是基于Cgroup的进程挂起操作
验证系统cgroups
Cgroup在内核层默认已经开启
Centos
]# cat /boot/config-4.4.206-1.el7.elrepo.x86_64 | grep CGROUP
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_CGROUP_WRITEBACK=y
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
# cat /boot/config-3.10.0-957.el7.x86_64 | grep CGROUP
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NETPRIO_CGROUP=y
Ubantu
]# cat /boot/config-4.15.0-55-generic | grep CGROUP
CONFIG_CGROUPS=y
CONFIG_BLK_CGROUPS=y
# CONFIG_CGROUP_DEBUG_BLK_CGROUP is not set
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPRF=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SOCK_CGROUP_DATA=y
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
cgroup中内存模块:
]# cat /boot/config-4.4.206-1.el7.elrepo.x86_64 | grep MEM | grep CG
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_SWAP_ENABLED=y is not set
CONFIG_MEMCG_KMEM=y
查看系统cgroups
~]# ll /sys/fs/cgroup/
total 0
dr-xr-xr-x 4 root root 0 Jun 1 15:55 blkio
lrwxrwxrwx 1 root root 11 Jun 1 15:55 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Jun 1 15:55 cpuacct -> cpu,cpuacct
dr-xr-xr-x 4 root root 0 Jun 1 15:55 cpu,cpuacct
dr-xr-xr-x 2 root root 0 Jun 1 15:55 cpuset
dr-xr-xr-x 4 root root 0 Jun 1 15:55 devices
dr-xr-xr-x 2 root root 0 Jun 1 15:55 freezer
dr-xr-xr-x 2 root root 0 Jun 1 15:55 hugetlb
dr-xr-xr-x 4 root root 0 Jun 1 15:55 memory
lrwxrwxrwx 1 root root 16 Jun 1 15:55 net_cls -> net_cls,net_prio
dr-xr-xr-x 2 root root 0 Jun 1 15:55 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Jun 1 15:55 net_prio -> net_cls,net_prio
dr-xr-xr-x 2 root root 0 Jun 1 15:55 perf_event
dr-xr-xr-x 4 root root 0 Jun 1 15:55 pids
dr-xr-xr-x 4 root root 0 Jun 1 15:55 systemd
有了以上chroot、namespace、cgroup就具备了基础的容器运行环境,但是还需要有相应的创建于删除的管理工具,以及如何把容器运行起来,容器数据怎么处理,如何进行启动、关闭
cgroup具体实现
Name | |
---|---|
blkio | 块设备IO限制 |
cpu | 使用调度程序为Cgroup任务提供cpu的访问 |
cpuacct | 产生cgroup任务的cpu资源报告。 |
cpuset | 如果是多核心cpu,这个子系统会为cgroup任务分配单独的cpu和内存 |
devices | 允许或拒绝cgroup任务对设备的访问 |
freezer | 暂停和恢复cgroup任务 |
memory | 设置每个cgroup的内存限制以及产生内存资源报告 |
net_cls | 标记每个网络包以供cgroup方便实用 |
ns | 命名空间子系统 |
perf_event | 增加对每group的监控跟踪的能力,可以检测属于某个特定的group的所有线程以及运行在特定CPU上的线程 |