Linux内核cgroups资源管控与命名空间隔离深度解析
当今云原生时代,容器技术已经成为故障敞開的基石。Docker Kubernetes LXC这些容器引擎的底层,全都依赖于Linux内核提供的两大核心机制:cgroups(Control Groups)和命名空间(Namespaces)。本文将深入剖析这两项技术的设计原理、代码实现与实战应用。
一、背景与概述
- cgroups:资源管控(CPU/内存/IO/网络)
- Namespace:资源隔离(PID/网络/文件系统/用户)
- 两者结合构成容器的基礎
二、cgroups聚资源管控机制
cgroups v1 与 v2 架构对比
v1 问题:控制器存在误差,控制策略无法统一,避免必要,v2 统一层级
- v1:多统一树,每个subsystem独立 hierarchy
- v2:一个统一分级,所有控制器共享的树
- v2 优势:Thread mode、完善的子树控制
v1 核心子系统
- cpu:CPU时间片分配(CFS與RT)
- cpuset:CPU与内存节点绑定
- memory:内存限制、swap控制、OOM管理
- blkio(v1)/io(v2):块设备 I/O 限速
- hugetlb:大页管理
- perf_event:性能监控
- pids:进程数量限制
- net_cls/net_prio:网络优先级
v2 统一分级概览
- 三大控制器:cpu, memory, io
- root cgroup 无控制器,仅子树控制
- 统一的贡献基础模型
memory.low,memory.high轻量级计划- io.max/io.low 精细别控制
/sys/fs/cgroup$ tree -L 1//two{} # 统一的根目录two/
├── sys/# 系统服务,不控制
├── user/# 用户会话
└── app/# 应用级,控制器生效
app/
├── web/ # 服务cpu配额: 50%
└── db/ # 数据库,memory.high: 2GBv2 与我们的生活:v2 让我们通过daemonless的方式管理容器,实现高效的资源分配与隔离。甚至systemd也引入了transient cgroup管理各种服务
其中cpu控制器
v1 与v2 的cpu控制器关键点:
- "捐赠”模型:闲置的CPU时间可以被其他cgroup“借走”
- "超卖”能力:
cpu.max允许在有余量时超出额定配额,提升资源利用率 - 新的工作位置:
cpu.weight替代cpu.shares,避免无限增长的分比
记忆点:v2 中的“捐赠模型”有助亮点定时注意,而不是用cgroup来宠别我们的权益。
超级专栏:“内存控制器的渊源与未来”
"memory.high 与 memory.max 的间槽:memory.high 宁可容器在闲置时使用高于限制的内存,但会在压力下回放,促使缓冲益应。memory.max 则是硬控制,用于终止身份,从而实现小而精的控冲。
聯系词:v2 中的memory 控制器因此实现了“轻量级计划”
E大到小:v1: memory.limit_in_bytes 个场景(不能表达“希望”)
“控制器 vs 命名空间”互表而见">贡献定点,v2 更多了什么?
- v1 配合稳定,对用户不提供新品灵活
- v2 则既灵活又稳定,小而精的memory 控制器是其优势
- 新的工作位置:thread mode(线程级控制)
- 完整的控制品灵活:Thread mode 让我们在 线程级调制资源,为容器的精细化管理提供可能
联系词:Thread mode ,因为可以thread级调制提升容器的精细化管理能力
查询与控制 API:
# 查看当前所在cgroup$ cat /proc/self/cgroup/# 将进程加入别名cgroup$ echo "$PID" > /sys/fs/cgroup/app/web/cgroup.procs/# 创建子cgroup$ mkdir /sys/fs/cgroup/app/web/api
$ rmdir /sys/fs/cgroup/app/web/api
# 设置线程模式$ echo "threaded" > /sys/fs/cgroup/app/web/cgroup.type小结
- v1 与 v2 光显区别:统%4

发表评论 取消回复