3.4. cpuset
cpuset
子系统为 cgroup 分配独立 CPU 和内存节点。可根据用以下参数指定每个 cpuset,每个参数都在控制组群虚拟文件系统中有单独的伪文件:
重要
有些子系统拥有强制参数,您在可以将任务移动到使用那些子系统的 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
- 包含用来指定当
cpuset.mems
中的值更改时是否应该将内存中的页迁移到新节点的标签(0
或者1
)。默认情况下禁止内存迁移(0
)且页就保留在原来分配的节点中,即使在cpuset.mems
中现已不再指定这个节点。如果启用(1
),则该系统会将页迁移到由cpuset.mems
指定的新参数中的内存节点中,可能的情况下保留其相对位置 - 例如:原来由cpuset.mems
指定的列表中第二个节点中的页将会重新分配给现在由cpuset.mems
指定的列表的第二个节点中,如果这个位置是可用的。 - cpuset.cpu_exclusive
- 包含指定是否其它 cpuset 及其上、下级族群可共享为这个 cpuset 指定的 CPU 的标签(
0
或者1
)。默认情况下(0
)CPU 不是专门分配给某个 cpuset 的。 - cpuset.mem_exclusive
- 包含指定是否其它 cpuset 可共享为这个 cpuset 指定的内存节点的标签(
0
或者1
)。默认情况下(0
)内存节点不是专门分配给某个 cpuset 的。专门为某个 cpuset 保留内存节点(1
)与使用cpuset.mem_hardwall
启用内存 hardwall 功能是一致的。 - cpuset.mem_hardwall
- 包含指定是否应将内存页面的内核分配限制在为这个 cpuset 指定的内存节点的标签(
0
或者1
)。默认情况下为0
,属于多个用户的进程共享页面和缓冲。启用 hardwall 时(1
)每个任务的用户分配应保持独立。 - cpuset.memory_pressure
- 包含运行在这个 cpuset 中产生的平均内存压力的只读文件。启用
cpuset.memory_pressure_enabled
时,这个伪文件中的值会自动更新,否则伪文件包含的值为0
。 - cpuset.memory_pressure_enabled
- 包含指定系统是否应该计算这个 cgroup 中进程所生成内存压力的标签(
0
或者1
)。计算出的值会输出到cpuset.memory_pressure
,且代表进程试图释放使用中内存的比例,报告为尝试每秒再生内存的整数值再乘 1000。 - cpuset.memory_spread_page
- 包含指定是否应将文件系统缓冲平均分配给这个 cpuset 的内存节点的标签(
0
或者1
)。默认情况为0
,不尝试为这些缓冲平均分配内存页面,且将缓冲放置在运行生成缓冲的进程的同一节点中。 - cpuset.memory_spread_slab
- 包含指定是否应在 cpuset 间平均分配用于文件输入/输出操作的内核缓存板的标签(
0
或者1
)。默认情况是0
,即不尝试平均分配内核缓存板,并将缓存板放在生成这些缓存的进程所运行的同一节点中。 - cpuset.sched_load_balance
- 包含指定是否在这个 cpuset 中跨 CPU 平衡负载内核的标签(
0
或者1
)。默认情况是1
,即内核将超载 CPU 中的进程移动到负载较低的 CPU 中以便平衡负载。请注意:如果在任意上级 cgroup 中启用负载平衡,则在 cgroup 中设定这个标签没有任何效果,因为已经在较高一级 cgroup 中处理了负载平衡。因此,要在 cgroup 中禁用负载平衡,还要在该层级的每一个上级 cgroup 中禁用负载平衡。这里您还应该考虑是否应在所有平级 cgroup 中启用负载平衡。 - cpuset.sched_relax_domain_level
- 包含
-1
到小正数间的整数,它代表内核应尝试平衡负载的 CPU 宽度范围。如果禁用了cpuset.sched_load_balance
,则该值毫无意义。根据不同系统构架这个值的具体效果不同,但以下值是常用的:cpuset.sched_relax_domain_level 值值 效果 -1
为负载平衡使用系统默认值 0
不执行直接负载平衡;负载平衡只是阶段性的 1
在同一核中的跨线程直接负载平衡 2
在同一软件包中的跨线程直接负载平衡 3
在同一节点或者刀片中的跨线程直接负载平衡 4
在不使用统一内存访问(NUMA)构架中跨多个 CPU 的直接负载平衡 5
在使用统一内存访问(NUMA)构架中跨多个 CPU 的直接负载平衡