进入容器,再次执行脚本,打开宿主机的另一个终端执行 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 资源。
cgroups 只在容器分配的资源紧缺时,也就是说在需要对容器使用的资源进行限制时,才会
生效。因此,无法单纯根据某个容器的 cpu 份额来确定有多少 cpu 资源分配给它,资源分配
结果取决于同时运行的其他容器的 cpu 分配和容器中进程运行情况。
cpu-shares 演示案例:
先删除 docker 主机上运行的容器
Docker 通过--cpu-shares 指定 CPU 份额
运行一个容器指定 cpu 份额为 1024
注:
--cpu-shares 指定 CPU 份额,默认就是 1024
--cpuset-cpus 可以绑定 CPU。例如,指定容器在--cpuset-cpus0,1 或--cpuset-cpus 0-3
--cpu 是 stress 命令的选项表示产生 n 个进程 每个进程都反复不停的计算随机数的平方根
stress 命令是 linux 下的一个压力测试工具。
在 docker 宿主机上打开一个 terminal 执行 top
查看 top 的现实结果
可以看到 container1 的 CPU 占比为 1024/(1024+512)=2/3,container2 的 CPU 占比为
512/(1024+512)=1/3
将 container1 的 cpu.shares 改为 512,
#echo “512” >/sys/fs/cgroup/cpu/system.slice/docker-<容器的完整长ID>/cpu.shares
可以看到两个容器的 CPU 占比趋于平均
设定 CPU 使用周期使用时间上限
cgroups 里,可以用cpu.cfs_period_us 和 cpu.cfs_quota_us 来限制该组中的所有进程在单
位时间里可以使用的 cpu 时间。cpu.cfs_period_us 就是时间周期,默认为 100000,即百毫
秒。cpu.cfs_quota_us 就是在这期间内可使用的 cpu 时间,默认 -1,即无限制。
cpu.cfs_period_us:设定时间周期(单位为微秒(μs)),必须与 cfs_quota_us 配合使用。
cpu.cfs_quota_us :设定周期内最多可使用的时间(单位为微秒(μs))。这里的配置指 task
对单个 cpu 的使用上限。
举个例子,如果容器进程需要每 1 秒使用单个 CPU 的 0.2 秒时间,可以将 cpu-period 设置为
1000000(即 1 秒),cpu-quota 设置为 200000(0.2 秒)。
当然,在多核情况下,若 cfs_quota_us 是 cfs_period_us 的两倍,就表示在两个核上
完全使用 CPU,例如如果允许容器进程需要完全占用两个 CPU,则可以将 cpu-period 设置为
100000(即 0.1 秒),cpu-quota 设置为 200000(0.2 秒)。
使用示例:
使用命令 docker run 创建容器
在宿主机上执行 top
从上图可以看到基本占了 100%的 cpu 资源
则最终生成的 cgroup 的 cpu 周期配置可以下面的目录中找到:
/sys/fs/cgroup/cpu/system.slice/docker-<容器的完整长ID>/