Cgroup and cpuset 详细解析

pi@raspberrypi:/sys/fs/cgroup $ ls blkio cpuacct cpuset freezer net_cls,net_prio perf_event systemd cpu cpu,cpuacct devices net_cls net_prio pids unified pi@raspberrypi:/sys/fs/cgroup $ cat /proc/$$/cgroup 9:blkio:/ 8:freezer:/ 7:pids:/user.slice/user-1000.slice/session-911.scope 6:perf_event:/ 5:net_cls,net_prio:/ 4:cpuset:/ 3:cpu,cpuacct:/ 2:devices:/user.slice 1:name=systemd:/user.slice/user-1000.slice/session-911.scope 0::/user.slice/user-1000.slice/session-911.scope

你看到的是树莓派上启用的 cgroup v1 控制器目录结构,以及当前 shell 进程所属的 cgroup 层级。下面我来逐步解释这些内容。

📁 /sys/fs/cgroup 目录结构

这是 Linux 系统挂载 cgroup 控制器的地方。你看到的这些目录代表不同的资源控制子系统:

控制器名功能说明
cpu控制 CPU 时间分配(调度优先级)
cpuacct记录 CPU 使用情况
cpu,cpuacct联合挂载,常见组合
cpuset控制 CPU 核心和内存节点绑定
blkio控制块设备 I/O(磁盘读写)
devices控制访问设备(如 /dev/null
freezer暂停/恢复进程组
net_cls, net_prio控制网络流量分类和优先级
perf_event控制性能事件访问
pids限制进程数量
systemdsystemd 使用的 cgroup 层级
unifiedcgroup v2 的挂载点(你当前系统主要使用的是 v1)

📄 /proc/$$/cgroup 输出解析

这是当前 shell 进程($$)在各个 cgroup 控制器中的所属路径。每一行格式为:

Code

hierarchy-ID:controller-list:cgroup-path

例如:

Code

3:cpu,cpuacct:/       ← 在 cpu 和 cpuacct 控制器中属于根组
7:pids:/user.slice/user-1000.slice/session-911.scope

🔍 重点解释:

  • user.slice/user-1000.slice/session-911.scope 是 systemd 为用户会话自动创建的 cgroup 层级,用于隔离和管理用户进程。

  • devices:/user.slice 表示该进程在 devices 控制器中属于 user.slice,限制访问某些设备。

  • 0::/user.slice/user-1000.slice/session-911.scope 是 cgroup v2 的路径(如果启用了混合模式),但你当前系统主要使用的是 v1。

🧠 总结:你当前系统的 cgroup 状态

  • ✅ 启用了多个 cgroup v1 控制器(如 CPU、内存、设备等)

  • ✅ 使用 systemd 自动为用户会话创建了隔离的 cgroup 层级

  • ✅ 可能启用了 cgroup v2 的挂载点(unified),但未作为主控制器使用

pi@raspberrypi:/sys/fs/cgroup/cpuset $ ls cgroup.clone_children cpuset.effective_cpus cpuset.memory_pressure cpuset.sched_load_balance cgroup.procs cpuset.effective_mems cpuset.memory_pressure_enabled cpuset.sched_relax_domain_level cgroup.sane_behavior cpuset.mem_exclusive cpuset.memory_spread_page notify_on_release cpuset.cpu_exclusive cpuset.mem_hardwall cpuset.memory_spread_slab release_agent cpuset.cpus cpuset.memory_migrate cpuset.mems tasks

树莓派上 cpuset 控制器的根目录配置文件。这些文件用于控制 CPU 和内存节点的分配策略,主要用于将进程绑定到特定的 CPU 核心和 NUMA 内存节点(虽然树莓派通常没有 NUMA,但这些接口仍然存在)。

下面是对这些文件的详细解释:

🧠 核心概念:cpuset 是什么?

cpuset 是 Linux cgroup 的一个子系统,用于将进程绑定到特定的 CPU 核心和内存节点,从而实现资源隔离和优化性能。

📁 cpuset 目录下的关键文件解释

文件名作用
cpuset.cpus指定该 cgroup 可使用的 CPU 核心(如 0-3 表示 CPU0 到 CPU3)
cpuset.mems指定该 cgroup 可使用的内存节点(树莓派通常只有一个)
cpuset.effective_cpus实际可用的 CPU(考虑继承和限制)
cpuset.effective_mems实际可用的内存节点
cpuset.cpu_exclusive是否独占 CPU(1 表示该组独占指定 CPU)
cpuset.mem_exclusive是否独占内存节点
cpuset.mem_hardwall是否强制进程只能访问指定内存节点
cpuset.memory_migrate是否允许迁移内存页到指定节点
cpuset.memory_pressure当前内存压力(只读)
cpuset.memory_pressure_enabled是否启用内存压力监控
cpuset.memory_spread_page是否在多个节点间分散页面分配
cpuset.memory_spread_slab是否在多个节点间分散 slab 分配
cpuset.sched_load_balance是否允许调度器在该组内负载均衡
cpuset.sched_relax_domain_level控制调度器的域级别放松策略(高级调度参数)

📄 与进程相关的文件

文件名说明
cgroup.procs当前属于该 cpuset 的进程 PID 列表
taskscgroup.procs 类似,但包含线程级别信息
cgroup.clone_children是否允许子 cgroup 继承父配置
cgroup.sane_behavior是否启用“安全行为”模式(防止不一致配置)
notify_on_release当 cgroup 被释放时是否通知
release_agent指定释放时调用的脚本路径(很少使用)

🧪 示例:绑定进程到 CPU0

bash

# 创建一个新的 cpuset 组
sudo mkdir /sys/fs/cgroup/cpuset/mygroup

# 设置 CPU 和内存节点
echo 0 | sudo tee /sys/fs/cgroup/cpuset/mygroup/cpuset.cpus
echo 0 | sudo tee /sys/fs/cgroup/cpuset/mygroup/cpuset.mems

# 将当前 shell 加入该组
echo $$ | sudo tee /sys/fs/cgroup/cpuset/mygroup/cgroup.procs

这样你就把当前 shell 限制在 CPU0 上运行了。

✅ 总结

  • cpuset 控制器用于绑定 CPU 和内存资源

  • 每个配置文件控制一个方面的资源分配或行为

  • 你可以创建子组并将进程加入其中,实现资源隔离

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值