docker资源限制及应用 8090安适门户
一、本文将介绍 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 资源。
温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12839.html