Linux中Cgroup是什么

发布时间:2022-02-19 11:36:58 作者:小新
来源:亿速云 阅读:278
# 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];
};

3.2 关键机制

  1. 进程挂载

    • 进程创建时继承父进程的css_set
    • 可通过写入/proc/[pid]/cgroup文件迁移进程
  2. 资源分配

    # CPU时间分配示例(CFS调度器)
    cpu.shares = 1024  # 默认权重值
    cpu.cfs_period_us = 100000  # 周期100ms
    cpu.cfs_quota_us = 50000    # 配额50ms(即50% CPU)
    
  3. 文件系统接口

    • 通过虚拟文件系统(通常挂载在/sys/fs/cgroup)提供用户接口
    • 支持mkdir创建新cgroup,echo写入控制参数

4. Cgroup版本演进

4.1 Cgroup v1 vs v2主要区别

特性 Cgroup v1 Cgroup v2
子系统管理 多层级独立管理 统一层级结构
资源限制 各子系统独立限制 全局统一限制
内存控制 多种独立控制器 整合memory+swap控制
接口路径 /sys/fs/cgroup/[subsys] /sys/fs/cgroup/unified
进程迁移 需手动迁移所有子系统 单点迁移

4.2 兼容性处理

# 混合系统查看 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

5.2 系统服务隔离

# systemd单元文件示例(.slice)
[Unit]
Description=Database Services Slice

[Slice]
CPUQuota=150%
MemoryHigh=4G
MemoryMax=5G

5.3 自定义应用限制

# 创建开发环境限制组
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

6. 性能调优实践

6.1 CPU分配策略

# 保证关键服务CPU时间
echo "2000" > /sys/fs/cgroup/cpu/important/tasks/cpu.shares

# 限制批处理任务CPU核心
echo "0-1" > /sys/fs/cgroup/cpuset/batch/cpuset.cpus

6.2 内存OOM防护

# 设置OOM优先级(-1000到1000)
echo "-500" > /sys/fs/cgroup/memory/critical/memory.oom_control

# 启用内存高压通知
echo "1" > memory.oom_control

6.3 混合部署优化

# 为延迟敏感型应用设置
echo "latency-sensitive" > /sys/fs/cgroup/cpu/cpu.qos

# 为后台任务设置
echo "best-effort" > /sys/fs/cgroup/cpu/background/cpu.qos

7. 监控与调试

7.1 常用监控工具

# 查看cgroup树状结构
systemd-cgls

# 实时资源监控
systemd-cgtop

# 生成资源使用报告
cgcollect

7.2 性能分析示例

# 追踪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

8. 安全注意事项

  1. 权限管理

    # 设置cgroup目录权限
    chown root:admins /sys/fs/cgroup/production
    chmod 750 /sys/fs/cgroup/production
    
  2. 设备访问控制

    # 禁止访问危险设备
    echo "c 1:3 r" > /sys/fs/cgroup/devices/restricted/devices.deny
    
  3. 内核参数加固

    # /etc/sysctl.conf
    kernel.cgroup_disable=memory,nice
    

9. 未来发展趋势

  1. 统一层级深化:更多子系统向v2迁移
  2. 云原生集成:与Kubernetes深度整合
  3. 硬件感知调度:NUMA/GPU等新硬件支持
  4. 动态资源调整:基于的自动伸缩

10. 总结

Cgroup作为Linux资源管理的核心技术,从单机应用到云原生环境都发挥着关键作用。理解其工作原理和最佳实践,对于构建高效、稳定的系统至关重要。随着v2版本的普及和生态发展,建议新项目优先采用Cgroup v2架构。

本文共约3450字,涵盖cgroups的核心概念、实现原理、实践案例及未来发展,可作为系统管理员和开发者的实用参考指南。 “`

这篇文章采用Markdown格式编写,包含: 1. 多级标题结构 2. 表格对比 3. 代码块示例 4. 树状结构图示 5. 命令行操作实例 6. 内核数据结构说明 7. 版本差异比较 8. 安全配置建议 9. 监控调试方法 10. 实际应用场景

内容覆盖从基础概念到高级调优的完整知识体系,适合不同层次的读者阅读参考。

推荐阅读:
  1. Docker——Cgroup资源限制
  2. cgroup在ceph中如何安装使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux cgroup

上一篇:如何使用Linux的xhost命令

下一篇:Tmux终端命令有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》