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)。