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 进行直接负载平衡 |
cpuset调用sched_setaffinity来设置进程的cpu亲和性,调用mbind和set_mempolicy来设置内存的亲和性。可以通过查看/proc/$pid/status查看当前进程cpu和mem的亲和性。cpuset使用中应该遵循以下3点
- 子cpuset的cpu和memory node必须是父cgoup的子集
- 除非父cgroup标记了exclusive,否则子cgoup无法标记该flag
- 如果cgroup的cpu或memory标记了exclusive,那么该cgroup的cpu不能与兄弟cgroup有重合,且父子之间必须重合(参见第一条)
如下例中,在/sys/fs/cgroup/cpuset中创建2个cgroup,按照如下步骤,可以看出,当test1和test2有重合时,设置cpuset失败
# rmdir test1 [root@ cpuset]# mkdir test1 [root@ cpuset]# mkdir test2 [root@ cpuset]# echo 1 > test1/cpuset.cpu_exclusive [root@ cpuset]# echo 1 > test2/cpuset.cpu_exclusive [root@ cpuset]# echo 0,1 > test1/cpuset.cpus [root@ cpuset]# echo 1,2 > test2/cpuset.cpus -bash: echo: write error: Invalid argument [root@ cpuset]# echo 2 > test2/cpuset.cpus
cpuset.cpu_exclusive:包含标签(0
或者 1
),它可以指定:其它 cpuset 及其父、子 cpuset 是否可共享该 cpuset 的特定 CPU。默认情况下(0
),CPU 不会专门分配给某个 cpuset 。
上面介绍了设置该标志后兄弟cpuset之间的cpuset.cpus不能有重合,但父子cpuset之间是必须重合的。cpu_exclusive标记并不能实现完全的cpu隔离(不隶属于cgroup管辖的进程默认拥有所有的cpu权限),如下例中启动了6个消耗cpu的bash进程,仅对其中一个bash进程进行了cpuset的exclusive,可以看到exclusive并不能保证cpu的隔离,只用于保证不于其他兄弟cpuset定义的cpus重叠。核隔离可以使用内核启动参数isolcpus,隔离的cpu不会对其进行负载均衡操作。
Tasks: 243 total, 7 running, 236 sleeping, 0 stopped, 0 zombie %Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu2 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 : 99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 995896 total, 68208 free, 654032 used, 273656 buff/cache KiB Swap: 2097148 total, 1928188 free, 168960 used. 92388 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 74809 root 20 0 116652 3300 1656 R 86.0 0.3 1:27.86 bash 74753 root 20 0 116652 3300 1656 R 66.4 0.3 1:57.41 bash 74890 root 20 0 116652 3304 1656 R 66.4 0.3 0:11.07 bash 74081 root 20 0 116740 3572 1808 R 66.1 0.4 3:23.12 bash 70206 root 20 0 116784 3120 1376 R 62.5 0.3 1:38.89 bash 72544 root 20 0 116784 3556 1800 R 52.2 0.4 1:57.57 bash
cpuset.memory_spread_page用于设定文件系统缓冲是否应在该 cpuset 的内存节点中均匀分布,cpuset.memory_spread_slab用于设定slab缓冲(如inode和dentries)是否应在该 cpuset 的内存节点中均匀分布,默认否。该策略在将(大的)数据文件分布到多个node时可以提升性能(平均分布)。
cpuset.sched_load_balance和cpuset.sched_relax_domain_level与cpu负载均衡有关。linux使用sched domains(调度域)为单位进行负载均衡。当sched_load_balance设置为enable时,会在该cpuset中的cpu上进行负载均衡,否则不会在该cpuset中的cpu上进行负载均衡(不同cpuset中重叠的cpu上可能也会有负载均衡)。当root cpuset的sched_load_balance为enable时,会在所有的cpu上进行负载均衡,此时会忽略所有子cpuset中对该值的设置,因此只有在root cpuset disable之后,子cpuset才能生效。cpu负载均衡会影响系统性能,在以下两种情况下可以不需要该功能:
- 大型系统中存在很多cpu,如果对单独进程分配了独立的cpu,此时无需使用cpu负载均衡
- 实时系统上需要减少cpu的损耗,此时可以不适用负载均衡
cpuset.sched_relax_domain_level表示 kernel 应尝试平衡负载的 CPU 宽度范围,仅当cpuset.sched_load_balance enable时生效。一般无需改动。
cpuset.memory_migrate包含一个标签(0
或者 1
),用来指定当 cpuset.mems
的值更改时,是否应该将内存中的页迁移到新节点。
https://www.cnblogs.com/charlieroro/p/10281469.html
来源:oschina
链接:https://my.oschina.net/u/866802/blog/3068519