Docker是一种开源的容器技术,它允许开发人员将应用程序及其依赖项打包到一个轻量级、可移植的容器中。Docker是基于linux容器(LXC)实现的,其底层实现技术为cgroup + namespace + union filesystem,本文将介绍cgroup提供的作用。
cgroup全称是control groups,cgroup是linux内核中的机制,这种机制可以根据特定的行为把一系列的任务,子任务整合或者分离,按照资源划分的等级的不同,从而实现资源统一控制的框架。
cgroup主要负责资源的限制和监控,如cpu和内存等。这里分两方面,一方面是资源限制,即对进程组的资源总额进行限制,如果程序超过cgroup内存的上限,便会出发OOM;另一方面是监控,可以统计资源的使用情况,如CPU使用时长,内存用量等。cgroup为了限制资源,引入了以下概念:
task:表示系统中的某一个进程—PID。
subsystem:子系统,是指资源调度控制器,例如cpu的子系统控制cpu的时间分配,内存的子系统可以控制某个cgroup内的内存使用量,硬盘的子系统,可以控制硬盘的读写等等。
# lssubsys -am
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls,net_prio /sys/fs/cgroup/net_cls,net_prio
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb
pids /sys/fs/cgroup/pids
说明:
cpu 子系统,主要限制进程的 cpu 使用率。
cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
memory 子系统,可以限制进程的 memory 使用量。
blkio 子系统,可以限制进程的块设备 io。
devices 子系统,可以控制进程能够访问某些设备。
net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。
这里面每一个子系统都需要与内核的其他模块配合来完成资源的控制,比如对 cpu 资源的限制是通过进程调度模块根据 cpu 子系统的配置来完成的。
Hierarchy:层级,cgroup通过层级数的方式组织,多个子系统可以绑定到一个层级中,并且在子节点继承父节点的属性。
cgroup: 资源控制,以控制组为单位实现,cgroup中有都是task,可以有多个cgroup组,可以限制不同的内容,组名不能相同。
实践操作:通过cgroup限制某个进程的cpu使用率
- 写一个死循环代码,使得cpu跑满
while true
do
echo "Hello"
done
2. 查看cpu占用
3. 在目录/sys/fs/cgroup/cpu创建测试目录
# mkdir test
# cd test
# ls
cgroup.clone_children cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us notify_on_release
cgroup.event_control cpuacct.usage cpu.cfs_quota_us cpu.shares tasks
cgroup.procs cpuacct.usage_percpu cpu.rt_period_us cpu.stat
4. 设置cpu使用资源限制,cpu.cfs_period_us 表示时间周期,默认是100ms, cpu.cfs_quota_us 表示这期间呢可使用的cpu时间,默认为-1。通过echo 10000 > cpu.cfs_quota_us,表示该期间只能使用10%的cpu。最后将5852的进程号写入task文件中
# cat cpu.cfs_period_us
100000
# cat cpu.cfs_quota_us
-1
# 修改cpu.cfs_quota_us
# echo 10000 > cpu.cfs_quota_us
# cat cpu.cfs_period_us
100000
# cat cpu.cfs_quota_us
10000
# 最后将5852的进程号写入task文件中
# echo 5852 > tasks
5. 查看结果,cpu被限制分配了10%
实验成功
参考文章:
https://cloud.tencent.com/developer/article/1831602
https://www.jb51.net/article/216879.htm
《云计算:从IaaS到PaaS进阶》