oracle优化学习笔记之AIX下的虚拟内存管理策略

发布于:2024-04-16 ⋅ 阅读:(21) ⋅ 点赞:(0)

AIX采用了基于分页的虚拟内存机制。页面一般都是统一大小的(默认页面大小4k,当然也可以启用大页面内存支持,POWER5 芯片支持四种虚拟内存页面的大小:4KB64KB16MB 和 16GB),这样可以简化整个的管理算法。页面是基于整个虚拟内存地址空间分割的,一个页面最终可能映射到物理内存,也可能映射到磁盘的交换区(paging space)上。很明显,内存中的页面访问速度要快得多,但是内存大小有限,某些页面将不得不被挤出内存。淘汰页面的算法一般都是基于LRU算法的,通过ps -k可以看到AIX有一个lrud的内核守护进程,就是AIX分页替换守护进程。

AIX将所有的内存页面分成两大类型:

  • 工作存储分页(Working storage pages)
  • 永久存储分页(Permanent storage pages)

工作存储分页的内容都是易失性的,在磁盘上没有对应的永久存储文件数据,诸如进程数据/堆栈/共享内存/内核数据等,都是这一类的。而永久存储分页其实就是文件数据。分成这两种类型,是因为从内存中淘汰页面时,需要做不同的处理。对于工作存储分页,只要释放掉对应的内存页面(其实就是修改某些标志位)就可以了。而永久存储分页,则需要判断是否有数据修改,没有修改的话,和工作存储分页的处理一样,直接标志回收即可,如果有修改,则需要将相应的修改数据写回磁盘。

而根据缓存的文件的不同,永久存储分页又分成两种,一种就是新的jfs2文件系统和NFS文件系统的文件缓存,叫做客户端分页(Client pages)。而原来老的jfs文件系统的文件缓存页面,就是非客户端页面(Non-client pages)

上面对于分页的分类法,是根据缓存的数据类型,需要在淘汰时选择不同的处理方式。而AIX在选择哪些页面需要淘汰的时候,却是按照另外一种标准的。根据这个标准,可以将所有分页分成另外两种类型:

  • 计算型分页(Computational pages)
  • 非计算型分页(Non-computational pages)

首先,所有的工作存储分页都是计算型分页,也就是说,Oracle的PGA/SGA等都是属于计算型分页的。而永久存储分页,则根据缓存的文件的类型,如果是可执行文件,则对应的分页是计算型的,如果是数据文件,则是非计算型的,同一个文件对应的页面,要么全部是计算型,要么全部是非计算型的。显然的,为了提供Oracle等应用的性能,假如需要淘汰页面,优先应当交换非计算型页面。

可以通过设置一些内核参数,来影响AIX对于页面的淘汰算法。这些参数都可以通过vmo命令进行调节(AIX5.2 TL6版本以上)。

minperm%(minperm) 和 maxperm%(maxperm) 是最基本的两个参数,分别表示用于缓存非计算型页面的最小和最大内存比例(页数),但maxperm不是严格限制参数,在系统还有空闲内存的时候,非计算型内存的使用是可以突破maxperm的设置的。另外有个参数strict_maxperm可以指定是否严格限制(默认0表示不是严格限制),但是最好不要使用严格限制,在我们的测试中,可能导致os挂起。minperm和maxperm主要是影响淘汰算法:

  • 当非计算性分页的数目大于或者等于 maxperm 的时候,AIX 分页替换守护进程严格地选择非计算性分页进行操作。
  • 当非计算性分页的数目小于或者等于 minperm 的时候,AIX 分页替换守护进程将选择计算性分页和非计算性分页进行操作。在这种情况下,AIX 将扫描两类分页,并且回收近来较少使用的分页。
  • 当非计算性分页的数目在 minperm 和 maxperm 之间的时候,这种情况比较复杂,其行为还受两外一个参数的影响:lru_file_repage。如果 lru_file_repage=1,那么 AIX 分页替换守护进程将根据其内部重新分页表来确定选择何种类型的分页进行操作。AIX 内核通过内部重新分页表来确定哪一类分页的重新分页工作更加频繁,将优先替换使用不太频繁的页面类型的页面。可能只是非计算型的,也可能是计算型和非计算型的。如果lru_file_repage=0,则只替换非计算型页面。

minfreemaxfree则是控制在空闲列表中的页面数在少于minfree开始主动执行页面淘汰算法,直到超过maxfree的数目,也就是通过预先执行页面替换,来保证系统中维持一定数量的可用页面。通常可以设置minfree=120 * CPU数,maxfree= 128 * CPU数。

maxclient%(maxclient)参数指定客户端页面可以使用的最大内存比例(页数),因为客户端页面其实是永久存储页面的一种,所以maxclient不能设置超过maxperm。值得注意的是,maxclient是严格限制的,因为strict_maxclient默认等于1。

上述各种类型的页面信息,可以通过一些os工具查看:

#vmstat -v
 ...
    9.9 numperm percentage          --非计算型页面占比
 387427 file pages                  --非计算型页面数
 ...
    9.9 numclient percentage        --客户端页面占比
   10.0 maxclient percentage
 387427 client pages                --客户端页面数
 ...

svmon -G
               size      inuse       free        pin    virtual
memory      4104192    1694342    2409850    1096659    1290215
pg space    4194304       3733

               work       pers       clnt
pin         1096659          0          0
in use      1290215          0     404127

注意到pin住的都是工作存储页面(work),这是正确的,因为我们设置了oracle的SGA pin在内存当中,要在AIX上将SGA pin在内存中,需要设置两个内核参数:v_pinshm = 1表示允许pin共享内存段;maxpin%表示允许pin的最大内存比例,然后还需要设置Oracle的初始化参数lock_sga=TRUE。永久存储页面(pers)为0,因为没有使用jfs文件系统,而jfs2使用的是客户端页面(clnt)。这里svmon统计的数据和vmstat有点出入。这是因为vmstat统计是按照计算型和非计算型的,而svmon则是按照工作存储页面和永久存储页面的。对比两个命令的结果,可以推算客户端页面中有404127-387427=16700个计算型页面。

另外,在topas中,也可以看到一些各种类型页面和交换的大概信息:

PAGING           MEMORY
Faults    27230    Real,MB  107008
Steals        0  % Comp     95.6
PgspIn        2  % Noncomp   5.1
PgspOut       0  % Client    5.1
PageIn        2