天天看点

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参数详解

-a supclassname

将范围限于 supclassname 类参数的子类(在层报告 -t 中)。参数是超类名。不支持类列表。

注:

因为该标志会影响性能,所以请谨慎使用。

表示统计信息中只包含客户段。缺省情况下会分析所有段。

显示运行命令名 commandnm1 ...commandnmn 的进程的内存使用统计信息。commandnm 是字符串。它是可执行文件精确的基本名。

对于给定实体,显示属于该实体(用户名或命令名)的进程的内存统计信息。

显示段 sid1 ...sidn 的内存使用统计信息和每个段所有帧的详细状态。指定的段标识符必须关于主段。

显示 class 参数的子类的内存使用统计信息(该参数在工作负载类报告-w 和层报告 -t 中)。-w 或 -a 类参数需要是超类名称。

表示统计信息中只包含持久段(文件)。缺省情况下会分析所有段。

显示帧 frame1...framen 状态,包含其所属的段。如果没有供应帧列表,那么会显示所用内存的百分比。

表示要显示的信息按照在调页空间上保留或使用的页面总数的降序排列。这个标志结合段报告改变了排序列表末尾的非工作段。

显示全局报告。

因为需要花费几秒来收集某些选项的统计信息,所以观察到的时间间隔可能比指定的时间间隔大。

因为该标志会对性能产生潜在的影响(特别是svmon -s ),所以请谨慎使用。

每个显示的段都会显示使用段的进程标识符列表,并且根据报告类型显示进程所属的实体名(登录、命令、层或类)。对于特别的段,会显示标号而不是进程标识符列表。系统段显示标志为 system 的段的标号。未使用段此标号将显示所有的现有进程都未使用的段。例如,与文件相关的持久段不再使用。共享库文本显示包含共享库文本的段的标号,可能大部分进程都使用该共享库文本(例如,libc.a )。这将阻止显示进程的长列表。

段映射源段时,显示关于源段的信息并映射段。缺省值是只显示关于映射段的信息。

表示统计信息中只包含非系统段。缺省情况下会分析所有段。

表示将要显示的信息按照带固定内存的页面总数降序排列。

显示进程 pid1 ...pidn 的内存使用统计信息。pid 是一个十进制的值。如果没有供应进程标识符(pid)列表,那么就会显示所有活动进程的内存使用统计信息。

根据它们是否处理大页面而过滤结果。另外,它显示大页面度量值。

显示已分配的段页面内的范围。因为页面可从两端开始然后向中间移动而得到分配,所以工作段可能具有两个范围。

表示统计信息中只包含系统段。缺省情况下会分析所有段。

显示段 sid1 ...sidn 的内存使用统计信息。sid 是一个十六进制的值。指定的段标识符必须关于主段。如果没有供应段标识符(sid)列表,那么就会显示所有定义的段的内存使用统计信息。

显示要打印的最高 count 对象的内存使用统计信息

显示所有层号 tier1...tiern 的类的内存使用统计信息。如果没有供应层列表,那么就会显示所有定义的层的内存使用统计信息。

表示要显示的信息按照实内存的页面总数降序排列。如果无下列标志出现,这就是缺省的排序标准:-p 、-g 和 -v 。

显示登录名 logname1 ...lognamen 的内存使用统计信息。logname是一个字符串,它是精确的登录名。如果没有提供登录标识符列表,那么就会显示所有定义的登录标识符的内存使用统计信息。

表示要显示的信息按照虚拟空间的页面总数降序排列。这个标志结合段报告改变了排序列表末尾的非工作段。

表示统计信息中只包含工作段。缺省情况下会分析所有段。

显示工作负载管理类 clnm1 ...clnmn 的内存使用统计信息。clnm 是一个字符串。它是一个类的精确名称。对一个子类来说,名称应该具有superclassname.subclassname 的格式。如果没有提供类名列表,那么就会显示所有定义的类名的内存使用统计信息。

显示层报告 -t 中对某个层的每个类的段的内存使用统计信息。

显示在执行 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

     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] ' 

第一个程序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

作者:czmmiao 原文地址:http://czmmiao.iteye.com/blog/1153499