AIX操作系统中Paging Space是很重要的设备,当系统中Paging Space使用率过高、系统内存不足时,将影响系统的整体性能,甚至会造成系统的挂起。针对这种情况,通常可以靠增加Paging Space来加以缓解;但是当Paging Space已经相当大,而Paging Space使用率仍旧居高不下时,则需要通过进一步的分析来找出原因并加以解决。文中分析了几种Paging Space使用率持续增长直至过高的常见原因,并给出了相应的解决方案,以确保Paging Space使用率被控制在安全的范围内。
1 Paging Space的创建原则
AIX中Paging Space大小确定的指导原则如下:
- 系统实际内存小于64MB, paging space= 2 * RAM ;
- 系统实际内存在 64MB to 256MB 之间, Page Space = RAM size + 16MB ;
- 系统实际内存大于 256MB , Page Space = 512 + ( RAM - 256 ) * 1.25 ;
- 当内存超过4GB时,则需要根据实际情况来定,一般可初始3GB, 然后观察paging space的使用情况,如果使用率超过70%, 则需要增加paging space 。
此外在创建Paging Space时还应遵循以下原则以提高性能:
- 创建的数量应尽可能的多;
- 每个Paging Space的大小应该相同;
- 每个Paging Space应尽可能的分配在不同的硬盘上。
AIX中可以通过命令lsps -s查看Paging Space的使用情况。列Total Paging Space给出的是系统总的Paging Space空间大小,Percent Used则表示已被占用的Paging Space的百分比。
命令lsps -a可以用来查看Paging Space的分布情况
2 文件型内存对Paging Space使用率的影响
在AIX系统中,内存可以简单的分为两类:计算型内存和文件型内存。类似大量文件类操作,如压缩、数据库的dump/load等操作会大量占用文件型内存。如果按照系统缺省的配置,文件型内存最多会占用到内存总量的80%,由于文件型内存占用并不主动释放,从而可能造成内存资源的短缺及Paging Space使用率过高。
命令topas可以用来查看文件型内存占用内存情况,在MEMORY一栏中的%Noncomp显示的是文件型内存的占用百分比。
如果文件型内存所占比例很高,而Paging Space使用率居高不下时,可以通过降低minperm、maxperm的参数值来进行调优,减少文件型内存可占用的份额。
在进行调整前,首先通过命令vmo -a/vmtune -a来查看目前的参数值;minperm及maxperm的缺省值分别是30%和80%。
随后根据当前的值来确定minperm、maxperm新的参数值,并通过命令vmo 及参数p和P来进行设定。如需将minperm、maxperm的值分别设为15%和30%可用命令vmo -p 15 -P 30来实现。
因为参数maxperm充当的是软限制,所以文件型内存的占用率依旧可以超过maxperm的设定值。如果需要进行强制限制,则需要将参数strict_maxperm的值设为1,该参数的缺省值为0,但此方法需谨慎使用。
3 应用程序内存泄露对Paging Space使用率的影响
应用程序的内存泄露也是造成Paging Space使用率不断增长的另一常见原因,此类情况的解决方法主要是找出内存泄露的应用,然后进行修正或安装补丁。
以下方法可用来找出发生内存泄露的应用:
该命令每m秒钟按降序列出前n个最耗内存进程。为了便于分析,可以将结果输出到文件中,然后对内容进行分析,从而找出内存泄露的应用。
下例中命令svmon -P -t 10 -i 5的结果被输出到文件svmonresult.txt中,该命令每5秒种输出一次最耗内存的前10个进程。
找出发生内存泄露的应用后可自行进行修正或查找相关的补丁进行安装。
4 数据库参数配置对Paging Space使用率的影响
在装有数据库的系统环境中,数据库相关参数的设置不当也容易造成Paging Space的占用率过高。以DB2为例,因为 DB2 使用自己的缓冲池进行数据缓存,所以其所能占用的内存量不受参数maxperm的控制,而是由自身的参数值来决定。数据库占用的内存过多并且不及时释放的话同样会造成Paging Space使用率的持续增长乃至耗尽,本节中采用DB2的设置为例来对此类情况进行说明。
就Paging Space使用率而言,DB2的相关参数中需要特别关注的有DB2MEMDISCLAIM、DB2MEMMAXFREE、NUM_POOLAGENTS、 ESTORE_SEG_SZ及NUM_ESTORE_SEGS。其中DB2MEMDISCLAIM、DB2MEMMAXFREE、NUM_POOLAGENTS与DB2中代理的私有内存相关,而ESTORE_SEG_SZ、NUM_ESTORE_SEGS则决定扩展缓冲池的大小。
AIX中,注册变量DB2MEMDISCLAIM指明当程序停止时DB2 UDB是否应该释放其占用的全部或部分内存。DB2MEMDISCLAIM保持缺省值YES,则在DB2MEMMAXFREE的值为空时,程序结束后释放所有相关内存,否则只保留DB2MEMMAXFREE值大小的内存量,该值缺省为8M。如果DB2MEMDISCLAIM的值被改为NO,则程序结束后内存不会被释放。
NUM_POOLAGENTS指定了DB2中可以保留的空闲代理的最大数目,如果该值过大,将会有大量的内存被空闲代理占用。如NUM_POOLAGENTS的值为125,DB2MEMMAXFREE的值为8M,在DB2MEMDISCLAIM为YES时将最多有约1G的内存被空闲代理占用。
因此,当Paging Space使用率偏高时,可以尝试查看DB2MEMDISCLAIM、DB2MEMMAXFREE、NUM_POOLAGENTS的值来确保没有过多的内存被DB2代理所占用。如果空闲代理占用内存太多,则需要调整DB2MEMMAXFREE、NUM_POOLAGENTS的值来削减。
DB2MEMDISCLAIM、DB2MEMMAXFREE的值可用db2set命令来查看和设定;NUM_POOLAGENTS的值则可以通过以下步骤来查看和修改:
DB2中除了主缓冲池之外还经常用到扩展缓冲池,扩展缓冲池的大小也是决定内存使用量的一个重要因素。扩展缓冲池(EXTENDED STORAGE)充当的是缓冲池中被换出页的辅助缓存,它的存在可以减少I/O操作,提高查询速度。通常扩展缓冲池占用的内存不会主动释放,因此如果扩展缓冲池过大,随着时间的增加、缓冲池占用的内存量的不断增长,有相当大的可能造成内存资源的短缺、Paging Space使用率过高。
扩展缓冲池的大小是由参数ESTORE_SEG_SZ、NUM_ESTORE_SEGS共同决定的,通过以下命令可以查看它们的值:
扩展缓冲池最多占用内存的计算方式如下:
假如系统中共有3个配置相同的DB,ESTORE_SEG_SZ的值为16000,NUM_ESTORE_SEGS的值为65,页面大小为4K,则扩展缓冲池最多可占用的内存为:
ESTORE_SEG_SZ、NUM_ESTORE_SEGS的参数值设定可以通过如下命令来实现:
DB2中还有其他一些参数决定着内存的使用情况,但是当发现内存占用后不释放的情况时,可以考虑首先查看本节中提到的相关参数。
对于其他的数据库,同样也需要注意一些类似参数值的设置,避免造成对内存的过量占用,从而造成对系统整体性能的影响。
转自《http://www.ibm.com/developerworks/cn/aix/library/au-cn-pagingspace/》