cpuset
是 Linux 内核中 cgroup(控制组) 的一个子系统,用于将一组进程(或任务)绑定到特定的 CPU 核心和 内存节点(NUMA 节点)上运行。它通过限制进程的 CPU 和内存资源的使用范围,优化系统性能(如减少缓存失效、提高 NUMA 本地性)或实现资源隔离(如容器场景)。
1. 核心功能
-
CPU 绑定
将进程限制在指定的 CPU 核心(或超线程)上运行,避免跨核心的上下文切换,提高缓存利用率。 -
内存节点绑定
在 NUMA 架构中,将进程的内存分配限制在指定的 NUMA 节点,减少跨节点访问内存的延迟。 -
动态迁移控制
允许或禁止进程在绑定 CPU 核心之间迁移。
2. 关键配置参数
在 cgroup 的 cpuset
子系统中,通过以下文件配置资源范围:
文件 | 作用 |
---|---|
cpuset.cpus | 指定允许使用的 CPU 核心列表(如 0-3 、1,5 )。 |
cpuset.mems | 指定允许使用的内存节点(NUMA 节点)列表(如 0 、0-1 )。 |
cpuset.cpu_exclusive | 是否独占 CPU 核心(其他 cgroup 不能使用相同的 CPU)。 |
cpuset.mem_exclusive | 是否独占内存节点(其他 cgroup 不能使用相同的内存节点)。 |
cpuset.memory_migrate | 当内存节点不可用时,是否自动迁移进程的内存到新节点。 |
cpuset.sched_load_balance | 是否允许内核在这些 CPU 上执行负载均衡(默认允许)。 |
3. 使用场景
-
容器资源隔离
在 Docker、Kubernetes 等容器平台中,通过cpuset
限制容器只能使用指定的 CPU 核心和内存节点,避免资源争抢。docker run --cpuset-cpus="0-3" --cpuset-mems="0" my_container
-
高性能计算
将计算密集型任务绑定到专用 CPU 核心,减少上下文切换开销,提高缓存命中率。 -
NUMA 优化
在 NUMA 架构服务器中,将进程及其内存分配到同一 NUMA 节点,降低内存访问延迟。
4. 配置示例
1. 手动配置 cgroup
# 创建 cgroup
mkdir /sys/fs/cgroup/cpuset/my_group# 分配 CPU 0-3 和内存节点 0
echo 0-3 > /sys/fs/cgroup/cpuset/my_group/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/my_group/cpuset.mems# 禁止负载均衡(专用核心)
echo 0 > /sys/fs/cgroup/cpuset/my_group/cpuset.sched_load_balance# 将进程 PID 1234 加入该 cgroup
echo 1234 > /sys/fs/cgroup/cpuset/my_group/tasks
2. 通过 systemd
配置
在 systemd 服务文件中添加:
[Service]
CPUAffinity=0-3
AllowedCPUs=0-3
AllowedMemoryNodes=0
5. 注意事项
- 父子 cgroup 继承性:子 cgroup 的 CPU 和内存范围不能超出父 cgroup 的范围。
- 默认值:如果未设置
cpuset.mems
,进程可能无法分配内存。 - 动态迁移:若允许迁移(
cpuset.memory_migrate=1
),进程内存可能被迁移到新节点,但可能引入延迟。
6. cpuset vs cpu 子系统
cpuset
:控制进程在哪些物理 CPU 核心和内存节点上运行。cpu
:控制进程的 CPU 时间分配(通过 CFS 或实时调度策略)。
通过 cpuset
,可以精细控制进程的物理资源位置,尤其适合对性能敏感或需要严格隔离的场景(如容器、虚拟化、HPC)。