级别: 中级 Rajeev Mishra, 资深软件工程师, IBM Kavitha Ramalingam, 咨询软件工程师, IBM
2009 年 9 月 24 日 工作负载分区中的资源控制基于 Workload Manager (WLM) 技术,这种技术是从 IBM® AIX V4.3.3 开始在 AIX® 内核中引入的。工作负载分区 (WPAR) 资源控制包含并扩展 WLM 技术。它在 WLM 之上提供一个抽象层,这简化了资源控制,管理员不需要深入了解 WLM。
简介
在 AIX V6.1 中,支持 8192 个用户定义的超类,可以同时支持最多 8192 个活跃的 WPAR,这大大提高了 WLM 的可伸缩性。在基于百分比的资源限制设置中,资源控制的粒度也更细了。现在,基于百分比的资源限制设置中的每个值(<min>%、<sMax>% 和 <hMax>%)可以精确到小数点后两位。
按照 WLM 的术语,WPAR 作为 Tier-0 中的常规 WLM 类。WPAR 的基本名变成它的 WLM 类名。wlmstat 命令已经改进了,现在包含 -@ 命令行选项,它报告与 WPAR 相关的资源使用量。
可以通过 WPAR 资源控制指定:
- 分配给 WPAR 的内存(物理内存)和 CPU 资源量。
- 可以在 WPAR 中创建的进程和线程数量。
- WPAR 中的单一进程可以占用的虚拟内存量。
- WPAR 进程可以使用的资源集(处理器子集)。
指定 CPU 和内存分配有两种方法:
- 基于份额。按照这种方法,每个 WPAR 接收的资源份额(CPU 或内存)仅是当前活跃的所有 WPAR 的总份额的一部分。
- 基于百分比:
- Minimum% —— 保证一个工作负载分区能够获得的最小资源百分比(如果它需要资源的话)。
- Soft maximum% —— 当发生资源争用时,WPAR 可以获得的最大资源百分比。
- Hard maximum% —— 即使在没有发生资源争用的情况下,WPAR 可以获得的最大资源百分比。
当前活跃的所有工作负载分区的 minimum% 总和不能超过 100%。
如果同时指定份额和百分比限制,那么百分比限制优先。
在几乎所有情况下,基于份额的资源控制方法应该可以满足资源控制需求。如果必须为工作负载分区设置最小资源量或最大资源量,就需要使用基于百分比的控制方法。
WPAR 的 CPU 资源控制
WPAR 的 CPU 资源控制可以在创建 WPAR 时使用 mkwpar 命令或通过 chwpar 指定。chwpar 命令对于正在运行的 WPAR 也是有效的。
chwpar -R shares_CPU=<shares> <wpar name>
chwpar -R CPU=<min%>-<soft max %>, <hard max%> <wpar name>
|
以上命令中指定的 CPU 限制是指系统看到的 “虚拟” CPU。AIX 分区可以是具有专用 CPU 的 LPAR 或具有部分 CPU 的 DLPAR,也可以是非分区系统。在所有情况下,wlmstat 报告的 CPU 利用率和内核对 WPAR 采取的 CPU 资源控制措施都应用于分区上的有效虚拟 CPU。
为了演示 CPU 资源控制,我们运行了几个 CPU 密集型程序的实例,它们在一个 WPAR 上生成工作负载,同时使用 vmstat 和 wlmstat -@ 命令监视 CPU 使用量。我们不断增加工作负载,直到 vmstat 报告的 CPU 使用量超过 90%。
然后,启用资源控制,限制这个 WPAR 的 CPU 使用量,如下所示:
chwpar R CPU=5%-45%,50% wpar1
|
在 vmstat 输出中可以清楚地看到 CPU 利用率从 100% 下降到大约 40%-45%(见 “id” 字段)。这说明 WPAR 资源控制起作用了。
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------------------
r b avm fre re pi po fr sr cy in sy cs us sy id wa pc ec
1 0 134166 105131 0 0 0 0 0 0 22 38 191 92 0 7 0 1.00 151.5
1 0 134198 105098 0 0 0 0 0 0 20 658 187 93 1 5 0 1.00 151.5
1 0 134271 104997 0 0 0 0 0 0 14 25 182 92 0 7 0 1.00 151.5
1 0 134271 104997 0 0 0 0 0 0 13 14 184 92 0 7 0 1.00 151.5
2 0 134277 104991 0 0 0 0 0 0 18 2031 203 91 7 2 0 0.84 127.0
<wpar cpu resource control added>
1 0 134277 104991 0 0 0 0 0 0 18 17 184 64 0 35 0 0.46 70.1
1 0 134277 104991 0 0 0 0 0 0 9 17 181 60 0 39 0 0.43 65.6
1 0 134277 104991 0 0 0 0 0 0 9 12 176 56 0 44 0 0.40 61.0
1 0 134277 104991 0 0 0 0 0 0 18 13 179 44 0 55 0 0.32 48.7
1 0 134277 104991 0 0 0 0 0 0 8 11 179 47 0 53 0 0.34 51.3
1 0 134277 104991 0 0 0 0 0 0 17 24 187 50 0 50 0 0.36 54.3
1 0 134277 104991 0 0 0 0 0 0 22 18 196 52 0 47 0 0.38 57.
1 0 134276 104992 0 0 0 0 0 0 8 17 178 51 0 49 0 0.37 55.7
1 0 134277 104991 0 0 0 0 0 0 10 15 181 64 0 36 0 0.46 69.6
1 0 134277 104991 0 0 0 0 0 0 6 13 183 60 0 40 0 0.43 64.9
|
下面的 wlmstat 输出显示平均 CPU 使用量大约在软限制左右。但是,偶尔会超过硬限制,后面解释这一现象。
# wlmstat -@ 2
CLASS CPU MEM DKIO
wpar1 42.49 2.26 0.00
TOTAL 42.49 2.26 0.00
CLASS CPU MEM DKIO
wpar1 39.83 2.26 0.42
TOTAL 39.83 2.26 0.42
CLASS CPU MEM DKIO
wpar1 36.99 2.26 0.19
TOTAL 36.99 2.26 0.19
.<data truncated>
CLASS CPU MEM DKIO
wpar1 50.19 2.26 0.33
TOTAL 50.19 2.26 0.33
.<data truncated>
CLASS CPU MEM DKIO
wpar1 36.33 2.26 0.09
TOTAL 36.33 2.26 0.09
CLASS CPU MEM DKIO
wpar1 36.06 2.26 0.04
TOTAL 36.06 2.26 0.04
CLASS CPU MEM DKIO
wpar1 37.51 2.26 0.02
TOTAL 37.51 2.26 0.02
CLASS CPU MEM DKIO
wpar1 41.01 2.26 0.00
TOTAL 41.01 2.26 0.00
|
CPU 使用量偶尔超过硬限制是由 wlmstat 的工作方式造成的。wlm 调度程序在默认情况下每 10 分之一秒运行一次,收集 CPU 统计数据。内核使用收集的 CPU 使用量数据,可以根据优先级、当前 CPU 使用量和 CPU 限制调度或撤消运行进程。在默认情况下,为接下来的 15 个读数保留每次更新的 CPU 瞬时值,并与另外 14 个读数一起求平均值,然后由 wlmstat 显示出来。因此,在 WLM 更新之间可能出现值略微超过硬限制的现象。
通过提高 WLM 调度程序重新计算类消耗和处理器优先级的频率,可以提高 WLM 的响应性。增加这个值会让 WLM 的更新更频繁,由于更新时间间隔更短,会降低进程超过硬限制的可能性。但是,这也会增加 WLM 的处理开销。
WPAR 的内存资源控制
WPAR 的内存资源控制可以在创建 WPAR 时使用 mkwpar 命令或通过 chwpar 指定。chwpar 命令对于正在运行的 WPAR 也是有效的。
内存资源控制也以份额或百分比的形式定义,例如:
chwpar -R shares_memory=<shares> <wpar name>
chwpar -R memory=<min%>-<soft max %>, <hard max%> <wpar name>
|
前面命令中指定的内存限制是指系统中可用的 “物理” 内存。例如,如果系统有 1GB RAM 和 512MB 分页空间,那么下面的 chwpar 命令把 WPAR 的所有进程可用的物理(真实)内存限制为硬限制 0.85GB。
如果内存需求继续增长,WLM 会确保不从 RAM 分配新页面,而是增加分页活动。
为了验证这一点,我们在 WPAR 中运行一个内存密集型程序,它在循环中执行 malloc() 和 memset()(每次 10MB),WPAR 的内存限制为 <min=8%>, <smax=10%>, <hmax=12%>,1GB 物理内存的 12% 为 123MB。分页空间为 512MB。
为了启用大型堆,我们用以下命令编译程序:
cc -bmaxdata:0x80000000 getmem.c -o getmem|outline"/>
|
在启用资源控制的情况下,程序得到的内存大约为 550MB。但是,在分配的内存达到 100MB 左右之后,会在 vmstat 的输出中看到分页活动增加。这是因为当 WPAR 的物理内存使用量接近 chwpar 命令指定的最大限制时,资源控制会发挥作用,进一步的内存需求要由分页空间来满足。
在达到大约 550MB 之后,当测试程序试图 memset 一个内存块时,内核杀死它。注意,在 AIX 中,在使用页面之前,并不实际分配内存。尽管 malloc 可能返回有效的地址,但是在通过 memset () 尝试使用它之前,并不会获得这个页面。
随着 WPAR 消耗的内存越来越多,wlmstat 报告的 WPAR 内存使用量持续增加,最后稳定在比硬限制略低的值。
# wlmstat -@ 2
CLASS CPU MEM DKIO
abc 0.00 1.18 0.19
TOTAL 0.00 1.18 0.19
.
CLASS CPU MEM DKIO
abc 4.15 4.68 1.88
TOTAL 4.15 4.68 1.88
CLASS CPU MEM DKIO
abc 4.12 7.45 0.84
TOTAL 4.12 7.45 0.84
CLASS CPU MEM DKIO
abc 4.11 10.22 0.38
TOTAL 4.11 10.22 0.38
CLASS CPU MEM DKIO
abc 3.69 11.18 0.18
TOTAL 3.69 11.18 0.18
CLASS CPU MEM DKIO
abc 2.13 11.74 2.85
TOTAL 2.13 11.74 2.85
Memory usage stabilizing just under the hard limit
CLASS CPU MEM DKIO
abc 2.44 11.46 1.27
TOTAL 2.44 11.46 1.27
CLASS CPU MEM DKIO
TOTAL 5.50 5.95 2.39
<memory usage going down as the getmem process was killed>
CLASS CPU MEM DKIO
abc 2.07 0.07 3.12
TOTAL 2.07 0.07 3.12|outline"/>
|
下面是在测试程序不断消耗内存时 vmstat 的输出。当消耗的内存达到 100MB 左右之后,vmstat 输出中的 pi 和 po 字段值急剧增加,这说明分页活动增加了。
# vmstat 2 10
System configuration: lcpu=2 mem=1024MB ent=0.66
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------------------
r b avm fre re pi po fr sr cy in sy cs us sy id wa pc ec
0 0 151647 92760 0 0 0 0 0 0 21 53 186 3 0 96 0 0.03 4.6
0 0 154277 90130 0 0 0 0 0 0 13 42 183 2 0 98 0 0.02 2.8
0 0 159147 85260 0 0 0 0 0 0 12 36 179 3 1 96 0 0.03 4.8
0 0 164151 80256 0 0 0 0 0 0 13 49 183 3 1 96 0 0.03 4.9
<increased paging activity from here onwards>
0 1 169160 78342 0 3 1335 1551 12999 1 183 36 188 3 6 76 15 0.08 12.8
0 0 171664 77827 0 27 1024 1024 1513 0 110 31 247 2 3 88 7 0.04 6.7
0 0 176674 78175 0 0 2677 2679 3478 0 194 42 192 3 7 84 6 0.08 12.4
0 1 181684 77261 0 0 2048 2048 2778 0 151 34 183 3 5 87 5 0.07 10.7
0 0 185493 77288 0 16 1936 2734 4451 0 156 44 221 2 6 85 7 0.07 10.5
0 0 189199 77225 0 0 1821 1024 1024 0 129 32 184 2 4 89 4 0.06 8.5
3 1 194208 77471 0 0 2624 2627 13102 1 190 37 178 3 8 83 6 0.10 15.4 |
分页活动增加会导致性能下降。如果分页空间被耗尽,请求更多内存的进程会被杀死。因此,建议使用份额设置 WPAR 的内存限制,而不是设置百分比限制。这样的话,如果没有内存争用,一个 WPAR 可以使用系统的所有物理内存。
但是,指定硬限制(比如 90% 这样比较高的值)可能是好做法。如果一个不完善的应用程序一直请求内存,而又没有设置硬限制,它就会耗尽所有虚拟内存,因此可能导致系统重新引导。
另外,为驻留在同一全局环境中的 WPAR 指定最小限制也是有意义的。这样的话,即使有些 WPAR 运行内存密集型应用程序,其他 WPAR 中运行的应用程序也可以获得一定的内存。
与 CPU 统计数据不同,内存统计数据不会超过分配的硬限制。原因在于,内存是 “真实的”(或者说非虚拟的)实体,关于内存消耗的统计数据由内核维护,总是最新的。WLM 调度程序读取并报告内核数据。另一方面,对于 CPU,内核要从 WLM 调度程序读取关于 CPU 使用量的输入,以便做出调度决策。因此,在 wlmstat 报告的数据和实际的 CPU 使用量之间有一定的时间延迟。
使用资源集 (rset) 进行资源控制
资源集 (rset) 用来定义系统上处理器的子集。如果为一个工作负载分区指定了资源集,那么它只能使用这个资源集中的处理器。
可以使用这个特性在 WPAR 环境中驻留计算密集型或 HPC 类型的应用程序,让某些进程只能在指定的一组处理器上运行。这确保这些应用程序不会耗尽系统中的所有计算资源。
使用 mkrset c 命令创建新的资源集。lsrset a 命令显示系统上现有的所有资源集。可以在创建 WPAR 时使用 mkwpar 命令或通过 chwpar 把 WPAR 与资源集关联起来。
# lsrset -a
sys/sys0
sys/node.01.00000
sys/mem.00000
sys/cpu.00000
sys/cpu.00001
#
|
上面的示例表明系统上目前有两个默认的 CPU 资源集。这两个资源集与启用了 SMT 的系统的两个 CPU 核对应。为了简单,我们把它们称为逻辑 CPU 0 和逻辑 CPU 1。
下面的命令把 WPAR “abc” 的所有进程与资源集 sys/cpu.00001 关联起来。
chwpar rset=sys/cpu.00001 abc
|
执行这个命令之后,这个 WPAR 中的所有进程只能在逻辑 CPU 1 上运行。逻辑 CPU 1 还可以运行来自全局环境的进程。如果其他 WPAR 也把自己的资源集与逻辑 CPU 1 相关联,逻辑 CPU 1 也可以运行来自这些 WPAR 的进程。
mpstat 命令报告资源集/逻辑 CPU 的 CPU 利用率百分比。下面的示例以两秒的时间间隔报告逻辑 CPU 使用量。
当系统非常空闲时:
# mpstat 2
System configuration: lcpu=2 ent=0.7 mode=Uncapped
cpu min maj mpc int cs ics rq mig lpa sysc us sy wa id pc %ec lcs
0 8 0 0 261 180 90 0 0 100 44 9 63 0 27 0.01 0.9 325
1 0 0 0 93 0 0 0 0 - 0 0 16 0 84 0.00 0.4 298
U - - - - - - - - - - - - 0 99 0.65 98.7 -
ALL 8 0 0 354 180 90 0 0 100 44 0 1 0 99 0.01 1.3 623
--------------------------------------------------------------------------------
0 1 0 0 261 177 88 0 0 100 21 5 61 0 34 0.00 0.7 321
1 0 0 0 89 0 0 0 0 - 0 0 18 0 82 0.00 0.3 293U - - - - - - - - - - - - 0 99 0.65 99.0 -
ALL 1 0 0 350 177 88 0 0 100 21 0 0 0 99 0.01 1.0 614
|
请注意 “us”、“sy” 和 “id” 列,它们分别表示用户空间和系统空间的 CPU 利用率百分比以及系统空闲时间。它清楚地表明系统的空闲时间达到 99%。
现在,在不启用资源控制的情况下启动 WPAR “abc”,然后通过运行 “yes” 命令在这个 WPAR 中产生一些工作负载。
/usr/bin/yes > dev/null & |
在 mpstat 命令窗口中,可以看到以下输出:
cpu min maj mpc int cs ics rq mig lpa sysc us sy wa id pc %ec lcs
0 8 0 0 268 169 75 0 0 100 3856 99 1 0 0 0.92 91.9 100
1 0 0 0 90 35015 35015 0 0 - 0 0 0 0 100 0.08 8.1 186
ALL 8 0 0 358 35184 35090 0 0 100 3856 91 1 0 8 1.00 151.7 286------
0 1 0 0 304 168 76 0 0 100 3838 99 1 0 0 0.92 91.9 100
1 0 0 0 98 34939 34939 0 0 - 0 0 0 0 100 0.08 8.1 192
ALL 1 0 0 402 35107 35015 0 0 100 3838 91 1 0 8 1.00 151.5 292
|
资源集 0 的空闲时间为 0%(使用了 100% 的 CPU)。
现在,为这个 WPAR 启用资源控制,把它与资源集 1 关联起来。
chwpar -R rset=sys/cpu.00001 abc
|
在 mpstat 命令窗口中,可以看到以下输出:
cpu min maj mpc int cs ics rq mig lpa sysc us sy wa id pc %ec lcs
0 8 0 0 168 180 90 0 0 100 44 0 2 0 98 0.05 5.0 242
1 0 0 0 116 2 2 0 0 100 3920 99 1 0 0 0.95 95.0 100
ALL 8 0 0 284 182 92 0 0 100 3964 95 1 0 5 1.00 151.5 342
--------------------------------------------------------------------------------
0 1 0 0 168 174 88 0 0 100 14 0 1 0 99 0.05 4.9 241
1 0 0 0 121 1 1 0 0 100 3920 99 1 0 0 0.95 95.1 100
ALL 1 0 0 289 175 89 0 0 100 3934 95 1 0 5 1.00 151.5 341
|
资源集 0 现在是空闲的,而资源集 1 现在承担所有工作负载。这是因为 WPAR 资源控制已经把这个 WPAR 的处理限制在逻辑 CPU 1 上了。还要注意以上 mpstat 输出中的 “pc” 和 “%ec” 字段(它们分别表示物理 CPU 和有效 CPU 利用率百分比)。逻辑 CPU 0 中的工作负载只占用物理 CPU 的 5%,而逻辑 CPU 1 占用其余部分。
可以在 WPAR 之间共享资源集。一个 WPAR 可以使用已经与另一个 WPAR 相关联的资源集。(但是,mkwpar/chwpar 会发出警告)。
在下面的示例中,当资源集 1 满负载时,我们启动另一个 WPAR(名为 def),不启用资源控制,然后在其中增加 CPU 工作负载。
在 mpstat 命令窗口中,可以看到以下输出:
cpu min maj mpc int cs ics rq mig lpa sysc us sy wa id pc %ec lcs
0 52 0 1 276 204 82 0 0 100 3564 99 1 0 0 0.50 50.0 100
1 0 0 1 127 0 0 0 0 100 3201 100 0 0 0 0.50 50.0 100
ALL 52 0 2 403 204 82 0 0 100 6765 99 1 0 0 1.00 151.6 200
--------------------------------------------------------------------------------
0 2 0 0 276 173 79 0 0 100 3209 99 1 0 0 0.50 50.1 100
1 0 0 0 133 3 2 0 0 100 3208 100 0 0 0 0.50 49.9 100
ALL 2 0 0 409 176 81 0 0 100 6417 100 0 0 0 1.00 151.5 200
|
在这个示例中,可以看到两个逻辑 CPU 都满负载了。注意 mpstat 输出中的 “pc” 和 “%ec” 字段。每个逻辑 CPU 分别使用分配给分区的物理 CPU 总量的 50%。
现在,为 WPAR “def” 启用资源控制,使用与另一个 WPAR 相同的资源集。
# chwpar -R rset=sys/cpu.00001 def
**********************************************************************
Warning
chwpar:
0960-105 resources.rset must be unique across all
workload partitions.rset = sys/cpu.00001
also found in the following files:/etc/wpars/abc.cf
**********************************************************************
|
如下所示,mpstat 现在报告逻辑 CPU 0 恢复到空闲状态,而逻辑 CPU 1 从逻辑 CPU 0 接管 WPAR “def” 的进程的工作负载。
cpu min maj mpc int cs ics rq mig lpa sysc us sy wa id pc %ec lcs
0 8 0 0 218 336590 336491 0 0 100 45 0 0 0 100 0.38 38.1 99
1 0 0 0 122 99 99 0 0 100 3142 100 0 0 0 0.63 63.3 99
ALL 8 0 0 340 336689 336590 0 0 100 3187 63 0 0 37 1.01 153.6 198
--------------------------------------------------------------------------------
0 1 0 0 182 339612 339514 0 0 100 13 0 0 0 100 0.37 36.7 100
1 0 0 0 125 99 99 0 0 100 3166 100 0 0 0 0.63 63.3 100
ALL 1 0 0 307 339711 339613 0 0 100 3179 63 0 0 37 1.00 151.5 200
|
另外,“pc” 和 “%ec” 字段表明,逻辑 CPU 1 现在的物理 CPU 使用量增加了 (63.3%)。
在前面的资源集示例中,可以看到 CPU 使用量达到最高水平。也可以结合使用 CPU 限制(基于份额或基于百分比)和资源集,从而限制资源集中的 CPU 使用量。如果对资源集应用 CPU 限制,那么这一限制会应用于此资源集中的可用 CPU 资源总量。
排他的资源集
还可以给 WPAR 分配排他的资源集。如果 WPAR 与排他的资源集相关联,那么只允许来自这个 WPAR 的进程在属于这个资源集的 CPU 上运行。这对于希望为 CPU 密集型应用程序分配专用计算资源的情况很有用。
使用以下命令创建排他的资源集:
mkrset -c 1 sysxrset/<rset name>
|
使用以下命令把 WPAR 与排他的资源集关联起来:
chwpar -R rset=sysxrset/<rset name> <wpar name> |
当前,排他的资源集可以与多个 WPAR 相关联,但是这一点以后可能会改变。
请注意,CPU 限制不能应用于排他的资源集。如果指定 CPU 限制,它们会被忽略。
结束语
系统管理员可以事先计划所需的资源分配,在使用 mkwpar 命令创建系统中的每个 WPAR 时指定它们的资源份额,从而有效地控制各个 WPAR 的资源使用量。另外,在工作负载发生变化时,他们可以使用 chwpar 命令动态地调整性能。
参考资料 学习
讨论
作者简介  | |  | Rajeev Mishra 在过去 13 年参与了 AIX 内核开发。在此期间,他参与了 WLM、WPAR、VMM、Loader 和 Sysproc 等许多核心技术的开发。 |
 | |  | Kavitha Ramalingam 是 IBM AIX WPAR 团队的开发人员。她在过去 11 年参与了 AIX 的支持、测试和开发项目,涉及的领域包括 WPAR、TCP/IP、NFS 等。Kavitha 拥有印度 Madras University 的计算机科学和工程学士学位。 |
对本文的评价
|