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

posted @ 2021-05-04 16:30  lubanseven  阅读(191)  评论(0编辑  收藏  举报