普通 LPAR CPU 利用率的查看
在 AIX 操作系统中,可以监控 CPU 利用率的命令有很多,最常用的 nmon、topas、vmstat、sar –u 等等。
在单 CPU 线程(SMT OFF),单线程应用的环境下,CPU 利用率的输出结果很容易看懂,如下:User% 代表系统中用户进程占用的 CPU 比率;Sys% 代表系统调用所占的 CPU 比率,Wait% 代表等待 I/O 响应的 CPU 比率,Idle% 代表空闲 CPU 的比率。下面我们将主要分析在微分区中,CPU 的调度原理以及监控方法,以及在多 CPU 线程和多线程应用的环境下,监控 CPU 利用率的方法。
CPU User% Sys% Wait% Idle%|0 0.0 1.0 1.0 98.0|>1 0.0 0.0 0.0 100.0|>2 0.0 20.0 0.0 80.0|ssssssssss>3 0.0 10.0 0.0 90.0|sssss>4 0.0 4.1 1.0 94.8|ss>5 0.0 0.0 0.0 100.0|>6 0.0 10.0 0.0 90.0|sssss>7 0.0 30.0 0.0 70.0|s |
微分区 CPU 利用率以及调度的探究
微分区概要文件的设置规则
在创建分区的时候,选择创建共享 CPU 分区,如下图:
图 1. 创建共享 CPU 分区
在接下来的页面中,需要设置虚拟 CPU 和物理 CPU 的数量:
图 2. 设置虚拟 CPU 和共享 CPU 的数量。
关于上图几个数值,这里需要详细说明。
我们知道,在当前的 PowerVM 版本中,一个虚拟 CPU 最多可以调度 1 个物理 CPU。在概要文件的设置中,我们既不能将虚拟处理器设置的太多,这样会造成过多的 CPU 上下文切换;也不能将其设置的过低,那样微分区将不能调度或者获取足够的物理 CPU。
物理 CPU 的“最小处理单元数”、“ 期望处理单元数”、“ 最大处理单元数”的含义与普通 LPAR 没有区别,分别代表“激活分区所需的最少物理 CPU 资源”、“激活分区时期望获取的物理 CPU 资源”、“分区可以获得最多物理 CPU 资源”。就普通 LPAR 而言,一个分区激活以后,其自动获取的 CPU 资源处于“大于等于“最小处理单元数”、小于等于“ 期望处理单元数”的闭区间内”。“ 最大处理单元数”的设置数值,是手工对分区做 DLPAR 操作时,LPAR 可以增加到的最多 CPU 数量。
虚拟 CPU 的“最小虚拟处理器数”、“ 期望虚拟处理器数”、“ 最大虚拟处理器数”的含义分别为:“激活分区所需的最少虚拟 CPU 数量”、“激活分区时期望获取的虚拟 CPU 数量”、“分区可以获得最多虚拟 CPU 数量”。从概念的描述上看,虚拟 CPU 的数值含义似乎无太大的差别,只是多了“虚拟”两个字,实际上区别很大。实际上,虚拟 CPU 的数量我们可以设置的很大,因为这个较大数值不会给客户带来成本,而事实上,虚拟 CPU 实际上也不存在不够用的情况,除非我们将其设置得过小,而共享 CPU 池中的空闲物理 CPU 很多。
微分区的意义在于降低 CPU 的空闲率,从而降低客户的 IT 成本。因此,在这种情况下,我们通常将
对等的虚拟 CPU 的数量设置的比物理 CPU 的数量要高,否则就失去了微分区意义。
专用 CPU 分区的 CPU 共享功能
在 PowerVM 中,专用 CPU 分区在其 CPU 空闲的时候,也可以将其空闲的 CPU 处理能力分给 CPU 共享池。这个功能的打开与关闭,由如下两个系统参数控制,我们一般将两个参数的数值设置相同 :
smt_snooze_delay:控制 CPU 的第 1 个、第 2 个线程的释放时间。
smt_tertiary_snooze_delay:控制 CPU 的第 3 个、第 4 个线程的释放时间。
这两个参数的含义是:当 Hypervisor 发现专用 CPU 分区 CPU 空闲的时候,将空闲的 CPU 分给 CPU 共享池使用的 delay 时间,如果这个数值设置为 0,则表示没有延迟,即立刻将空闲 CPU 共享给 CPU 共享池;设置为 -1,表示关闭此功能;如果将数值设置成 0-100000000 之前的数值,则表示延迟的微秒数,数字越大,延迟越大,CPU 共享池能获取到的专用 CPU 分区的空闲 CPU 的时间就更长。
在系统中,我们用 schedo -h 命令可以查看两个参数的含义:
#schedo -h smt_snooze_delay Help for tunable smt_snooze_delay: Purpose: Amount of time in microseconds in idle loop without useful work before snoozing (calling h_cede). Values: Default: 0 Range: -1 - 100000000 Type: Dynamic Unit: microsecs Tuning: A value of -1 indicates to disable snoozing, a value of 0 indicates to snooze immediately. The maximum value of 100000000 corresponds to 100 seconds. atsnfs[/atspersonal/weixinyu/123]# #schedo -h smt_tertiary_snooze_delay Help for tunable smt_tertiary_snooze_delay: Purpose: Amount of time in microseconds in idle loop on tertiary thread without useful work before snoozing (calling h_cede). Values: Default: 0 Range: -1 - 100000000 Type: Dynamic Unit: microsecs Tuning: A value of -1 indicates to disable snoozing, a value of 0 indicates to snooze immediately. The maximum value of 100000000 corresponds to 100 seconds. |
微分区“处理器折叠”(Processor Folding)功能
在 PowerVM 的微分区环境下,PowerVM Hypervisor 负责虚拟 CPU 的调度。
我们继续上一小节中关于设置微分区概要文件的例子,假设我们将概要文件中虚拟 CPU 的数量设置的比物理 CPU 数量多(实际上这样才有意义)。
在微分区中,系统在 CPU 利用率低的时候,可以关闭一些虚拟 CPU,以减少 CPU 上下文切换,降低系统开销,从而提高性能;而当 CPU 利用率很高,系统将会相应地启用被关闭的 CPU,这个功能被成为“处理器折叠”(Processor Folding) 功能,它主要由如下参数决定:
# schedo -o vpm_xvcpus vpm_xvcpus = 0 |
vpm_xvcpus 可调参数的缺省值是 0,表示启用了折叠 (Processor Folding) 功能。这意味着虚拟处理器正接受管理。
# schedo -o vpm_fold_policy vpm_fold_policy = 1 |
可以根据分区是共享处理器分区还是专用处理器分区来启用或禁用“处理器折叠” (Processor Folding) 这一虚拟处理器管理功能。另外,当分区处于静态省电方式时,将对共享处理器分区或专用处理器分区自动启用处理器折叠功能 (Processor Folding) 。
vpm_fold_policy参数有三个设置功能位:
设置为 1 时,此位表明启用处理器折叠功能(如果分区正在使用共享处理器)。
设置为 2 时,此位表明启用处理器折叠功能(如果分区正在使用专用处理器)。
设置为 4 时,如果分区处于静态省电方式,那么此位将禁止自动设置处理器折叠功能。
对于微分区的环境下,
vpm_xvcpus 为 0,vpm_fold_policy设置为 1 即可,我们不需要对两个参数的默认数值进行修改。
例如,我们有一个分区,虚拟 CPU 的数量是 6,物理 CPU 的资源是 0.6:
图 3. 利用 DLPAR 查看分区配置
此时,系统十分空闲:
查看到系统中虚拟 CPU 的数量:
# prtconf |grep "Number Of Processors"Number Of Processors: 6 |
查看到由于系统开启了 SMT-4,因此系统中逻辑 CPU 的数量为 24
# vmstat 1 5 System configuration: lcpu=24 mem=4096MB ent=0.60 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 295379 699293 0 0 0 0 0 0 0 0 0 0 1 99 0 0.02 2.6 0 0 295379 699293 0 0 0 0 0 0 0 0 0 0 1 99 0 0.01 2.2 0 0 295379 699293 0 0 0 0 0 0 0 0 0 0 1 99 0 0.01 2.0 0 0 295379 699293 0 0 0 0 0 0 0 0 0 0 1 99 0 0.01 1.9 0 0 295379 699293 0 0 0 0 0 0 40 152 204 0 1 99 0 0.01 2.1 |
此时 6 个虚拟 CPU 的 24 个逻辑 CPU 并未完全展开 :
# mpstat 1 5 System configuration: lcpu=24 ent=0.6 mode=Uncapped cpu min maj mpc int cs ics rq mig lpa sysc us sy wa id pc %ec lcs 0 27 0 0 308 280 123 1 4 97 395 10 78 0 12 0.01 1.4 252 1 0 0 0 19 0 0 0 0 - 0 0 4 0 96 0.00 0.4 19 2 0 0 0 19 0 0 0 0 - 0 0 5 0 95 0.00 0.4 19 3 0 0 0 19 0 0 0 0 - 0 0 5 0 95 0.00 0.4 19 4 0 0 0 10 0 0 0 0 - 0 0 6 0 94 0.00 0.0 9 12 0 0 0 4 0 0 0 0 - 0 0 3 0 97 0.00 0.0 3 13 0 0 0 37 0 0 0 0 - 0 0 58 0 42 0.00 0.0 31 16 0 0 0 6 0 0 0 0 - 0 0 8 0 92 0.00 0.0 4 20 0 0 0 12 0 0 0 0 - 0 0 14 0 86 0.00 0.0 10 U - - - - - - - - - - - - 0 99 0.59 99.0 - ALL 27 0 0 434 280 123 1 4 97 395 0 0 0 100 0.02 2.7 366 -------------------------------------------------------------------------------- cpu min maj mpc int cs ics rq mig lpa sysc us sy wa id pc %ec lcs 0 14 0 0 1104 860 376 4 3 97 1609 8 79 0 13 0.01 1.3 851 1 0 0 0 65 0 0 0 0 - 0 0 6 0 94 0.00 0.4 61 2 0 0 0 61 0 0 0 0 - 0 0 2 0 98 0.00 0.3 61 3 0 0 0 47 0 0 0 0 - 0 0 3 0 97 0.00 0.3 47 4 0 0 0 9 0 0 0 0 - 0 0 75 0 25 0.00 0.0 9 13 0 0 0 116 0 0 0 0 - 0 0 56 0 44 0.00 0.0 98 U - - - - - - - - - - - - 0 98 0.59 97.6 - ALL 14 0 0 1402 860 376 4 3 97 1609 0 1 0 99 0.01 2.4 1127 -------------------------------------------------------------------------------- |
如果将 vpm_fold_policy 设置为 4,即关闭该功能,那么 24 个逻辑 CPU 将全部展开:
# schedo -o vpm_fold_policy=4 Setting vpm_fold_policy to 4 # mpstat 1 1 System configuration: lcpu=24 ent=0.6 mode=Uncapped cpu min maj mpc int cs ics rq mig lpa sysc us sy wa id pc %ec lcs 0 61 0 0 194 72 41 0 1 100 17 3 83 0 14 0.01 0.9 151 1 63 0 0 9 1 1 0 1 100 0 0 19 0 81 0.00 0.3 11 2 63 0 0 10 1 1 0 1 100 0 0 19 0 81 0.00 0.3 12 3 63 0 0 9 1 1 0 1 100 0 0 19 0 81 0.00 0.3 10 4 59 0 0 20 24 13 0 1 92 0 0 46 0 54 0.00 0.2 24 5 62 0 0 9 1 1 0 1 100 0 0 38 0 62 0.00 0.1 10 6 63 0 0 90 2 2 0 1 100 0 0 48 0 52 0.00 0.1 90 7 58 0 0 9 1 1 0 1 100 0 0 40 0 60 0.00 0.1 10 8 63 0 0 19 1 1 0 1 0 0 0 50 0 50 0.00 0.2 21 9 63 0 0 10 1 1 0 1 100 0 0 42 0 58 0.00 0.1 12 10 62 0 0 9 1 1 0 1 100 0 0 46 0 54 0.00 0.1 11 11 61 0 0 9 1 1 0 1 100 0 0 46 0 54 0.00 0.1 11 12 64 0 0 10 1 1 0 1 100 0 0 42 0 58 0.00 0.1 12 13 45 0 0 25 1 1 0 1 100 0 0 51 0 49 0.00 0.1 24 14 63 0 0 9 1 1 0 1 100 0 0 45 0 55 0.00 0.1 10 15 63 0 0 9 1 1 0 1 0 0 0 48 0 52 0.00 0.1 10 16 62 0 0 15 6 4 0 3 75 17 1 48 0 51 0.00 0.1 18 17 61 0 0 9 1 1 0 1 100 0 0 38 0 62 0.00 0.1 11 18 64 0 0 9 1 1 0 1 100 0 0 42 0 58 0.00 0.1 11 19 59 0 0 10 1 1 0 1 100 0 0 41 0 59 0.00 0.1 12 20 60 0 0 13 102 52 0 1 98 101 19 58 0 23 0.00 0.4 65 21 62 0 0 9 1 1 0 1 0 0 0 31 0 69 0.00 0.2 10 22 61 0 0 10 1 1 0 1 100 0 0 30 0 70 0.00 0.2 12 23 64 0 0 9 1 1 0 1 100 0 0 30 0 70 0.00 0.2 10 U - - - - - - - - - - - - 0 95 0.57 95.4 - ALL 1469 0 0 534 225 131 0 26 96 135 0 2 0 98 0.03 5.0 578 |
在系统中,还有一个内核参数:vpm_xvcpus。它的作用是控制当微分区 CPU 不足的时候,系统可以自动启动的微分区的数量。如果将这个值设置为 -1,则表示关闭此功能;若设置为 0,表示启用了折叠功能 (Processor Folding) 。这意味着虚拟处理器正接受管理,分区启用了 CPU 折叠功能。默认数值设置为 0,表示分区可以启用其关闭的虚拟 CPU;如果 vpm_xvcpus 数值设置大于 1,则表示系统不仅可以启用其关闭的虚拟 CPU,还可以启动额外的虚拟 CPU,前提是分区的虚拟 CPU 总数不大于分区概要文件最大虚拟 CPU 数量的设置。
atsnfs[/]#schedo -h vpm_xvcpus Help for tunable vpm_xvcpus: Purpose: Setting this tunable to a value greater than -1 will enable the scheduler to enable and disable virtual processors based on the partition's CPU utilization. Values: Default: 0 Range: -1 - 2147483647 Type: Dynamic Unit: processors Tuning: The value specified signifies the number of virtual processors to enable in addition to the virtual processors required to satisfy the workload. |
分区需要的虚拟 CPU 的总数 = 物理 CPU 使用数 + 要启用的更多虚拟处理器的数目。如果所需的虚拟处理器的数目小于当前已启用的虚拟处理器的数目,则利用分区的 CPU 折叠功能 (Processor Folding) 停用部分虚拟处理器。如果所需的虚拟处理器的数目大于当前已启用的虚拟处理器的数目,则启用已禁用的虚拟处理器。连接到已禁用的虚拟处理器的线程仍然能够在该处理器上运行。
uncapped 分区 CPU 调度
分区激活的时候,会读取概要文件中物理 CPU“期望处理单元数”的数值,如果可以从 CPU 共享池中获取到设定的 CPU 资源,则以这个数量的物理 CPU 激活;若能获取到得物理 CPU 的资源小于概要文件中“最小处理单元数”数值的设置,则无法激活分区;或若能获取到得物理 CPU 的资源介于“期望处理单元数”和“最小处理单元数”之间,则会以这个数值激活分区。
分区激活以后,系统将会监控 CPU 的利用率,如果每个虚拟 CPU 的利用率都低于 50%,系统将会关闭一些虚拟 CPU,以减少 CPU 的上下文切换。当然,减少后的虚拟 CPU 的数量应不小于物理 CPU 的数量。此时,微分区中物理 CPU 总的利用率超过 50%,那么系统会将关闭的虚拟 CPU 重新打开,以便分区可以获取到额外的物理 CPU 资源。
我们知道,Power7 服务器 CPU 支持四线程,CPU 的第 2,3,4 个线程在 CPU 空闲的时候是不启用的。因此,在已获取的物理 CPU 的第一个线程利用率达 100% 的时候,如果此时 CPU 共享池中有空闲的物理 CPU,系统将会优先启用被关闭的虚拟 CPU,以便获取而外的物理 CPU;如果此时 CPU 共享池中没有可以获取到的物理 CPU,那么系统首先不会启用被关闭的虚拟 CPU,而是使用已获取的物理 CPU 的第 2 个、第 3 个、和第 4 个线程,直到整个物理 CPU 的利用率超过 80%,才会启用新的虚拟 CPU。
如果一个微分区很繁忙,并且该分区已经获取的物理 CPU 的数量已经达到该分区设置的期望获取的虚拟 CPU 的数量,如果条件允许,我们还想给微分区增加物理 CPU 资源的方法是用 DLPAR 增加该分区的虚拟 CPU 的数量,然后该分区会继续获取物理 CPU 资源。
所以说,对于一个 uncapped 分区,它能够自动获取到的最多物理 CPU 资源,是由概要文件中的“期望虚拟处理器数”决定的。