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 | 限制进程数量 |
systemd | systemd 使用的 cgroup 层级 |
unified | cgroup 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 列表 |
tasks | 与 cgroup.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 和内存资源 -
每个配置文件控制一个方面的资源分配或行为
-
你可以创建子组并将进程加入其中,实现资源隔离
1601

被折叠的 条评论
为什么被折叠?



