Linux Cgroups(Control Groups) 的系统化学习内容,分为 5 节课 ,从基础概念到实战调优,逐步深入,最终能够 理解 Cgroups 原理、掌握实际使用、分析性能问题并在容器环境中排错。
Linux Cgroups 学习
目标
- 理解 Linux Cgroups 的设计目的和工作机制
- 掌握 Cgroups v1 和 v2 的使用方法及差异
- 能够限制、隔离和监控进程的 CPU、内存、IO、网络等资源
- 掌握 Cgroups 与容器技术(Docker、Kubernetes)的关系
- 学会使用 Cgroups 定位性能问题、排查资源争用
课程安排
课时 | 主题 | 目标 | 主要内容 | 实验/练习 |
---|---|---|---|---|
第 1 节:Cgroups 基础与核心概念 | 了解 Cgroups 的基本理论和 Linux 系统结构 | 认识 Cgroups 的作用和场景 | - Cgroups 的历史:从 v1 到 v2- 为什么需要 Cgroups(进程资源隔离问题)- Cgroups 与进程树(task 和 cgroup 关系)- Cgroups 关键概念:hierarchy、subsystem、controller- 系统目录结构 /sys/fs/cgroup/ |
- 查看当前系统的 Cgroups 层级结构- 使用 cat /proc/self/cgroup 检查当前进程所属的 cgroup |
第 2 节:Cgroups v1 vs v2 深入理解 | 掌握 v1 和 v2 设计区别与实际配置 | 能够在系统上正确区分并操作两种模式 | - v1 的多 hierarchy 设计及缺陷- v2 的 unified hierarchy 模式- Cgroups v2 新特性(delegation、controller统一)- 如何在 Linux 启用 Cgroups v2:kernel cmdline 设置 systemd.unified_cgroup_hierarchy=1 - cgroup.controllers 、cgroup.subtree_control |
- 在虚拟机切换 v1/v2 模式- 使用 v2 创建简单的资源限制(CPU/Memory) |
第 3 节:CPU、Memory、IO 资源管理 | 掌握常见 controller 的配置 | 能够限制和隔离应用资源 | - CPU Controller:cpu.shares 、cpu.max 、调度策略- Memory Controller:memory.max 、memory.swap.max 、OOM 行为- IO Controller:io.max 、blkio.throttle - 网络和 PID 限制- 配置文件及动态修改 |
- 限制某进程只使用 1 核 CPU 50% 时间片- 限制某进程最大内存 512MB- 观察内存 OOM 日志 |
第 4 节:Cgroups 与容器(Docker/K8s) | 理解容器与 Cgroups 的关系 | 学会查看容器资源配置 | - 容器技术三大核心:Namespace + Cgroups + RootFS- Docker 如何利用 Cgroups 限制容器资源- Kubernetes Pod QoS 及资源限制- 使用 docker inspect / kubectl describe 解析 cgroup 配置- 常见资源异常问题分析 |
- 在 Docker 容器设置 --cpus=1 、--memory=512m - Kubernetes Pod 资源 request/limit 演示 |
第 5 节:性能监控与问题排查 | 掌握如何基于 Cgroups 做性能监控和问题定位 | 能够排查资源瓶颈 | - 使用 systemd-cgtop 和 cgroupstat 监控- 分析 CPU 饥饿与内存 OOM Root Cause- 常见问题案例: - 某进程 CPU 100% 导致其他 Pod 变慢 - 内存泄露导致 OOMKill - IO 阻塞导致吞吐下降- 自动化脚本与告警 |
- 模拟内存泄露进程,观察 memory.current 与 OOM 日志- 使用 perf 结合 cgroup 采样性能热点 |
扩展学习
方向 | 相关工具 |
---|---|
性能调优 | perf , bcc , eBPF |
容器管理 | Kubernetes , containerd |
自动化监控 | Prometheus , cAdvisor |
内核源码 | kernel/sched , kernel/cgroup |
最终效果
学完本课程后,能够:
- 理解 Cgroups 原理与设计思想
- 实操 限制 CPU/Memory/IO 资源
- 分析 Kubernetes/Docker 容器资源问题
- 优化 系统和容器的性能
- 调试 复杂场景,如 OOM、CPU 饥饿、IO 瓶颈