A.4. cpuset
cpuset
子系统可以为 cgroup 分配独立 CPU 和内存节点。可根据以下参数来设定 cpuset,每个参数都在 cgroup 虚拟文件系统的一个单独 “伪文件” 里:
重要
一些子系统有强制参数,在您将任务移至使用这些子系统的 cgroup 中之前,这些参数必须被设定。 例如,一个使用
cpuset
子系统的 cgroup, 在您将任务移至此 cgroup 前,cpuset.cpus
和 cpuset.mems
参数必须被设定。
- cpuset.cpus(强制)
- 设定该 cgroup 任务可以访问的 CPU。这是一个逗号分隔列表,格式为 ASCII,小横线("
-
")代表范围。例如:0-2,16
表示 CPU 0、1、2 和 16。 - cpuset.mems(强制)
- 设定该 cgroup 中任务可以访问的内存节点。这是一个逗号分隔列表,格式为 ASCII,小横线("
-
")代表范围。例如:0-2,16
表示内存节点 0、1、2 和 16。 - cpuset.memory_migrate
- 包含一个标签(
0
或者1
),用来指定当cpuset.mems
的值更改时,是否应该将内存中的页迁移到新节点。默认情况下禁止内存迁移(0
)且页就保留在原来分配的节点中,即使此节点不再是cpuset.mems
指定的节点。如果启用(1
),系统会将页迁移到cpuset.mems
指定的新参数的内存节点中,如果可能的话会保留其相对位置。例如:如果页位于cpuset.mems
指定列表的第二个节点中,现在页将会重新分配到cpuset.mems
指定列表的第二个节点中,如果这个位置是可用的。 - cpuset.cpu_exclusive
- 包含标签(
0
或者1
),它可以指定:其它 cpuset 及其父、子 cpuset 是否可共享该 cpuset 的特定 CPU。默认情况下(0
),CPU 不会专门分配给某个 cpuset 。 - cpuset.mem_exclusive
- 包含标签(
0
或者1
),它可以指定:其它 cpuset 是否可共享该 cpuset 的特定内存节点。默认情况下(0
),内存节点不会专门分配给某个 cpuset 。为某个 cpuset 保留其专用内存节点(1
)与使用cpuset.mem_hardwall
参数启用内存 hardwall 功能是一样的。 - cpuset.mem_hardwall
- 包含标签(
0
或者1
),它可以指定:内存页和缓冲数据的 kernel 分配是否受到 cpuset 特定内存节点的限制。默认情况下0
,页面和缓冲数据在多用户进程间共享。启用 hardwall 时(1
)每个任务的用户分配可以保持独立。 - cpuset.memory_pressure
- 一份只读文件,包含该 cpuset 进程生成的“内存压力”运行平均。启用
cpuset.memory_pressure_enabled
时,该伪文件中的值会自动更新,除非伪文件包含0
值。 - cpuset.memory_pressure_enabled
- 包含标签(
0
或者1
),它可以设定系统是否计算该 cgroup 进程生成的“内存压力”。计算出的值会输出到cpuset.memory_pressure
,代表进程试图释放被占用内存的速率,报告值为:每秒尝试回收内存的整数值再乘以 1000。 - cpuset.memory_spread_page
- 包含标签(
0
或者1
),它可以设定文件系统缓冲是否应在该 cpuset 的内存节点中均匀分布。默认情况下0
,系统不会为这些缓冲平均分配内存页面,缓冲被置于生成缓冲的进程所运行的同一节点中。 - cpuset.memory_spread_slab
- 包含标签(
0
或者1
),它可以设定是否在 cpuset 间平均分配用于文件输入 / 输出操作的 kernel 高速缓存板。默认情况下0
,kernel 高速缓存板不被平均分配,高速缓存板被置于生成它们的进程所运行的同一节点中。 - cpuset.sched_load_balance
- 包含标签(
0
或者1
),它可以设定 kernel 是否在该 cpuset 的 CPU 中平衡负载。默认情况下1
,kernel 将超载 CPU 中的进程移动到负载较低的 CPU 中以便平衡负载。请注意:如果任意一个父 cgroup 启用负载平衡,那么在 cgroup 中设定这个标签将没有任何效果,因为负载平衡已在更高层级中运行。因此,要禁用 cgroup 中的负载平衡,则层级中的每一个父 cgroup 负载平衡都要禁用。这里您还应该考虑是否在所有平级 cgroup 中启用负载平衡。 - cpuset.sched_relax_domain_level
- 包含
-1
到一个小正数间的整数,它代表 kernel 应尝试平衡负载的 CPU 宽度范围。如果禁用cpuset.sched_load_balance
,则该值无意义。根据不同系统构架,这个值的具体效果不同,但以下值是常用的:cpuset.sched_relax_domain_level 值值 效果 -1
平衡负载的系统默认值 0
不执行直接负载平衡;负载平衡只是阶段性的 1
对同一核中的线程进行直接负载平衡 2
对同一软件包中的线程进行直接负载平衡 3
对同一节点或者扇叶中的线程进行直接负载平衡 4
对不使用统一内存访问(NUMA)构架中的多个 CPU 进行直接负载平衡 5
对使用统一内存访问(NUMA)构架中的多个 CPU 进行直接负载平衡