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: 2GB

v2 与我们的生活: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
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部