Loading
0

docker资源限制及应用

一、本文将介绍 cgroup 如何做到内存,cpu 和 io 速率的隔离
本文用脚本运行示例进程,来验证 Cgroups 关于 cpu、内存、io 这三部分的隔离效果。
测试机器环境


执行 mount 命令查看 cgroup 的挂载点

从上图可以看到 cgroup 挂载在/sys/fs/cgroup 目录
groups 可以限制 blkio、cpu、cpuacct、cpuset、devices、freezer、memory、net_cls、ns 等系
统的资源,以下是主要子系统的说明:
blkio 这个子系统设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及 usb 等等。
cpu 这个子系统使用调度程序为 cgroup 任务提供 cpu 的访问。
cpuacct 产生 cgroup 任务的 cpu 资源报告。
cpuset 如果是多核心的 cpu,这个子系统会为cgroup 任务分配单独的 cpu 和内存。
devices 允许或拒绝 cgroup 任务对设备的访问。
freezer 暂停和恢复 cgroup 任务。
memory 设置每个 cgroup 的内存限制以及产生内存资源报告。
net_cls 标记每个网络包以供 cgroup 方便使用,它通过使用等级识别符(classid)标记网络数
据包,从而允许 Linux 流量控制程序(TC:Traffic Controller)识别从具体 cgroup 中生成
的数据包。
ns:命名空间子系统
cgroups 管理进程 cpu 资源
我们先看一个限制 cpu 资源的例子:
跑一个耗 cpu 的脚本
运行一个容器,在容器内创建脚本并运行脚本,脚本内容:

将容器切换到后台运行
在宿主机上 top 可以看到这个脚本基本占了 90%多的 cpu 资源

下面用 cgroups 控制这个进程的 cpu 资源
对于 centos7 来说,通过 systemd-cgls 来查看系统 cgroups tree:
#systemd-cgls

注:4239 就是我们所运行的容器 pid

将 cpu.cfs_quota_us 设为 50000,相对于 cpu.cfs_period_us 的 100000 是 50%

进入容器,再次执行脚本,打开宿主机的另一个终端执行 top 命令
然后 top 的实时统计数据如下,cpu 占用率将近 50%,看来 cgroups 关于 cpu 的控制起了效果

CPU 资源控制
CPU 资源的控制也有两种策略,一种是完全公平调度 (CFS:CompletelyFair Scheduler)
策略,提供了限额和按比例分配两种方式进行资源控制;另一种是实时调度(Real-Time
Scheduler)策略,针对实时进程按周期分配固定的运行时间。配置时间都以微秒(μs)为
单位,文件名中用 us 表示。
CFS  调度策略下的配置
按权重比例设定 CPU 的分配
docker 提供了–cpu-shares 参数,在创建容器时指定容器所使用的 CPU 份额值。例如:
使用命令 docker run -tid –cpu-shares 100 镜像,创建容器,则最终生成的 cgroup 的 cpu 份额
配置可以下面的文件中找到:


cpu-shares 的值不能保证可以获得 1 个 vcpu 或者多少 GHz 的 CPU 资源,仅仅只是一个加权
值。
该加权值是一个整数(必须大于等于 2)表示相对权重,最后除以权重总和算出相对比例,
按比例分配 CPU 时间。
默认情况下,每个 docker 容器的 cpu 份额都是 1024。单独一个容器的份额是没有意义的,
只有在同时运行多个容器时,容器的 cpu 加权的效果才能体现出来。例如,两个容器 A、B
的 cpu 份额分别为 1000 和 500,在 cpu 进行时间片分配的时候,容器 A 比容器 B 多一倍的
机会获得 CPU 的时间片。如果容器 A 的进程一直是空闲的,那么容器 B 是可以获取比容器
A 更多的 CPU 时间片的。极端情况下,比如说主机上只运行了一个容器,即使它的 cpu 份额
只有 50,它也可以独占整个主机的 cpu 资源。

分页阅读: 1 2 3 4
【声明】:8090安全小组门户(http://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们:邮箱hack@ddos.kim,我们会在最短的时间内进行处理。