zoukankan      html  css  js  c++  java
  • docker 资源限制之 cgroup


    1. Liunx cgroup

    使用 namespace 隔离运行环境,使得进程像在独立环境中运行一样。然而,仅有隔离环境还不够,还得限制被 namespace 隔离的资源。否则,namespace 将不限制的访问系统资源。并且,当系统资源耗尽时内核会触发 OOM 杀死不想关的进程。

    Liunx 提供 cgroup 对资源进行管理,它可以限制被 namespace 隔离的资源,同时可以对资源设置权重,计算使用量,控制进程/线程启停等。

    (详细信息可查看 man cgroup 和 这里 )

    2. docker cgroup

    在 docker 的 cgroup 实现中,docker daemon 会在每个子系统的控制组目录下创建名为 docker 的控制组。然后,在控制组下为每个容器创建以容器 ID 为名的容器控制组。 以限制容器的 CPU 为例创建容器:

    root@chunqiu:/# docker run -d --cpu-shares 30 --cpu-quota 25000 --cpu-period 1000 --name chunqiu sleep infinity
    25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00
    root@chunqiu:/# docker ps
    CONTAINER ID    IMAGE          COMMAND             CREATED          STATUS             NAMES
    25dbad77c117    5bafba9edb0b   "sleep infinity"    4 seconds ago    Up 2 seconds       chunqiu
    

    查看容器控制组:

    root@chunqiu:/sys/fs/cgroup/cpu/docker# ls
    25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00  cpuacct.stat          cpu.cfs_period_us  cpu.stat
    cgroup.clone_children                                             cpuacct.usage         cpu.cfs_quota_us   notify_on_release
    cgroup.procs                                                      cpuacct.usage_percpu  cpu.shares         tasks
    root@chunqiu:/sys/fs/cgroup/cpu/docker# cd 25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00/
    root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# ls
    cgroup.clone_children  cpuacct.stat   cpuacct.usage_percpu  cpu.cfs_quota_us  cpu.stat           tasks
    cgroup.procs           cpuacct.usage  cpu.cfs_period_us     cpu.shares        notify_on_release
    root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat tasks
    15331
    root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat cpu.cfs_quota_us
    25000
    root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat cpu.shares
    30
    root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat cpu.cfs_period_us
    1000
    

    可以看到,容器的资源(进程 15331)写入到 cgroup 控制组中,实现了对容器访问系统资源的限制。

    进入容器,开启另一个进程,查看该进程是否加入到容器控制组:

    /* 进入容器开启一个 bash 进程 */
    root@chunqiu:/sys/fs/cgroup/cpu/docker# docker exec -it chunqiu /bin/bash
    bash-5.0$ 
    

    查看容器控制组:

    root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat tasks
    15331
    15890
    root@chunqiu:/# ps -ef | grep 15313 | grep -v grep
    root     15313   817  0 07:52 ?        00:00:00 containerd-shim /var/run/docker/runtime-runc
    9999     15331 15313  0 07:52 ?        00:00:00 /usr/bin/sleep infinity
    9999     15890 15313  0 08:15 pts/0    00:00:00 /bin/bash
    

    容器中加入了新进程 15890,它是容器中的 bash 进程,cgroup 对容器控制组的 sleep 和 bash 进程进行了限制。

    芝兰生于空谷,不以无人而不芳。
  • 相关阅读:
    wes7配置
    一个很牛逼的工具XueTr
    构造一个好控制一点的长期工作线程
    SmartGit初步使用
    Android开发(一):环境搭建
    zabbix使用短信猫实现报警
    Build Libsvm to dll
    Using OpenCV in VS2012
    My Overlay Icons is Missing
    用Eclipse开发C、C++
  • 原文地址:https://www.cnblogs.com/xingzheanan/p/14729734.html
Copyright © 2011-2022 走看看