AIX的SVMON命令详解(原创)
svmon概述
svmon 命令用于显示当前内存状态的信息,可通过
#lslpp bos.perf.tools
查看是否有安装。因为 svmon 命令在启用中断的用户级别运行,所以显示的信息不组成真正的内存快照。在非常繁忙的系统中,svmon收集的数据和真实的数据有所差距,在svmon进程搜集的过程中,VMM(虚存管理器)可能已经发生改动了。
因为svmon使用的全是VMM中的数据,而VMM对内存的视图是基于内存段的,所以,理解svmon的输出,必须先理解段的概念。
段
段(segment)是一组页的合集,用来报告内存消耗的基本对象。因此 svmon 所报告的统计信息是以页面表示的。每个段为256M,而每页为4KB字节的虚存,每帧为4KB字节的实存,每个段可同时被多个进程使用,每个段属于以下五种类型其中的一种:
persistent:存放JFS文件或目录
working:进程数据区域和共享内存段
client:用于实现虚拟文件系统如NFS,CD-ROM文件系统和JFS2
mapping:用于实现文件和内存之间的映射关系
real memory mapping:用于对I/O空间的访问
svmon参数详解
具体使用范例
1、全局统计信息
#svmon -G
???????????? ? ?? size????? ? ? ? ? ? ? inuse???? ?? ? free? ? ?? ????? pin?? ? ? ? ?? virtual? ? ?? mmode
memory?? ?? 3932160???? 2729499???? 1202661????? 818627???? 1616925? ??? Ded
pg space??? 8388608??????? 8595
?????????????? work????? ? ?? pers??????? clnt?????? other
pin????????? 675474????????? 0??????? 2801???? 140352
in use????? 1616925??????? 0???? 1112574
PageSize??? PoolSize?????? inuse???? ?? pgsp???????? pin??? ? ? ? ? virtual
s??? 4 KB?????? ?? -?????? 1966891???? ?? 8595????? 209571????? 854317
m?? 64 KB???????? -?? ? ?? 47663?????????? 0????? ? ??? 38066 ????? 47663
其中
inuse-------已使用的
free---------空闲的
pin-----“钉”在内存中的内存段(笔者认为这不是固定内存段)
virtual-----虚拟内存段
work------工作内存段
pers-------固定内存段
other-------mapping和real mapping memory
PageSize-----不同内存页大小的统计情况,s为常规页面,大小为4k,m为大页面大小为64k。
pgsp------分页空间的使用情况
注意,在段的描述中,如果paging space使用的节中如果有一横(-),表明该段未使用交换区,work段可能使用交换区,但persistent段和client段不会使用交换区。
2、打印 1/2 小时中每分钟的全局统计信息,请输入:
#svmon -G -i 60 30
3、要打印出只考虑工作段的用户 root 和 steve 的内存使用统计信息,请输入:
#svmon -U root oracle -w
===============================================================================
User???????????????????????????????? Inuse????? Pin???? Pgsp? Virtual
oracle????????????????????????????? 558293??? 16880??????? 0?? 558293
???? PageSize??????????????? Inuse??????? Pin?????? Pgsp??? Virtual
???? s??? 4 KB????????????? 515157???????? 80????????? 0???? 515157
???? m?? 64 KB??????????????? 2696?????? 1050????????? 0?????? 2696
........................................................................................
SYSTEM segments???????????? Inuse????? Pin?? ? ? Pgsp ?? Virtual
???????????????????????????????????? 13129???? 8552??????? 0?? ?? 13129
???? PageSize??????????????? Inuse??????? Pin?????? Pgsp??? Virtual
???? s??? 4 KB?????????????? ? 3785?????? 72????????? 0?????? 3785
???? m?? 64 KB??????????????? 584??????? 530??????? 0??????? 584
??? Vsid????? Esid? Type? Description???????? ? ? ??? PSize? Inuse?? Pin??? Pgsp ? Virtual
?? 20002????? 0 ?? work? kernel segment????????????? m?? ? 584 ?? 530? ?? 0?? ? ? 584
以上省略一部分输出。。。。
用户运行的进程所使用的段分成三个类别:
系统:所有进程共享的段
互斥:属于oracle 的进程集所使用的段
共享:几个用户共享的段。
其中
Vsid:表示虚拟段标识符。表示在虚拟内存管理器中的唯一段。
Esid: 表示有效的段标识符。Esid只有在段属于进程的地址空间时才有效。提供时,它表示进程如何使用段。如果 vsid 段被几个进程映射,但具有不同的 esid 值, 那么该字段包含“-”。如果是那样的话,那么通过应用于使用该段的每个进程标识符的 -P 标志,可以获得精确的 esid 值。因为用于管理打开的文件或多线程结构的段不是进程的用户地址空间的一部分,所以也对这些段显示“-”。
3、可将使用实存最多的三个进程标出
# svmon -uP -t 3|grep -p Pid|grep '^.*[0-9] '
5428 X 4681 1584 2656 9156 N N
16274 bin 4594 1588 2273 8824 N Y
6458 dtgreet 4660 1580 2144 8712 N N
输出的格式顺序为 Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd
可以计算出X程序所使用的实存为4681×4096=18763776,约为18MB
4、可将使用交换区最多的三个进程标出
# svmon -gP -t 3|grep -p Pid|grep '^.*[0-9] '
5428 X 4681 1584 2656 9156 N N
16274 bin 4594 1588 2273 8824 N Y
6458 dtgreet 4660 1580 2144 8712 N N
第一个程序X所使用的交换区大小约为 2566×4096 =10510336 字节,大约为10MB空间
5、每隔三秒显示使用最多的段
# svmon -S -t 3 -i 3
Vsid Esid Type Description Inuse Pin Pgsp Virtual
4f08 -??? clnt 37505 0 - -
11e1 -??? clnt 33623 0 - -
8811 -??? work kernel pinned heap 12637 6547 8091 19397
可见,Vsid为4f08的段使用最多
6、看PID为22674的进程所使用的为固定内存
#svmon -pP 22674?
7、要打印出段 700e 8811 和 bed7 的内存使用统计信息,请输入:
#svmon -S 700e 8811 bed7 1cf8e
8、打印出命令 login,ksh的内存使用统计信息, 包括地址范围,请输入:
#svmon -C login ksh -r
9、要打印出只考虑非系统工作段的所有进程的内存使用统计信息,并且根据虚拟页面数对该进程排序,请输入:
#svmon -P -n -w -v
10、根据实内存的页数将系统段排序,并且打印出结果列表中最高的 10 个系统段,请输入:
#svmon -S -s -u -t 10
11、只打印大页面段,请输入:
#svmon -S -q
常见问题分析
svmon -S中inuse的求和结果比svmon -G中的inuse小
下面的脚本可以用来统计svmon -S中的inuse的相加结果:
==============================================
#!/usr/bin/ksh
svmon -S | cut -c54-62 | awk '/^[-sLm]/ {if ($1 ~ /L/)
{COUNT1 =($2*4096+COUNT1)}
else if ($1 ~ /m/)
{COUNT2 =($2*16+COUNT2)}
else {COUNT3 =$2+COUNT3}}
END {printf "The result is as following with 4k as unit size\n16M page count=%d\n64k page count=%d\n4k page count=%d\nTatal page count=%d\n", COUNT1,COUNT2,COUNT3,'COUNT1+COUNT2+COUNT3'}'
========================================================
那么,产生这种差别的原因是什么呢?解释如下:
svmon -S用来显示系统中所有内存段(segment)的内存使用信息。AIX上仅存在三种内存段,它们是work,client和persistent。因此,统计svmon -S中inuse的和就是将被使用的上述三种内存段进行求和。但是,这种统计并没有将系统上所有的被使用的内存页面统计进来。系统里存在着一些尚未被VMM管理的内存页面(mapping和real mapping memory),这些页面已经被使用,但是不属于上述三种内存段,因此在svmon -S中体现不出来。而svmon -G则包含了这些未被管理的页面。
这些未被VMM管理的内存主要是被硬件使用,用来对物理内存做一些设置。在AIX 5L中,可以通过在kdb执行vmstat来查看未被管理的内存,输出如下:
VMM Memory Limits:
Total available memory (4K frames) : 00100000 4.0GB
Total unmanaged mem (wlm_hw_pages): 0000D639 214.3MB
4K number of frames : 000F29C7 3.8GB
4K frames pinned : 00009FEE 160.0MB
4K system pinnable frames remaining: 000B817E 2.9GB
4K user pinnable frames remaining : 000BC0BC 3.0GB
Free paging space (in 4K blocks) : 0001FD00 509.0MB
Paging space SIGDANGER level : 00001000 16.0MB
Paging space SIGKILL level : 00000400 4.0MB
其中“unmanaged mem”就代表这类未被VMM管理的内存页面
?
参考至:http://www.eygle.com/digest/2009/07/ibm_aix_svmon.html
http://www.kuqin.com/aixcmds/aixcmds5/svmon.htm#c013820260joy
http://www-900.ibm.com/cn/support/viewdoc/detail?DocId=2811998D15000