Red Hat Training

A Red Hat training course is available for Red Hat Linux

A.4. cpuset

cpuset 子系统可以为 cgroup 分配独立 CPU 和内存节点。可根据以下参数来设定 cpuset,每个参数都在 cgroup 虚拟文件系统的一个单独 “伪文件” 里:

重要

一些子系统有强制参数,在您将任务移至使用这些子系统的 cgroup 中之前,这些参数必须被设定。 例如,一个使用 cpuset 子系统的 cgroup, 在您将任务移至此 cgroup 前,cpuset.cpuscpuset.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 进行直接负载平衡