最后更新2021/08/01
AME技术目的是压缩内存中的数据,因此减少物理内存使用量,从某种意义上提升系统IO性能。个人看来,这是个有毒无用的功能,因为AME的基础是用CPU的部分算力,尽管可以是额外的晶体管实现,不会占用原有指令处理能力,但毕竟CPU单位成本要远高于内存。换句话说,内存性能之所以滞后于CPU,并不是内存做不到高性能,而是基于成本考虑,用高成本的CPU芯片集成去满足稍低成本的内存需求,显然有些得不偿失。如果单独为了内存压缩,我想IBM Power CPU的设计者不会搞不清成本,其实AME只是一个更重要功能的附带产品,这个功能就是内存加密,实现真正端到端的信息保密(但现在还没有在Power/AIX架构上正式推出产品,只在IBM Mainframe上有实现),也就是说通过内存加密,只有CPU当前访问的特定指令和数据页面的数据是明码,即使另外一个获得OS授权的另一个内核线程可以访问这部分数据,如果没能拿到访问密钥,其获得的数据都是密文,这算是IBM Power CPU在拓展自己能力的时候的一个试探吧。
CPU、物理内存和系统总线是计算机系统中最主要的电子元件,他们一直在遵循摩尔定律,持续稳定地提升速度、提高容量,但这三者进化的速度之间是有差异的。目前,早些时候,CPU的速度提升显然快于内存容量提升,更快于总线速度提升。为应对系统总线速度提升缓慢的问题,Power CPU很早之前就设计了内置多级Cache和Cache控制器技术,而AME技术又创新式地拓展了Cache的使用方式——内存(包括Cache)中的数据可以通过CPU进行实时、动态的压缩、解压缩。由于CPU仅仅对当前需要处理的内存数据进行压缩、解压缩,虽然增加了CPU的额外工作量,但如果总体负荷并不大,更重要的是所有工作都对CPU执行的程序透明,除了分区启动参数设置,无需任何额外操作。另外,AME以分区为单位进行设置,可以只应用于特定的分区。因为我们知道,对于进行高强度数学运算的应用、经常进行图像编码/解码的应用,此功能可能会起反作用,因为前者数据量较小而CPU繁忙,后者数据的数据通常已经进行过压缩,不能再进一步压缩。
某个分区设置了AME动态内存扩展功能之后,当分区启动激活profile时,会根据相关参数设定自动开启压缩、解压缩功能,而被压缩的内存的数量则根据CPU负载和分区参数由操作系统自动调节。OS把所有的“物理内存”存放在两个内存管理池中:
- Compressed pool压缩池
- Uncompressed pool非压缩池
OS根据数据使用情况在两个池之间移动数据。当前使用的数据内存块一定在非压缩池中,而未使用的数据内存块则保存在压缩池中。当应用程序需要访问的数据内存块位于压缩池中的时候,Power架构会产生“数据访问中断”,此过程与OS的vmm paging space管理方式相同,所不同的是触发的动作不同。如果是由于数据位于压缩池而产生的数据访问中断,OS会调用AME数据移动功能,将数据内存块(如果激活使用AME功能,AIX只能使用4KB大小的内存块)解压缩并由压缩池“移动”到非压缩池,解压缩动作由CPU自动完成,OS仅仅需要发出控制指令;如果是由于数据不在物理内存(注意:无论是压缩池还是非压缩池中的数据内存块都在物理内存中)而引起的数据访问中断,则由OS触发文件系统数据读入或者Paging Space数据读入操作,完成磁盘到内存的数据移动。
随着应用程序使用到的内存增多,非压缩池中的数据内存块也越来越多,当非压缩池容量达到极限时,OS根据数据内存块最后使用情况,将非压缩池中的不常用数据“移回”到压缩池中,同时完成数据压缩过程。压缩池和非压缩池的大小(比例)由分区参数设定,如<图 270 AME参数示意>所示,图中内存扩展参数(Memory Expansion Factor)为1.5,则实际分配物理内存1GB,但OS动态扩展出1.5倍,即1.5GB。
图 286 AME参数示意
使用AME功能只需要设置一个参数,即Memory Expansion Factor内存扩展比。AIX自动以此参数乘实际分配给分区的物理内存所得的总量作为显示给应用程序的“真实”物理内存量。如果设定Factor为2,而分区分配的物理内存是20GB,则AIX显示给应用程序的总“物理”内存数量为20×2=40GB。内存扩展比参数也可以动态调整,使用HMC的DLpar功能即可,调整之后AIX“显示”的内存数据会根据计算结果会根据LMB大小圆整到最接近的数值。
内存扩展比只是参考值,在实际运行中不一定实现。如果内存数据可以大幅压缩,扩展比超过设定值,我们无需关心这个问题,因为只要能够达到压缩目标,剩余的数据可以不压缩,CPU可以早一点休息。我们需要考虑的是内存数据扩展比达不到目标的情况,既“Memory Deficit内存赤字”情况。例如设定扩展比为1.5,而物理内存为20G,则扩展的目标是30GB,然而实际上数据压缩不了这么高,只实现了1.4,即压缩了15GB数据之后就已经填满了10GB真正的物理内存,无法继续进行扩展(压缩),同时所有的内存数据都是压缩后的数据(在压缩池中),应用程序也无法继续执行,因为应用程序只能使用非压缩池中的数据,每次应用访问的数据在压缩池中,就会引起CPU中断,非压缩池中的数据量太少(实际情况不可能为0),会频繁导致中断产生,系统运行效率大大降低。
实际上,AIX有内置的参数95%作为压缩池的极限,即如果压缩池填充到物理内存的95%依然没能实现扩展比目标AIX也不会继续压缩数据。20GB的95%为18GB,剩余2GB,也就是说在本例设定中,只要非压缩池大小小于2GB,扩展比目标即使没有实现,AIX也不会继续进行内存压缩,以避免发生内存压缩抖动(类似paging space trash情况)。
同时,应用程序可用物理内存大小为: 2GB+18GB×1.4=27.2GB,而不是理想中的30GB,中间有2.8GB的“赤字”,如<图 271 AME示例>所示。当系统总物理内存使用量达到27.2GB则会触发paging space交换。当然,如果应用对物理内存的使用低于27.2GB,则通常不会有paging space交换发生。
内存扩展(压缩)比跟应用数据类型直接相关,而从保证系统运行性能角度考虑,扩展比参数应当正确反映内存数据的可压缩比,同时留有部分余量。只要发生内存赤字,就说明扩展比过大。尽管在保持扩展比不变的情况下,增加实际分配给分区的物理内存通常也可以缓解内存赤字,但由于应用“看到”了更多的可用物理内存,会逐渐将可用内存填满(用于文件系统Cache),这并不是一个好的选择。因此最好的解决方案是设定恰当的扩展比。
图 287 AME示例
尽管AME的设定可以从1到10,但设定一个最佳AME才能高效地平衡使用CPU、内存,如何设定最佳AME参数呢?AIX提供了一个规划命令可以帮助了解当前分区应用的内存压缩比。这个命令就是:amepat (位于/usr/bin/amepat)。此命令有两大功能:
- 规划和初始AME配置参数;
- 监视运行系统AME状况并进行调节;
amepat命令执行时不需要先激活分区AME功能,但如果AME没有激活,amepat并不现实AME相关的信息,只显示当前分区的一些CPU、内存参数和负载信息以及估算的内存扩展参数。如果分区激活了AME功能,则amepat命令还将显示内存扩展情况,是否有内存赤字。例如下面的命令和输出:
[/home/root:] amepat 1 2
Command Invoked : amepat 1 2
Date/Time of invocation : Mon Apr 14 11:55:57 EST 2014
Total Monitored time : 2 mins 7 secs
Total Samples Collected : 2
System Configuration:
---------------------
Partition Name : ECM401
Processor Implementation Mode : POWER7+ Mode
Number Of Logical CPUs : 8
Processor Entitled Capacity : 1.50
Processor Max. Capacity : 2.00
True Memory : 16.00 GB
SMT Threads : 4
Shared Processor Mode : Enabled-Uncapped
Active Memory Sharing : Disabled
Active Memory Expansion : Disabled
System Resource Statistics: Average Min Max
--------------------------- ----------- ----------- -----------
CPU Util (Phys. Processors) 0.02 [ 1%] 0.01 [ 1%] 0.03 [ 1%]
Virtual Memory Size (MB) 2342 [ 14%] 2342 [ 14%] 2342 [ 14%]
True Memory In-Use (MB) 9443 [ 58%] 9443 [ 58%] 9443 [ 58%]
Pinned Memory (MB) 1555 [ 9%] 1555 [ 9%] 1555 [ 9%]
File Cache Size (MB) 7050 [ 43%] 7050 [ 43%] 7050 [ 43%]
Available Memory (MB) 13387 [ 82%] 13387 [ 82%] 13387 [ 82%]
Active Memory Expansion Modeled Statistics:
-------------------------------------------
Modeled Expanded Memory Size : 16.00 GB
Average Compression Ratio : 2.07
Expansion Modeled True Modeled CPU Usage
Factor Memory Size Memory Gain Estimate
--------- ------------- ------------------ -----------
1.05 15.25 GB 768.00 MB [ 5%] 0.00 [ 0%]
1.17 13.75 GB 2.25 GB [ 16%] 0.00 [ 0%]
1.28 12.50 GB 3.50 GB [ 28%] 0.00 [ 0%]
1.40 11.50 GB 4.50 GB [ 39%] 0.00 [ 0%]
1.53 10.50 GB 5.50 GB [ 52%] 0.00 [ 0%]
1.65 9.75 GB 6.25 GB [ 64%] 0.00 [ 0%]
1.78 9.00 GB 7.00 GB [ 78%] 0.00 [ 0%]
Active Memory Expansion Recommendation:
---------------------------------------
The recommended AME configuration for this workload is to configure the LPAR
with a memory size of 9.00 GB and to configure a memory expansion factor
of 1.78. This will result in a memory gain of 78%. With this
configuration, the estimated CPU usage due to AME is approximately 0.00
physical processors, and the estimated overall peak CPU resource required for
the LPAR is 0.03 physical processors.
NOTE: amepat's recommendations are based on the workload's utilization level
during the monitored period. If there is a change in the workload's utilization
level or a change in workload itself, amepat should be run again.
The modeled Active Memory Expansion CPU usage reported by amepat is just an
estimate. The actual CPU usage used for Active Memory Expansion may be lower
or higher depending on the workload.
以上命令输出是amepat运行1分钟,执行2次扫描的结果,为了更为准确,可以运行更长时间,执行多次,对于大型生产系统,建议在高峰时期运行一整天。从以上结果我们可以得到以下信息:
- 系统配置信息System Configuration
此部分信息包括主机名、处理器架构、物理CPU数量、Entitlement CPU数量、真实物理内存数量、SMT状态、虚拟CPU数量、内存模式,以及AME是否开启(本例中未开启)。
- 系统资源状态System Resource Statistics
这部分内容显示系统资源使用情况,包括平均值、最小值和最大值以及百分比。本例中物理CPU平均使用量为0.02,最小值为0.01,最大值为0.03。内存信息中最重要的信息是True Memory In Use(真实物理内存使用量)、Pinned Memory In Use(常驻物理内存使用量,一般为操作系统的重要数据)和File Cache Size(用于文件缓存的内存)。一般来说,AME对于应用程序本身的数据访问效果比较明显(不是压缩效果,而是提速效果),在本例中对应的内存数量为838MB:
True Memory In Use – Pinned Memory In Use – File Cache Size = 838 MB
(9443 – 1555 - 7050 = 838)
- 动态内存扩展状态Active Memory Expansion Statistics(只有AME开启才会显示)
下面是分区的AME已经打开的显示结果:
AME Statistics: Average Min Max
--------------- ----------- -------- ---------
AME CPU Usage (Phy. Proc Units) 0.25 [ 6%] 0.01 [ 0%] 0.50 [ 13%]
Compressed Memory (MB) 264 [ 13%] 264 [ 13%] 264 [ 13%]
Compression Ratio 2.15 2.15 2.16
Deficit Memory Size (MB) 562 [ 55%] 562 [ 55%] 562 [ 55%]
在这个例子中,平均扩展比是2.15,存在内存赤字(说明压缩比设定的太大,应当适当降低扩展比)。CPU消耗平均为0.25,最大为0.5,尚处于可接受范围。因此建议适当降低扩展比。
- Active Memory Expansion Modeled Statistics
这一部分显示如果启动动态内存扩展之后会如何(只有AME未打开的分区会有此提示)。系统当前平均扩展比是2.07,这也就是最大扩展比的极限。
Active Memory Expansion Modeled Statistics:
-------------------------------------------
Modeled Expanded Memory Size : 16.00 GB
Average Compression Ratio : 2.07
Expansion Modeled True Modeled CPU Usage
Factor Memory Size Memory Gain Estimate
--------- ------------- ------------------ -----------
1.05 15.25 GB 768.00 MB [ 5%] 0.00 [ 0%]
1.17 13.75 GB 2.25 GB [ 16%] 0.00 [ 0%]
1.28 12.50 GB 3.50 GB [ 28%] 0.00 [ 0%]
1.40 11.50 GB 4.50 GB [ 39%] 0.00 [ 0%]
1.53 10.50 GB 5.50 GB [ 52%] 0.00 [ 0%]
1.65 9.75 GB 6.25 GB [ 64%] 0.00 [ 0%]
1.78 9.00 GB 7.00 GB [ 78%] 0.00 [ 0%]
在上面显示中我们可以看到如果动态内存扩展参数分别设定为1.05-1.78时的内存扩展量和CPU消耗情况。由于当前系统很空闲,因此如果打开AME,则可以设定比较大的扩展比,例如1.78。
- 动态内存扩展建议Active Memory Expansion Recommendation
此部分内容明确给出amepat推荐的AME参数和物理内存分配,在此就不做过多解释了。要注意的是amepat给出的数值是基于当前运行状态,在不同时间系统运行状态不同,建议的参数也会不同,如果系统要求较高的响应速度,则应当采用最保守的数值;如果倾向于减少总执行时间,则可以调整为偏大的数值。
- 性能监控
不仅仅amepat命令,很多AIX命令都可以提供与AME相关的信息,可以互相参考。下面是一些命令及参数的参考信息。
工具(命令) | 参数 | 说明 |
---|---|---|
amepat | -N | 提供CPU、内存的使用状态信息,包括CPU用于AME压缩和解压缩的使用量,以及内存“赤字”情况,无论AME是否开启都可使用,是AME的最直接参考。 |
vmstat | -c | 也可以显示AME相关的CPU、内存、赤字情况。但必须开启了AME才能有显示信息。 |
lparstat | -c | 几乎与vmstat相同,也必须开启AME才有显示。 |
svmon | -O | summary=ame 提供以页面(4K)为单位的显示信息 |
topas | 开启ame之后才有ame相关信息 |
下面是各种命令的示范输出,首先是vmstat命令。
# vmstat –c 2 1
System configuration: lcpu=2 mem=1024MB tmem=512MB ent=0.40 mmode=dedicated-E
kthr memory page faults cpu
r b avm fre csz cfr dxm ci co pi po in sy cs us sy id wa pc ec
0 0 309635 2163 43332 943 26267 174 386 0 0 93 351 339 2 3 89 7 0.02 5.3
下面是对内存压缩相关信息的解释:
- 总内存量用 mem 表示,当前分区为1024 MB.
- 真是物理内存量用tmem表示,当前分区为512 MB.
- 内存模式用mmode表示,禁止了动态内存共享Active Memory Sharing,但动态内存扩展Active Memory Expansion是打开的。
- 压缩池用csz 表示,共包含43332个 4K页面
- 空闲内存用cfr表示,在压缩池中有943个 4K页面
- 扩展的内存赤字用dxm 表示,共计26267个4K页面
- 每秒压缩操作或者页面换出到压缩池操作用co 表示,共计386次
- 每秒解压缩操作或者从压缩池换入动作用ci 表示,共计174次
再来看lparstat命令的输出,需要使用-c参数显示AME相关信息
# lparstat -c 2 5
System configuration: type=Shared mode=Uncapped mmode=Ded-E smt=On
lcpu=2 mem=1024MB tmem=512MB psize=14 ent=0.40
%user %sys %wait %idle physc %entc lbusy app vcsw phint %xcpu dxm
----- ----- ------ ------ ----- ----- ------ --- ----- ----- ------ ------
45.6 51.3 0.2 2.8 0.95 236.5 62.6 11.82 7024 2 5.8 165
46.1 50.9 0.1 2.8 0.98 243.8 64.5 11.80 7088 7 6.0 162
46.8 50.9 0.3 2.1 0.96 241.1 69.6 11.30 5413 6 19.4 163
49.1 50.7 0.0 0.3 0.99 247.3 60.8 10.82 636 4 8.6 152
49.3 50.5 0.0 0.3 1.00 248.9 56.7 11.47 659 1 0.3 153
下面是对内存压缩相关信息的解释:
- 内存模式用mmode表示,AMS关闭而AME打开
- 扩展后的内存大小用mem 表示,共计1024 MB
- 真是内存大小用tmem 表示,共计512 MB
- CPU用于AME压缩/解压缩的使用百分比用%xcpu表示
- 内存赤字用dxm表示,单位MB
下面是topas命令的输出。如果打开了AME,topas自动显示相关信息:
Topas Monitor for host: proc7 EVENTS/QUEUES FILE/TTY
Mon Dec 14 16:30:50 2009 Interval: 2 Cswitch 1240 Readch 43.2M
Syscall 110.8K Writech 102.5K
CPU User% Kern% Wait% Idle% Physc Entc Reads 12594 Rawin 0
ALL 49.1 50.7 0.0 0.3 1.00 249.7 Writes 515 Ttyout 388
Forks 218 Igets 0
Network KBPS I-Pack O-Pack KB-In KB-Out Execs 218 Namei 5898
Total 1.2 7.5 1.0 0.9 0.3 Runqueue 1.0 Dirblk 0
Waitqueue 0.0
Disk Busy% KBPS TPS KB-Read KB-Writ MEMORY
Total 0.0 0.0 0.0 0.0 0.0 PAGING Real,MB 1024
Faults 53184 % Comp 85
FileSystem KBPS TPS KB-Read KB-Writ Steals 0 % Noncomp 0
Total 75.4K 21.1K 75.3K 95.4 PgspIn 0 % Client 0
PgspOut 0
WLM-Class (Active) CPU% Mem% Blk-I/O% PageIn 0 PAGING SPACE
System 0 61 0 PageOut 0 Size,MB 512
Default 0 4 0 Sios 0 % Used 1
% Free 99
Name PID CPU% PgSp Class AME
inetd 364682 3.5 0.5 wpar1 TMEM,MB 512 WPAR Activ 1
xmtopas 622740 0.4 0.7 wpar1 CMEM,MB 114 WPAR Total 1
topas 413712 0.1 1.5 System EF[T/A] 2.0/1.5 Press: "h"-help
random 204934 0.1 0.1 System CI:5.5 CO:0.0 "q"-quit
下面是对内存压缩相关信息的解释:
- 真实内存大小, TMEM单位MB
- 压缩池大小,CMEM单位MB
- EF[T/A] – 表示目标压缩比参数/实现压缩比参数,当前是2.0/1.5
- co表示每秒压缩页面数, ci表示解压缩页面数,当前0.0和5.5
最后是svmon命令的输出:
# svmon -G -O summary=ame,pgsz=on,unit=MB
Unit: MB
-------------------------------------------------------------------------------
size inuse free pin virtual available mmode
memory 1024.00 607.54 144.11 306.29 559.75 136.61 Ded-E
ucomprsd - 387.55 -
comprsd - 219.98 -
pg space 512.00 5.08
work pers clnt other
pin 213.34 0 0 28.9
in use 534.12 0 9.42
ucomprsd 314.13
comprsd 219.98
PageSize PoolSize inuse pgsp pin virtual ucomprsd
s 4 KB - 543.54 5.02 242.27 560.59 323.55
L 16 MB 4 0 0 64.0 0 0
-------------------------------------------------------------------------------
True Memory: 512.00
CurSz %Cur TgtSz %Tgt MaxSz %Max CRatio
ucomprsd 405.93 79.28 168.38 32.89 - - -
comprsd 106.07 20.72 343.62 67.11 159.59 31.17 2.51
txf cxf dxf dxm
AME 2.00 1.46 0.54 274.21
下面是对内存压缩相关信息的解释:
- mmode,内存模式
- 总计607.54 MB内存被使用,用memory_inuse标记,其中未压缩的页面数387.55 MB用ucomprsd_inuse标记,压缩后的219.98MB用comprsd_inuse 标记
- 其中全部工作内存534.12 MB用inuse_work标记,未被压缩的工作内存ucomprsd_work共计314.13 MB,被压缩过的工作内存comprsd_work 共计219.98MB
- 4KB_inuse显示总计543.54 MB内存使用4K分页,其中4KB_ucomprsd 表示压缩过的4K分页内存,共计323.55 MB
- 内存扩展后的大小用memory_size表示,共计1024MB
- 真实内存大小用True Memory表示,共计512MB
- 当前未压缩内存池大小ucomprsd_CurSz是405.93MB,占分区真实内存的79.28%
- 当前压缩内存池大小comprsd_CurSz是106.07MB,占真实内存的20.72%
- 目标压缩内存池大小comprsd_TgtSz表示要达到既定压缩比目标txf (2.00)需要压缩343.62MB,占真实内存的67.11%
- 当前未压缩内存池的目标大小是ucomprsd_TgtSz168.38 MB,占真实内存大小的32.89%
- 最大压缩内存池大小comprsd_MaxSz159.59MB,占真实内存31.17%
- 当前压缩比率CRatio是2.51,当前扩展比率cxf是1.46
- 扩展内存赤字dxm是274.21MB,扩展赤字比率dxf是0.54
如果使用了svmon命令行参数–O summary=longame则表示显示ame的详细信息:
# svmon -G -O summary=longame,unit=MB
Unit: MB
Active Memory Expansion
--------------------------------------------------------------------
Size Inuse Free DXMSz UCMInuse CMInuse TMSz TMFr
1024.00 607.91 142.82 274.96 388.56 219.35 512.00 17.4
CPSz CPFr txf cxf CR
106.07 18.7 2.00 1.46 2.50
详细信息中包括:
- 全部扩展内存大小Size1024.00MB,其中607.91 MB Inuse 被使用,142.82 MB空闲Free。赤字DXMSz 274.96 MB
- 未压缩内存页UCMInuse388.56MB,压缩内存页CMInuse219.35 MB
- 真实内存TMSz512.00MB,其中17.4MB空闲真实内存TMFr
- 压缩池大小CPSz 106.07MB,其中18.7MB空闲CPFr
- 目标扩展比txf是2.00,当前实现的扩展比cxf是1.46.
- 压缩比率CR 2.50