当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    docker容器资源配额控制详解

    栏目:win服务器问题汇总 时间:2019-12-05 17:44

    docker通过cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。

    cgroup简介

    cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘IO等等) 的机制,被LXC、docker等很多项目用于实现进程资源控制。cgroup将任意进程进行分组化管理的 Linux 内核功能。cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为cgroup子系统,有以下几大子系统实现:

    blkio:设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。 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上的线程。

    目前docker只是用了其中一部分子系统,实现对资源配额和使用的控制。

    可以使用stress工具来测试CPU和内存。使用下面的Dockerfile来创建一个基于Ubuntu的stress工具镜像。

    FROM ubuntu:14.04
    RUN apt-get update &&apt-get install stress

    CPU资源配额控制

    CPU份额控制

    docker提供了–cpu-shares参数,在创建容器时指定容器所使用的CPU份额值。使用示例:

    使用命令docker run -tid –cpu-shares 100 ubuntu:stress,创建容器,则最终生成的cgroup的cpu份额配置可以下面的文件中找到:

    root@ubuntu:~# cat /sys/fs/cgroup/cpu/docker/<容器的完整长ID>/cpu.shares
    100

    cpu-shares的值不能保证可以获得1个vcpu或者多少GHz的CPU资源,仅仅只是一个弹性的加权值。

    默认情况下,每个docker容器的cpu份额都是1024。单独一个容器的份额是没有意义的,只有在同时运行多个容器时,容器的cpu加权的效果才能体现出来。例如,两个容器A、B的cpu份额分别为1000和500,在cpu进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU的时间片,但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器A一定能获得CPU时间片。比如容器A的进程一直是空闲的,那么容器B是可以获取比容器A更多的CPU时间片的。极端情况下,比如说主机上只运行了一个容器,即使它的cpu份额只有50,它也可以独占整个主机的cpu资源。

    cgroups只在容器分配的资源紧缺时,也就是说在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的cpu份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的cpu分配和容器中进程运行情况。

    CPU周期控制

    docker提供了–cpu-period、–cpu-quota两个参数控制容器可以分配到的CPU时钟周期。–cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配,而–cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟–cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。