分类: BSD
2012-06-04 16:48:09
内存和交换空间(虚拟内存)一般都是用页面来进行分配和管理的. 在内存中存在两种类型的页面:计算页面(一般为可执行文件段的页面)和文件页面(存储的数据文件的页面). 当我们执行程序或者读入数据的时候, 内存中的页面就逐渐被占用. 当空闲的内存只剩下minfree的时候, vmm的调页进程就被唤醒, 通过调页算法, 将内存中的页面转移到交换空间中. 直到空闲内存达到maxfree, 才停止调页.
空闲列表维护在这里, 我们涉及到两个参数:
1, minfree: 最小空闲页链表尺寸. 一旦低于该值, 系统调页进程启动偷页以填充空闲页链表, 保证有足够的内存页面. 偷页就是将不常用的页面替换出去.
2, maxfree: 最大空闲页链表尺寸. 一旦高于该值, 系统停止偷页.
一般情况下, minfree和maxfree通过下面的公式得到.
Maxfree=minmum(memory/128,128), minfree=maxfree-8
如果发现空闲列表不足, 可以用下面的方法增加.
在5.2以上的版本中可以通过vmo参数实现.
#vmo –o minfree = 1000 –o maxfree = 1008 –P #-P参数使得修改永久生效.
在AIX5.2之前的版本需要使用/usr/samples/kernel/vmtune命令
Vmtune –f 1000 –F 1008
文件占用内存的比率维护数据文件占用的内存不会主动释放, 所以容易造成内存的文件页面过高的占用, 导致其他的应用内存使用紧张. 这里有两个参数跟这个占用相关.
# vmo -a |grep perm
maxperm = 392704
maxperm% = 20
minperm = 98175
minperm% = 5
strict_maxperm = 0
如上所示的两个参数解释如下:
1, minperm: 用户IO文件访问的最小缓冲页数;
2, maxperm: 用户io文件访问的最大缓冲页数;
这里主要与性能相关的是maxperm. Maxperm参数指定了文件页面可以占用内存的上限.调整参数值的方法如下.
Aix5.2以上的版本使用vmo命令
#vmo –o maxperm%=80 –o minperm%=20
在Aix5.2之前的版本一样要使用vmtune命令
#vmtune –p 20 –P 80 –P
命令显示内存中的数据页数# vmstat -v |grep perm
5.0 minperm percentage
20.0 maxperm percentage
19.8 numperm percentage
系统调页的规则
1, 如果numperm>maxperm, 则只调出文件页面;
2, 如果numperm
3, 如果minperm
如果系统在向调页空间调出页面,可能使因为内存中的文件页数低于maxperm,从而也调出了部分的计算页面以达到maxfree的要求。在这种情况下,可以考虑把maxperm降低到低于numperm的某个值,从而阻止计算页面的调出。在5.2 ML4以后的版本中,为了防止计算页面被调出,可以采用另外一个方法,就是设置参数lru_file_repage=0。将该参数设为0,则告诉vmm在进行页面替换的时候,优先替换文件页面。
maxclient通常应该设置为一个小于或者等于maxperm的值。
增强JFS文件系统为它的缓冲区高速缓存使用客户机文件,这不受maxperm和minperm的影响。为了在限制增强JFS文件系统使用高速缓存,可以指定maxclient的值,避免在它进行页面替换的时候,替换其他类型的页。
使用vmstat确定内存的使用情况该命令可迅速提供关于各种系统资源和与之相关的性能问题的简要信息.
作为一个cpu监视器, vmstat命令优于iostat命令, 因为vmstat命令是滚动的, 使得它的每一行报告的输出更容易扫描. 并且如果有很多磁盘链接到系统中, 由此所涉及到的开销更少.
# vmstat 2
System configuration: lcpu=8 mem=8192MB
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 0 1596212 186517 0 0 0 0 0 0 157 2242 757 5 0 95 0
1 0 1602824 179905 0 0 0 0 0 0 276 8731 986 23 1 76 0
1 0 1609397 173332 0 0 0 0 0 0 298 5696 1118 27 1 72 0
1 0 1609407 173322 0 0 0 0 0 0 276 5630 1046 23 1 77 0
1 0 1609593 173136 0 0 0 0 0 0 1209 10754 3699 10 3 87 0
1 0 1609630 173099 0 0 0 0 0 0 637 8595 2061 26 1 72 0
要检查内存是否是瓶颈, 考虑vmstat报告中的memory列, pages列以及faults列
故障kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 0 1596212 186517 0 0 0 0 0 0 157 2242 757 5 0 95 0
1 0 1602824 179905 0 0 0 0 0 0 276 8731 986 23 1 76 0
In:
每秒设备中断数
Sy:
每秒系统调用次数.
Cs:
每秒钟的上下文切换次数. 物理cpu资源细分为10毫秒的逻辑时间片, 假设一个线程调度被运行, 它将一直运行直到它的时间片用完,或被抢先,或者自愿放弃cpu控制权. 当给予另一个线程cpu控制权时, 必须保存前一个线程的上下文或工作环境, 并且必须装入当前线程的上下文. 操作系统有一个很有效的上下文切换过程, 所以每次切换并不耗资源. 任何上下文切换的显著增加, 如当cs比磁盘io和网络信息包速率高很多, 都应进行进一步调查.
内存)kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 0 1596212 186517 0 0 0 0 0 0 157 2242 757 5 0 95 0
1 0 1602824 179905 0 0 0 0 0 0 276 8731 986 23 1 76 0
1 0 1609397 173332 0 0 0 0 0 0 298 5696 1118 27 1 72 0
Avm列表表示活动虚拟内存的页面数, 每页一般4KB
Fre表示空闲的页面数.
磁盘交换kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 0 1596212 186517 0 0 0 0 0 0 157 2242 757 5 0 95 0
1 0 1602824 179905 0 0 0 0 0 0 276 8731 986 23 1 76 0
1 0 1609397 173332 0 0 0 0 0 0 298 5696 1118 27 1 72 0
Re: 该列无效
Pi: 从磁盘交换到内存的交换页(调页空间)数量, 4KB/页. 当进程访问一个交换页时就产生一个缺页故障.
Po: 从内存交换到磁盘的交换页数量, 4KB/页. 如果写入的交换页在交换区间内不存在或者已经做了修改, 则写入交换区间. 如果不被再次访问, 则会留在调度空间中直到进程终止或者放弃空间.
Fr: 根据页面替换算法每秒释放的页数. VMM的页面替换例程会定时扫描页面祯表, 以释放一些长时间没有访问的数据页到空闲列表. 在这个过程中, 计算页面不会产生IO, 工作页面如果数据没有发生修改, 也不需要写回磁盘, 不会产生IO.
Sr: 为了释放页面扫描的页数. Sr值如果比fr值高很多, 说明替换算法要查找可疑替换的页面越困难.
Cy: 每秒页面替换代码扫描了PFT多少次, 因为增加空闲列表达到maxfree值, 不一定需要完全扫描PFT表, 就是说这个值一般会小于1, 而所有vmstat输出都为整数, 所以cy通常为0.
命令Svmon主要用来捕获并分析虚拟内存快照.
# svmon -G -i 2 2
size inuse free pin virtual
memory 2097152 2007242 89910 488437 1598949
pg space 4194304 4268
work pers clnt other
pin 303244 0 1802 183391
in use 1598949 0 408293
PageSize PoolSize inuse pgsp pin virtual
s 4 KB - 1934298 4268 434309 1526005
m 64 KB - 4559 0 3383 4559
size inuse free pin virtual
memory 2097152 2007238 89914 488439 1598945
pg space 4194304 4268
work pers clnt other
pin 303246 0 1802 183391
in use 1598945 0 408293
PageSize PoolSize inuse pgsp pin virtual
s 4 KB - 1934294 4268 434311 1526001
m 64 KB - 4559 0 3383 4559
段l Size(大小): 物理内存总页数. 4KB/页
l Inuse(正在使用): 物理内存中正在使用的内存页面数. 包含活动进程和已经终止的持久文件页面.
l Free(空闲): 空闲列表中的页面数量
l Pin(固定内存): 锁定在内存中的页面数量(锁定的意思就是不能被替换出去)
l Virtual(虚拟内存):分配于系统虚拟空间的页数.
段Size(): 调页空间总大小
Inuse(): 已经分配页的总数, 也就是已经使用的调页空间页数
段指定包含固定内存的页面的实际内存的子集上的统计信息
l Work(): 物理内存中的工作段内存的页数
l Pers(): 物理内存的持久段页面的帧数.
l Clnt(): 物理内存中客户段页面的帧数.
段指定正在使用的实际内存子集的统计信息
l Work(): 物理内存中的工作段内存的页数
l Pers(): 物理内存的持久段页面的帧数.
l Clnt(): 物理内存中客户段页面的帧数.
命令显示当前运行的进程状态# ps gv | sort +6b -nr |head -10
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
561232 - A 30:59 0 9248 84184 xx 50614 74936 0.0 1.0 ora_pmon
454728 - A 0:14 0 8900 83836 xx 50614 74936 0.0 1.0 ora_s000
729338 - A 3:12 0 8840 83776 xx 50614 74936 2.0 1.0 oracleSI
581808 - A 1710:17 6 8528 83464 xx 50614 74936 0.1 1.0 ora_lms0
942332 - A 2:24 7 8500 83436 xx 50614 74936 0.0 1.0 ora_arc0
868444 - A 1:06 39 8496 83432 xx 50614 74936 0.0 1.0 ora_arc1
442494 - A 1715:12 9 8372 83308 xx 50614 74936 0.1 1.0 ora_lms1
647186 - A 98:48 12 7912 82848 xx 50614 74936 0.0 1.0 ora_lmd0
725148 - A 5:09 0 7460 82396 xx 50614 74936 1.8 1.0 oracleSI
573582 - A 143:00 0 7068 82004 xx 50614 74936 0.0 1.0 ora_lmon
我们可以用下面的方法查看具体的进程在干什么事情.
例如我们查看PID = 487432的进程, 可以使用下面的方法.
# su - oracle
[YOU HAVE NEW MAIL]
$ sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Tue Jul 14 17:24:42 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn / as sysdba
Connected.
SQL> oradebug setospid 487432
Oracle pid: 12, Unix process pid: 487432, image: oracle@i2db (MMNL)
SQL> oradebug event 10046 trace name context forever,level 8
Statement processed.
SQL> oradebug tracefile_name
/oracle/admin/arpdb/bdump/arpdb_mmnl_487432.trc
SQL> oradebug event 10046 trace name context off
Statement processed.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
$ tkprof /oracle/admin/arpdb/bdump/arpdb_mmnl_487432.trc
output = arpdb_mm1.txt
TKPROF: Release 10.2.0.3.0 - Production on Tue Jul 14 17:31:29 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
$
内存的调整具体调整需要结合系统运行的应用程序对症下药,如调整minperm/maxperm将改变内存与PAGING SPACE之间的交换算法,调整minpgahead/maxpgahead将改变内存块请求机制,调整minfree/maxfree将改变内存紧张时的内存清理刷新机制,等等。如果数据库使用裸设备,并且没有太多其他的应用,因为裸设备不需要文件系统的缓存,所以可以降低minperm,maxperm,maxclient的默认值,降低操作系统对内存的不必要的占用。
案例:
计费数据库数据库响应变慢,内存16G,裸设备,却存在很多的PI,PO情况。
在检查与内存相关的系统参数,发现如下问题:
minperm% = 20, maxperm% = 80, maxclient% = 80
说明:以上三个参数为系统缺省配置,其表示,使用文件系统时,最多可使用80% * 16G=10.8G,用于缓存所访问的文件。
结论:由于以上参数采用系统缺省配置,文件系统缓存最大可以达到10.8G,在执行大量的文件cp操作后,系统的可用内存量迅速下降,在其后的计费过程中,由于大量page in/page out操作引起系统严重性能瓶颈。
优化:
将maxperm% = 30 ,maxclient% = 30
#vmo –o maxperm%=30 –P
#vmo –o maxclient%=30 –P
5.2以前版本
/usr/samples/kernel/vmtune –p 20 –P 30
/usr/samples/kernel/vmtune –t 30