Kubernetes - Cgroups
Namespace
隔离不完备
- 在 Linux 内核中,有很多资源和对象是
不能被 Namespace 化
的,例如时间
- 如果在
容器
中使用settimeofday(2)
的系统调用,整个宿主机
的时间都会被修改
Cgroups
在 Linux 中,Cgroups 暴露给用户的操作接口是
文件系统
1 | $ mount -t cgroup |
限制不完善
- Linux 的
/proc
目录存储的是记录当前内核运行状态
的一系列特殊文件(top 指令的数据来源) - 如果在容器内执行 top 指令,使用的是宿主上的数据
- 原因:
/proc
文件系统不了解 Cgroups 限制的存在
- 原因:
Shell
创建一个 Cgroup,默认没有任何限制
1 | $ sudo mkdir container |
运行计算密集的程序,可以吃满 CPU 到 100 %
1 | $ while : ; do : ; done & |
新增限制,被该 Cgroup 限制的进程只能使用 20% 的 CPU 带宽
1 | $ echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us |
将进程加入到被限制列表,CPU 使用率会降到 20%
1 | $ echo 396244 > /sys/fs/cgroup/cpu/container/tasks |
Docker
启动时设置
cpu-period
和cpu-quota
1 | $ docker run -it --cpu-period=100000 --cpu-quota=10000 ubuntu /bin/bash |
查看对应的 Cgroup
1 | $ ls /sys/fs/cgroup/cpu/system.slice/docker-685b0945f445ac9ee177ecea45560b1971c1ec6e5b4bd9886f725c55258ff30e.scope |
同样在容器内运行一个计算密集型的程序
1 | $ docker run -it --cpu-period=100000 --cpu-quota=10000 ubuntu /bin/bash |
1 | $ docker inspect --format='{{.State.Pid}}' 685b0945f445 |
在容器内执行 top ,与宿主机看到的视图相近
1 | $ docker exec -it 685b0945f445 sh |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.