• 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 进程进行了限制。

    芝兰生于空谷,不以无人而不芳。
  • 相关阅读:
    【转】vue常用开发ui框架(app,后台管理系统,移动端)及插件
    【转】VUE 组件转换为微信小程序组件的方法
    【转】微信小程序原生代码快速转换mpuve(vue)代码(仅供娱乐)
    goim Go 开发的 IM 和推送服务
    h5 canvas 多张图片合成并保存到手机相册
    netcore中设置环境变量ASPNETCORE_ENVIRONMENT
    Cookie 和 Session 区别是什么?
    python中的字符串格式化输出
    模型训练时样本类别不均衡怎么办?
    NumPy 数组索引、维度增加、拼接
  • 原文地址:https://www.cnblogs.com/xingzheanan/p/14729734.html
Copyright © 2020-2023  润新知