cgroup CPUSET

强颜欢笑 提交于 2020-02-29 04:31:48

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点

  1. 子cpuset的cpu和memory node必须是父cgoup的子集
  2. 除非父cgroup标记了exclusive,否则子cgoup无法标记该flag
  3. 如果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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!