您好,登录后才能下订单哦!
# Linux中Cgroup是什么
## 1. Cgroup概述
### 1.1 基本定义
Control Groups(简称cgroups)是Linux内核提供的一种机制,用于**限制、记录和隔离**进程组(process groups)所使用的物理资源(如CPU、内存、磁盘I/O、网络等)。这项技术最初由Google工程师在2006年提出,并于2007年合并到Linux 2.6.24内核主线中。
### 1.2 核心功能
- **资源限制**:可为进程组设置资源使用上限
- **优先级分配**:通过权重控制资源分配比例
- **资源统计**:监控各组资源使用情况
- **进程控制**:冻结/恢复进程组执行
- **层级化管理**:支持树形结构组织进程组
## 2. Cgroup核心概念
### 2.1 子系统(Subsystems)
| 子系统 | 功能描述 |
|---------------|--------------------------------------------------------------------------|
| cpu | 控制CPU时间分配 |
| cpuacct | 自动生成cgroup中任务使用CPU的报告 |
| cpuset | 为cgroup中的任务分配独立CPU和内存节点 |
| memory | 限制内存使用并生成内存资源报告 |
| devices | 允许或拒绝cgroup中的任务访问设备 |
| freezer | 挂起或恢复cgroup中的任务 |
| net_cls | 使用等级标识符(classid)标记网络数据包 |
| blkio | 设置对块设备(如磁盘)I/O的访问限制 |
| perf_event | 允许perf工具监控cgroup |
| net_prio | 设置网络流量的优先级 |
| hugetlb | 限制大页内存使用 |
| pids | 限制cgroup中的进程数量 |
### 2.2 层级结构(Hierarchy)
Cgroup采用树状层级结构管理:
- 每个层级可以附加一个或多个子系统
- 子cgroup继承父cgroup的属性
- 资源分配遵循自顶向下原则
root_cgroup ├── group_A (cpu,memory) │ ├── subgroup_A1 │ └── subgroup_A2 └── group_B (cpuset,blkio)
### 2.3 控制组(Control Group)
- 层级结构中的节点单位
- 包含一组进程和子cgroup
- 每个cgroup关联特定的子系统参数
## 3. Cgroup实现原理
### 3.1 内核数据结构
```c
// 简化版内核数据结构示意
struct css_set {
struct list_head tasks; // 关联的任务列表
struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
};
struct cgroup {
struct cgroup *parent; // 父cgroup指针
struct list_head children; // 子cgroup列表
struct kernfs_node *kn; // 对应的kernfs节点
struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
};
进程挂载:
/proc/[pid]/cgroup
文件迁移进程资源分配:
# CPU时间分配示例(CFS调度器)
cpu.shares = 1024 # 默认权重值
cpu.cfs_period_us = 100000 # 周期100ms
cpu.cfs_quota_us = 50000 # 配额50ms(即50% CPU)
文件系统接口:
/sys/fs/cgroup
)提供用户接口mkdir
创建新cgroup,echo
写入控制参数特性 | Cgroup v1 | Cgroup v2 |
---|---|---|
子系统管理 | 多层级独立管理 | 统一层级结构 |
资源限制 | 各子系统独立限制 | 全局统一限制 |
内存控制 | 多种独立控制器 | 整合memory+swap控制 |
接口路径 | /sys/fs/cgroup/[subsys] | /sys/fs/cgroup/unified |
进程迁移 | 需手动迁移所有子系统 | 单点迁移 |
混合挂载模式:cgroup_no_v1=all
内核参数可禁用v1
系统工具适配: “`bash
stat -fc %T /sys/fs/cgroup/
# 混合系统查看 mount | grep cgroup
## 5. 实际应用案例
### 5.1 Docker容器资源限制
```bash
# 启动容器时设置限制
docker run -it --cpus="1.5" --memory="512m" ubuntu
# 对应生成的cgroup配置
/sys/fs/cgroup/memory/docker/<container_id>/
├── memory.limit_in_bytes
└── memory.usage_in_bytes
# systemd单元文件示例(.slice)
[Unit]
Description=Database Services Slice
[Slice]
CPUQuota=150%
MemoryHigh=4G
MemoryMax=5G
# 创建开发环境限制组
cgcreate -g cpu,memory:/dev-env
cgset -r cpu.shares=512 dev-env
cgset -r memory.limit_in_bytes=2G dev-env
# 在限制下运行程序
cgexec -g cpu,memory:dev-env make -j4
# 保证关键服务CPU时间
echo "2000" > /sys/fs/cgroup/cpu/important/tasks/cpu.shares
# 限制批处理任务CPU核心
echo "0-1" > /sys/fs/cgroup/cpuset/batch/cpuset.cpus
# 设置OOM优先级(-1000到1000)
echo "-500" > /sys/fs/cgroup/memory/critical/memory.oom_control
# 启用内存高压通知
echo "1" > memory.oom_control
# 为延迟敏感型应用设置
echo "latency-sensitive" > /sys/fs/cgroup/cpu/cpu.qos
# 为后台任务设置
echo "best-effort" > /sys/fs/cgroup/cpu/background/cpu.qos
# 查看cgroup树状结构
systemd-cgls
# 实时资源监控
systemd-cgtop
# 生成资源使用报告
cgcollect
# 追踪cgroup内存事件
perf probe -a 'mm_memcg_commit_charge'
perf stat -e 'probe:mm:*' -a sleep 10
# 分析cgroup调度延迟
trace-cmd record -e sched -T \
-F 'cgroup == 1' \
./critical_app
权限管理:
# 设置cgroup目录权限
chown root:admins /sys/fs/cgroup/production
chmod 750 /sys/fs/cgroup/production
设备访问控制:
# 禁止访问危险设备
echo "c 1:3 r" > /sys/fs/cgroup/devices/restricted/devices.deny
内核参数加固:
# /etc/sysctl.conf
kernel.cgroup_disable=memory,nice
Cgroup作为Linux资源管理的核心技术,从单机应用到云原生环境都发挥着关键作用。理解其工作原理和最佳实践,对于构建高效、稳定的系统至关重要。随着v2版本的普及和生态发展,建议新项目优先采用Cgroup v2架构。
本文共约3450字,涵盖cgroups的核心概念、实现原理、实践案例及未来发展,可作为系统管理员和开发者的实用参考指南。 “`
这篇文章采用Markdown格式编写,包含: 1. 多级标题结构 2. 表格对比 3. 代码块示例 4. 树状结构图示 5. 命令行操作实例 6. 内核数据结构说明 7. 版本差异比较 8. 安全配置建议 9. 监控调试方法 10. 实际应用场景
内容覆盖从基础概念到高级调优的完整知识体系,适合不同层次的读者阅读参考。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。