2007年5月31日星期四

Check how much memory being used
检测有多少内存正被使用

检测有多少内存正被使用
一些测试性能的工具提供了内存使用的报告。我们最感兴趣的报告是由 vmstat , ps ,和 svmon 命令提供的。

vmstat 命令(内存)
vmstat 命令概括了系统中所有进程所使用的活动的虚拟内存,同时还有空闲列表上实际内存页的数量。活动的虚拟内存被定义为虚拟内存中实际可以得到的工作的段页的数量(参考页面后分配中的定义)。 这个数字可能大于机器中实际页面的帧,因为一些动态虚拟内存也可能写到字分页空间以外去。

在检测内存是否短缺或者是否有需要调优内存,一系列时间间隔里输入 vmstat 命令,在结果报告中检验 pi 和 po 栏。 这两栏表明了每秒页面调入的页数和每秒调出的页数。如果该值经常为非零值,说明可能存在内存瓶颈。偶尔出现的非零值不用在意因为页面调度是虚拟内存的主要原理。

# vmstat 2 10
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
1 3 113726 124 0 14 6 151 600 0 521 5533 816 23 13 7 57
0 3 113643 346 0 2 14 208 690 0 585 2201 866 16 9 2 73
0 3 113659 135 0 2 2 108 323 0 516 1563 797 25 7 2 66
0 2 113661 122 0 3 2 120 375 0 527 1622 871 13 7 2 79
0 3 113662 128 0 10 3 134 432 0 644 1434 948 22 7 4 67
1 5 113858 238 0 35 1 146 422 0 599 5103 903 40 16 0 44
0 3 113969 127 0 5 10 153 529 0 565 2006 823 19 8 3 70
0 3 113983 125 0 33 5 153 424 0 559 2165 921 25 8 4 63
0 3 113682 121 0 20 9 154 470 0 608 1569 1007 15 8 0 77
0 4 113701 124 0 3 29 228 635 0 674 1730 1086 18 9 0 73注意到输出列队里的高输入输出等待,也注意到阻塞队列里线程的数量。最有可能输入输出等待是因为从字分页空间的出入调度。

为了了解系统的 VMM 是否有问题,可以检查 memory 和 page这两栏。

内存
提供了实际和虚拟内存的信息。

avm
avm (活动的虚拟内存) 一栏显示目前 vmstat 样本收集的动态虚拟内存的页数。从AIX 4.3.2开始,一项页面空间延时策略在默认值下开始生效。在该项策略下, avm 的值可能比字分页间空使用的页数还要高。avm 统计信息并不包含文件页面。

注:
从AIX 4.3.2开始的版本中,报告该值时有微小变化。参看查看页面调度空间和内存会有该项解释。
在AIX 4.3.2之前的版本中,avm 字段里的数字除以256可以得到分配给系统级的字分页空间的大致数目,以兆字节 (MB) 计算. 这同样适用于AIX 4.3.2和以后的版本,即使改变了页面空间默认值。在AIX 4.3.2之前,同样的信息会在 Percent Used 一栏中反映出来,用 lsps -s 命令输出或者 svmon -G 命令,在 pg space inuse 字段下也可以看出。

fre
fre 栏显示出空闲内存页面的平均数量。一个页面是实际内存中的 4KB 的区域。系统为内存页面建立了一个缓冲区,称为空闲列表。当 VMM 需要空间时可以立即访问此空闲列表。VMM 在空闲列表中保存最少页面的数量决定于minfree 参数,该参数执行 vmtune 命令可以得到。(相关细节可以参看 用 vmtune 命令调优 VMM 页面的替换)。

当一个应用程序终止时,它所有的工作页面会立即还给空闲列表。然而,它的持久页面(文件)仍保存在 RAM 中,不会被归还到空闲列表中,直到被 VMM 为其他程序而窃取。如果文件被删除的话,其相应的持久页面将被释放。

就因为这个原因, fre 的值可能不一定表明了进程立即可用的所有实际内存。如果需要页帧,那已终止应用程序的持久页面将会比所有其他程序的容易得到。

如果 fre 的值远大于 maxfree 的值,那不太可能系统颠簸。系统颠簸意味着系统一直在进行出入页面调度。然而,如果系统正在试验抖动,您可以肯定 fre 的值会很小。

页面
页面错误和页面调度活动地信息。他们是一段时间的平均值并以每秒作为单位给出。

re
注:
在AIX V4中不再支持回收,因为它的价值(提供的有限的系统性能的信息)无法弥补跟踪回收算法对系统的负面影响。
pi
pi 一栏显示了字分页空间调入数量(速率)的详细信息。字分页空间是驻留在磁盘上的虚拟内存的一部分。当内存过量使用时,它用作超出部分的内存。调度空间由用于存储从实际内存中窃取到的工作页面的逻辑卷组成。当进程访问一个窃取页时,产生了一个页面错误,这一页必须由字分页空间读入内存。

因为硬件配置,软件和应用程序的不同,没有绝对的数字可以用以参考。但是每秒每页面调度空间插入五页的速度应该是上限。这个准则不必严格遵守,只作参考。这个字段作为一个字分页空间活动的关键指示符。如果发生页面调进,就一定有一个较早的页面调出。在约束内存环境下也有可能每一次页面调进会强迫另一个页面的被窃取进而页面调出。但是, 当它们接近于每秒 10 pi时,系统将近一分钟不调进任何页面也可以工作的很好。

po
po 一栏显示了页面调入数量(速率)的详细情况。无论什么时候一个页的存储被窃取,如果还不驻留在内存或已被修改,那它就会被写入字分页空间。如果不再次被访问,它会留在页面调度设备中直到进程终止或放弃空间。如果地址包含了错误的调出页面信息,那到该地址的访问导致了页面错误,页面将会被系统个别调进。当一个进程正常终止,任何分配给该进程的地址空间将被释放。如果系统读入大量的持久页面(文件),您会发觉 po 栏里增加了却没有在 pi 栏里有相应的增加。这并不一定会造成系统的颠簸,但可以保证对于应用程序数据存取模式的调查。

fr
在一定时间间隔内根据页面替换算法每秒所释放的页面的数量。当 VMM 页面替换例程扫描页面帧表(PFT),它使用某些标准选取哪些页面将被窃取而插入到可用内存帧的空闲列表中去。该标准包含了两种页面种类,工作(计算的)和文档(持久的)页面。就因为页面被释放,并不意味着发生了任何输入输出。例如,如果一个持久存储页面没有被修改过,它就不会被写回磁盘。如果输入输出不是必须的,最小的系统资源会要求释放页面。

sr
在一定时间间隔内根据页面替换算法每秒所释检查的页面的数量。VMM 页面替换代码扫描 PFT 并窃取页面直到空闲列表里的帧数量大于 maxfree 的值。页面替换代码在窃取足够的页面以满足空闲列表之前空仓不得不扫描 PFT 的入口。在稳定,非碎片内存中,扫描速率和释放速率可能接近相等。在多进程系统中要使用不同的页面,所以页面更加易丢失和分散。在这种情况下,扫描速率可能远大于释放速率。

当 fr 和 sr 的比例 (fr:sr) 很高时,内存将会过量使用。

fr:sr 为 1:4 的比例意味着每释放一页,有四页被检查了。很难单独根据这个比例来决定对于内存约束,是工作负载或者独立的应用程序构成了这么高的比例。

cy
时钟算法中每秒周期的数量。VMM 使用一种叫时钟算法的技术来选择被替换的页面。这种技术利用了每一个页面的访问位来识别那些页最近曾被使用(访问)。当页面窃取例程被调用,它遍历整个 PFT ,检查每一页的访问位。

cy 一栏显示了每秒页面替换代码扫描了 PFT 多少次。因为插入空闲列表可以不需要完全扫描 PFT ,并且因为所有的 vmstat 字段显示为整数,这一字段通常为 0。如果不是,就表示一次完整的 PFT 扫描,并且窃取程序要再一次扫描 PFT ,因为 fre 的值仍低于 maxfree 的值。

检测一个系统的大致 RAM 数量的一种方法是察看 avm 字段的最大值,该字段由 vmstat 命令给出。将得到的数字乘以 4K 获取系统的 RAM 的字节数。理想情况下, avm 应该比总的 RAM 的数量少。如果不是,可能会发生一些虚拟内存的页面调度。有多少页面调度取决于两个值之间的差值。记住,虚拟内存的概念是给我们大于实际内存的容量(一些在 RAM 中,而另一些存于字分页空间)。但是如果虚拟内存远大于实际内存,可能造成过度的页面调度,导致延时。如果 avm 小于 RAM,那么当 RAM 中满是文件页的时候就会引起字分页空间的调度。这种情况下,调整 minperm/maxperm 的值,能够减少字分页空间调用的量(参看用 vmtune 命令调优 VMM 页面替换)。

vmstat -I 命令
在AIX 4.3.3以后的操作系统的版本中,vmstat -I (大写字母 i )命令显示附加信息,例如每秒钟调入的文件页面,每秒钟调出的文件页面(即任何的 VMM 调入调出并不是字页空间的调入或调出)。 re 和 cy 栏并没有反映在这个标志中。

vmstat -s 命令
总结 (-s) 选项给出一个总结报告到标准输出,该报告从系统初始化开始,是完整的计数表示,而不是在某段时间区域内的。推荐使用这些统计信息的方法是在有工作负载之前运行该命令,保存输出,在有工作负载时再次运行,另保存输出。下一步是决定两组输出间的差异。awk 脚本调用自动完成这些事情的 vmstatit 函数,该函数由决定问题是否与磁盘或内存有关提供。


# vmstat -s
3231543 total address trans. faults
63623 page ins
383540 page outs
149 paging space page ins
832 paging space page outs
0 total reclaims
807729 zero filled pages faults
4450 executable filled pages faults
429258 pages examined by clock
8 revolutions of the clock hand
175846 pages freed by the clock
18975 backtracks
0 lock misses
40 free frame waits
0 extend XPT waits
16984 pending I/O waits
186443 start I/Os
186443 iodones
141695229 cpu context switches
317690215 device interrupts
0 software interrupts
0 traps
55102397 syscalls总结里的页面调进和页面调出的数量表现了虚拟内存从页面空间和文件空间调入调出页面的活动。字分页空间的出入调度是页面调度的一个典型。如果您正在测试输入输出等待时间,而没有内存约束,那问题可能是由于糟糕的输入输出驱动分布。为了决定问题是否出在页面或文件的出入调度,要取得 vmstat -s 命令的多个样本,并检查字分页空间的出入调度是否是所有调度的主部分。如果系统中调度过多,使用 vmtune 命令可能有所帮助(参看用 vmtune 命令调优 VMM 页面替换)。在分离卷上创建分离的字分页空间调度可能会有好处,但增加的内存确实肯定有好处。

ps 命令
ps 命令也可以监视个别进程对内存的使用。ps v PID 命令为个别进程提供了最综合性的内存相关的统计信息,例如:

页面错误
可使用工作段的容量
内存中工作段和编码段的容量
文本段的容量
驻留集的容量
进程使用实际内存的百分比
举个例子:

# ps v
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
36626 pts/3 A 0:00 0 316 408 32768 51 60 0.0 0.0 ps v结果中最重要一栏 ps 显示了如下的描述:

PGIN
页面错误引起的插入页的数目。既然所有输入输出归于页面错误,那这就是基本的输入输出测量。
容量
进程数据区域的虚拟容量(在字分页空间),用千字节表示(在其他标志中用 SZ 来表示)。这个数目等于进程可用的工作段页的数目的4倍。如果一些工作段页最近被调出,这个数值将大于实际内存的数目。SIZE 包含了私有段的页面和进程的共享库数据段。
RSS
进程实际内存(驻留集合)的容量,用千字节表示。这个数值等于进程内存中的工作段页和代码段页数和的4倍。记住该代码段页是为所有当前程序运行的实例所共享的。如果 26ksh 进程正在运行,只有 ksh 的可执行程序的页面的一份副本可以驻留内存,但是 ps 命令会将代码段的大小作为每个 ksh 程序的实例的 RSS 的一部分报告。
TSIZ
文本(共享程序)映像的容量。这是可执行文件的文本区域的容量。可执行程序文本区的页面是只能在它们被用到时带入内存的,就是说,转移或载入到内存。这个数字只表明了可以载入的文本量的上界。TSIZ 的值并不反映实际内存的使用情况。这个 TSIZ 值也可以通过对可执行程序执行 dump-ov 命令查看到(例如:dump -ov /usr/bin/ls )。
TRS
文本驻留集合(实际内存)的容量。这个数目等于进程可用的代码段页的数目的4倍。当程序有多个运行实例时,这个数字夸大了内存的使用情况。TRS 的值可能比 TSIZ 的值要高是因为其他页可能包含了代码段,例如 XCOFF 头文件和载入区域。
%MEM
由内存中工作段和代码段的和的 4 倍计算得到(就是说,RSS 的值),再除以机器实际内存的容量(单位 KB ),再乘以 100 ,凑整到最接近的百分点。这个值大致表明了进程使用的实际内存。但不巧的是,就像 RSS ,它夸大了一个进程与其他进程共享程序文本的开销。而且,凑整到最接近的百分点,使得系统中所有 RSS 值小于 0.005 乘以数据内存大小的进程的 %MEM 值为 0.0。
注:
ps 命令并不表明共享内存段或者存储映像消耗的内存。因为许多应用程序使用共享内存和存储映像,svmon 命令是一个更好的察看这些段的使用情况的工具。
svmon 命令
svmon 命令提供了一个更加深入的内存使用情况的分析。比起vmstat 和 ps 等命令来说,它带有更多信息量,并且也更具有指导意义。svmon 命令俘获一个当前内存状态的快照。然而,这并不是一个真正的快照因为它运行在用户级,即中断允许状态。

要决定是否 svmon 被安装,是否可以使用,运行一下命令:

# lslpp -lI fileset_name当 fileset_name 是 perfagent.tools 在 AIX 4.3 或者 bos.perf.tools 在 AIX 5 或之后的版本上。

svmon 命令只能被根用户使用。

如果使用时间间隔(-i 选项),统计信息将会一直显示直到命令终止或者达到了时间间隔的数值,终止方案被赋予了特殊权限。

显示的信息可以用四种不同的报告来分析:

整体 (-G)
显示整个系统中实际内存和字分页空间的使用的统计信息。
进程 (-P)
显示活动进程的存储使用策略。
段 (-S)
显示在某一特定的程序段数或者降序显示最高十位使用内存的进程。
段的详细信息 (-D)
显示某一特定段的详细信息。
在AIX 4.3.3中可用的其他报告如下:

用户 (-U)
显示某个特定的登录名下的内存使用统计信息。如果不给予要显示的登录名,则所有登录名的内存使用统计信息都将被显示。
命令 (-C)
显示某个指定的命令名所用的进程的内存使用统计信息。
工作负载管理类 (-W)
显示指定的工作负载管理类所的内存使用统计信息。如果不给予要显示的类,则所有类的存使用统计信息都将被显示。
为了支持64位的应用程序, svmon 命令的输出格式在AIX 4.3.3和其以后的版本中被修改。

在 4.3.3 及其以后的版本中,操作系统有附加的报告可用,如下:

帧 (-F)
显示帧的信息。不指定具体帧的号码时,会报告使用的内存的百分比。而当指定了具体帧号是,会报告该帧的信息。
层 (-T)
显示层的信息,例如层号,使用 -a 标志时的超类名和实际内存中属于层的段的总页数。
有多少内存正在被使用
打印全局的统计信息,要用 -G 标志。在这个例子里,我们在两秒内重复了该命令五次。

# svmon -G -i 2 5
m e m o r y i n u s e p i n p g s p a c e
size inuse free pin work pers clnt work pers clnt size inuse
16384 16250 134 2006 10675 2939 2636 2006 0 0 40960 12674
16384 16254 130 2006 10679 2939 2636 2006 0 0 40960 12676
16384 16254 130 2006 10679 2939 2636 2006 0 0 40960 12676
16384 16254 130 2006 10679 2939 2636 2006 0 0 40960 12676
16384 16254 130 2006 10679 2939 2636 2006 0 0 40960 12676结果中最重要的一栏 svmon 显示如下描述:

memory
统计信息描述的实际内存的使用,是 4K 页。
size
整个内存的容量是 4K 页。
inuse
RAM 中进程使用的页数加上程序已终止但仍驻留在 RAM 中的持久页面的页数。这个值等于总内存减去空闲列表的值。
free
空闲列表中页面的数量。
pin
钉在 RAM 的页面的数量。(一个针定页面就是一直驻留 RAM ,不会被调出的页面)。
in use
正在使用的实际内存的子集的详细信息,以 4K 帧显示。
work
RAM 中工作页面的数量。
pers
RAM 中持久页面的数量。
clnt
RAM 中客户机页面的数量(客户机页面就是一个远程文件页面)。
pin
包含针定页面的实际内存的子集的详细信息,以 4K 帧显示。
work
针定在 RAM 中的工作页面的数量。
pers
针定在 RAM 中的持久页面地数量。
clnt
针定在 RAM 中的客户页面的数量。
pg space
字分页空间使用统计信息,以 4K 帧显示。该数据只有当 -r 标志不被使用时才会报告。从 AIX 4.3.2 开始报告的数值是字分页空间实际使用的页面的数量(这说明这些页是被调出到字分页空间的)。它与 vmstat 命令的不同在于 vmstat 的 avm 一栏显示的是虚拟内存可以访问的地址而不一定是调出的地址。
size
总字分页空间的容量,以 4K 页计。
inuse
分配页的总数。
在我们的例子中,总的存储容量有 16384 页大。将这个数乘以 4096 就是总实际内存的容量。其中 16250 页正被使用,而空闲列表中有 134 页,针定在 RAM 中的有 2006 页。在所有被使用的页中, RAM 中有 10675 页工作页面, 2939 页持久页面和 2636 客户页面。这三个部分的总和等于 memory 一栏中 inuse 一栏的数值。pin 部分除以针定页面容量可以得到工作、持久和客户三类针定页面的大小。它们的和等于 memory 部分中的 pin 一栏的值。字分页空间总共有 40960 页 (160 MB),有 12676 页正在使用。memory 中的 inuse 一栏通常要比 pg space 中的 inuse 一栏要大,当一个进程完成后,因为分配字分页空间时文件页面占用的存储器不会释放。

在 AIX 4.3.3 及其后来版本,系统对于同样命令的输出就如下所示:

# svmon -G -i 2 5

size inuse free pin virtual
memory 65527 64087 1440 5909 81136
pg space 131072 55824

work pers clnt
pin 5918 0 0
in use 47554 13838 2695


size inuse free pin virtual
memory 65527 64091 1436 5909 81137
pg space 131072 55824

work pers clnt
pin 5918 0 0
in use 47558 13838 2695


size inuse free pin virtual
memory 65527 64091 1436 5909 81137
pg space 131072 55824

work pers clnt
pin 5918 0 0
in use 47558 13838 2695


size inuse free pin virtual
memory 65527 64090 1437 5909 81137
pg space 131072 55824

work pers clnt
pin 5918 0 0
in use 47558 13837 2695


size inuse free pin virtual
memory 65527 64168 1359 5912 81206
pg space 131072 55824

work pers clnt
pin 5921 0 0
in use 47636 13837 2695增加的输出字段是 virtual 字段,它说明了分配给系统虚拟空间的页数。

谁在使用内存?
以下命令显示了使用内存最多的十个进程的统计信息。如果您不指定一个数值,它将显示所有当前在系统中运行进程。

# svmon -Pau 10

Pid Command Inuse Pin Pgspace
15012 maker4X.exe 4783 1174 4781
2750 X 4353 1178 5544
15706 dtwm 3257 1174 4003
17172 dtsession 2986 1174 3827
21150 dtterm 2941 1174 3697
17764 aixterm 2862 1174 3644
2910 dtterm 2813 1174 3705
19334 dtterm 2813 1174 3704
13664 dtterm 2804 1174 3706
17520 aixterm 2801 1174 3619

进程标识符: 15012
命令: maker4X.exe

Segid Type Description Inuse Pin Pgspace Address Range
1572 pers /dev/hd3:62 0 0 0 0..-1
142 pers /dev/hd3:51 0 0 0 0..-1
1bde pers /dev/hd3:50 0 0 0 0..-1
2c1 pers /dev/hd3:49 1 0 0 0..7
9ab pers /dev/hd2:53289 1 0 0 0..0
404 work kernel extension 27 27 0 0..24580
1d9b work lib data 39 0 23 0..607
909 work shared library text 864 0 7 0..65535
5a3 work sreg[4] 9 0 12 0..32768
1096 work sreg[3] 32 0 32 0..32783
1b9d work private 1057 1 1219 0..1306 : 65307..65535
1af8 clnt 961 0 0 0..1716
0 work kernel 1792 1146 3488 0..32767 : 32768..65535
...输出被分为概述和细节两部分。概述部分降序列出了使用内存最多的十个进程。

进程标识符为为 512 的进程使用了最多的内存。命令 表示了使用的命令的名字,这里用了 maker4X.exe 命令。Inuse 一栏(进程使用的段在实际内存中占地总页数)为 4783 页(每页 4KB )。Pin 一栏(进程使用的段针定页所占的总页数)为 1174 页。Pgspace 一栏(进程使用的外地址空间的总页数)为 4781 页。

细节区域显示了概述区域中显示的每一个进程的每一个段的信息。这包括了段 ID、段的类型、描述(段的文本描述,包括卷名和持久短的 i 节点文件)、 RAM 中页的数量、 RAM 中针定页的数量、字分页空间的数量和地址范围。

Address Range 为持久段或者客户段指定一个范围或者为工作段指定两个范围。持久段或者客户段的范围用 '0..x' 的形式来表示, x 指的是已使用的虚拟页面的最大值。工作段的范围可以用 '0..x : y..65535' 来表示,其中 0..x 包含了全局数据,会增加,而 y..65535 包含了堆栈区域,会减少。对于一个工作段的地址范围,是从两边开始分配空间直到中间。如果工作段是非私有的(内核程序和共享库),空间的分配是不同的。在本例中,段 ID 为 1b9d 私有工作段;它的地址范围是 0..1306 : 65307..65535。段 ID 909 是共享库文本工作段;它的范围是 0..65535。

一个段可以被多进程使用。这样的段里的每一个实际内存页解释了每个使用该段的进程的 Inuse 字段。因此,Inuse 的总数可能超过实际内存中的页面总数。这对 Pgspace 和 Pin 字段也同样适用。一个进程里所有段的 Inuse, Pin 和 Pgspace 值的和就等于概述区里的值。

您可以使用以下命令中的一个来显示相关 i-node 的文件名:

ncheck -i i-node_number volume_name
find file_system_associated_with_lv_name -xdev -inum inode_number -print
为了得到与 AIX 4.3.3 及其之后版本相似的输出,请使用以下命令:

# svmon -Put 10

------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd
2164 X 15535 1461 34577 37869 N N

Vsid Esid Type Description Inuse Pin Pgsp Virtual Addr Range
1966 2 work process private 9984 4 31892 32234 0..32272 :
65309..65535
4411 d work shared library text 3165 0 1264 1315 0..65535
0 0 work kernel seg 2044 1455 1370 4170 0..32767 :
65475..65535
396e 1 pers code,/dev/hd2:18950 200 0 - - 0..706
2ca3 - work 32 0 0 32 0..32783
43d5 - work 31 0 6 32 0..32783
2661 - work 29 0 0 29 0..32783
681f - work 29 0 25 29 0..32783
356d f work shared library data 18 0 18 24 0..310
34e8 3 work shmat/mmap 2 2 2 4 0..32767
5c97 - pers /dev/hd4:2 1 0 - - 0..0
5575 - pers /dev/hd2:19315 0 0 - - 0..0
4972 - pers /dev/hd2:19316 0 0 - - 0..5
4170 - pers /dev/hd3:28 0 0 - - 0..0
755d - pers /dev/hd9var:94 0 0 - - 0..0
6158 - pers /dev/hd9var:90 0 0 - - 0..0

------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd
25336 austin.ibm. 12466 1456 2797 11638 N N

Vsid Esid Type Description Inuse Pin Pgsp Virtual Addr Range
14c3 2 work process private 5644 1 161 5993 0..6550 :
65293..65535
4411 d work shared library text 3165 0 1264 1315 0..65535
0 0 work kernel seg 2044 1455 1370 4170 0..32767 :
65475..65535
13c5 1 clnt code 735 0 - - 0..4424
d21 - pers /dev/andy:563 603 0 - - 0..618
9e6 f work shared library data 190 0 2 128 0..3303
942 - pers /dev/cache:16 43 0 - - 0..42
2ca3 - work 32 0 0 32 0..32783
49f0 - clnt 10 0 - - 0..471
1b07 - pers /dev/andy:8568 0 0 - - 0..0
623 - pers /dev/hd2:22539 0 0 - - 0..1
2de9 - clnt 0 0 - - 0..0
1541 5 mmap mapped to sid 761b 0 0 - -
5d15 - pers /dev/andy:487 0 0 - - 0..3
4513 - pers /dev/andy:486 0 0 - - 0..45
cc4 4 mmap mapped to sid 803 0 0 - -
242a - pers /dev/andy:485 0 0 - - 0..0
...Vsid 一栏是虚拟段的 ID ,而 Esid 一是有效段的 ID。有效段 ID 反映了用于访问相应页的段寄存器。

特殊段 ID 的详细信息
-D 选项显示了段内存使用的详细统计信息。

# svmon -D 404
Segid: 404
Type: working
Description: kernel extension
Address Range: 0..24580
Size of page space allocation: 0 pages ( 0.0 Mb)
Inuse: 28 frames ( 0.1 Mb)
Page Frame Pin Ref Mod
12294 3320 pin ref mod
24580 1052 pin ref mod
12293 52774 pin ref mod
24579 20109 pin ref mod
12292 19494 pin ref mod
12291 52108 pin ref mod
24578 50685 pin ref mod
12290 51024 pin ref mod
24577 1598 pin ref mod
12289 35007 pin ref mod
24576 204 pin ref mod
12288 206 pin ref mod
4112 53007 pin mod
4111 53006 pin mod
4110 53005 pin mod
4109 53004 pin mod
4108 53003 pin mod
4107 53002 pin mod
4106 53001 pin mod
4105 53000 pin mod
4104 52999 pin mod
4103 52998 pin mod
4102 52997 pin mod
4101 52996 pin mod
4100 52995 pin mod
4099 52994 pin mod
4098 52993 pin mod
4097 52992 pin ref mod每一栏的细节解释如下:

Page
指定段内页面的索引。
Frame
指定驻留在实际内存的帧索引。
Pin
指定显示该页是否为针定页的标志。
Ref
指定显示该页的访问位是否有效标志。
Mod
指定显示该页是否为被修改的标志。
页面空间分配为 0 ,是因为所有页面被针定在实际内存中。

一个 AIX 4.3.3 及其之后的版本的样本输出,就如下所示:

# svmon -D 629 -b

Segid: 629
Type: working
Address Range: 0..77
Size of page space allocation: 7 pages ( 0.0 Mb)
Virtual: 11 frames ( 0.0 Mb)
Inuse: 7 frames ( 0.0 Mb)

Page Frame Pin Ref Mod
0 32304 N Y Y
3 32167 N Y Y
7 32321 N Y Y
8 32320 N Y Y
5 32941 N Y Y
1 48357 N N Y
77 47897 N N Y-b 标志显示了所有显示的帧的访问和修改位的状态。显示之后,帧的访问位将被重置。当使用 -i 标志时,它检测每一个区间内那些帧可以访问。

注:
使用这些标志时必须小心,因为它们有性能冲突。
使用内存最多的段列表
-S 选项用于按内存使用情况排列段,并且显示使用最多的段的统计信息。如果不指定统计数字,那默认值为 10。以下命令按实际内存中页数的多少排列系统和非系统段,并将结果的前十位打印输出。

# svmon -Sau

Segid Type Description Inuse Pin Pgspace Address Range
0 work kernel 1990 1408 3722 0..32767 : 32768..65535
1 work private, pid=4042 1553 1 1497 0..1907 : 65307..65535
1435 work private, pid=3006 1391 3 1800 0..4565 : 65309..65535
11f5 work private, pid=14248 1049 1 1081 0..1104 : 65307..65535
11f3 clnt 991 0 0 0..1716
681 clnt 960 0 0 0..1880
909 work shared library text 900 0 8 0..65535
101 work vmm data 497 496 1 0..27115 : 43464..65535
a0a work shared library data 247 0 718 0..65535
1bf9 work private, pid=21094 221 1 320 0..290 : 65277..65535所有的字段输出如上例所描述。

一个 AIX 4.3.3 及其之后的版本的样本输出,就如下所示:

# svmon -Sut 10

Vsid Esid Type Description Inuse Pin Pgsp Virtual Addr Range
1966 - work 9985 4 31892 32234 0..32272 :
65309..65535
14c3 - work 5644 1 161 5993 0..6550 :
65293..65535
5453 - work 3437 1 2971 4187 0..4141 :
65303..65535
4411 - work 3165 0 1264 1315 0..65535
5a1e - work 2986 1 13 2994 0..3036 :
65295..65535
340d - work misc kernel tables 2643 0 993 2645 0..15038 :
63488..65535
380e - work kernel pinned heap 2183 1055 1416 2936 0..65535
0 - work kernel seg 2044 1455 1370 4170 0..32767 :
65475..65535
6afb - pers /dev/notes:92 1522 0 - - 0..10295
2faa - clnt 1189 0 - - 0..2324svmon 和 vmstat 输出之间的关系
在 svmon 和 vmstat 的输出之间有关系。svmon 的报告在AIX 4.3.2中如下所示(所举例子与AIX 4.3.3及其之后版本中的相同,虽然输出格式不同):

# svmon -G
m e m o r y i n u s e p i n p g s p a c e
size inuse free pin work pers clnt work pers clnt size inuse
16384 16254 130 2016 11198 2537 2519 2016 0 0 40960 13392vmstat 命令在一个分离窗口中运行,同时 svmon 也在运行。vmstat 的报告如下所示:

# vmstat 5
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 0 13392 130 0 0 0 0 2 0 125 140 36 2 1 97 0
0 0 13336 199 0 0 0 0 0 0 145 14028 38 11 22 67 0
0 0 13336 199 0 0 0 0 0 0 141 49 31 1 1 98 0
0 0 13336 199 0 0 0 0 0 0 142 49 32 1 1 98 0
0 0 13336 199 0 0 0 0 0 0 145 49 32 1 1 99 0
0 0 13336 199 0 0 0 0 0 0 163 49 33 1 1 92 6
0 0 13336 199 0 0 0 0 0 0 142 49 32 0 1 98 0全局的 svmon 报告显示了相关的数字。vmstatfre 一栏和 svmon memory free 一栏之间有联系。vmstat 对于动态虚拟内存 (avm) 的报告是由 svmon 命令 pg space inuse 的报告提供的 (13392)。

vmstat avm 一栏提供了和 pg space inuse 一栏一样的值,后面的值是从 svmon 命令得到,除了从AIX 4.3.2开始的版本里用到页面延迟分配的地方。在这个例子里, svmon 显示了实际调出到字分页空间的页的数量而 vmstat 命令虚拟页面可访问的数量,并不一定是被调出的(参看考察字分页空间和虚拟内存)。

svmon 和 ps 输出的关系
在 svmon 和 ps 的输出之间是有某些联系的。svmon 的报告在 AIX 4.3.2 中如下所示(所举例子在 AIX 4.3.3 及其之后的版本中的相同,虽然输出格式不同):

# svmon -P 7226

Pid Command Inuse Pin Pgspace
7226 telnetd 936 1 69

进程标识符: 7226
命令: telnetd

Segid Type Description Inuse Pin Pgspace Address Range
828 pers /dev/hd2:15333 0 0 0 0..0
1d3e work lib data 0 0 28 0..559
909 work shared library text 930 0 8 0..65535
1cbb work sreg[3] 0 0 1 0..0
1694 work private 6 1 32 0..24 : 65310..65535
12f6 pers code,/dev/hd2:69914 0 0 0 0..11同ps 的报告比较,还有以下的内容:

# ps v 7226
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
7226 - A 0:00 51 240 24 32768 33 0 0.0 0.0 telnetdSIZE 指的是进程的数据区域的虚拟容量(在字分页空间),用 KB 计。这个数目等于进程已使用的工作段页的数目(即在字分页空间被分配的页的数目)的4倍。该数必须乘以 4 是因为页面是以 4K 为单位而SIZE 是以 1K 为单位。如果一些工作段页最近被调出,这个数值将大于实际内存的数目。SIZE 的值 (240) 与Pgspace 的数值相关,该数值由 svmon 命令的 private (32) 加上 lib data (28) 得到,以 1K 为单位。

RSS 指的是进程实际内存(驻留集合)的容量,用千字节表示。这个数值等于于进程内存中的工作段页和代码段页数和的 4 倍。记住代码段页是为所有当前程序运行的实例所共享的。如果 26 ksh 进程正在运行,只有 ksh 的可执行程序的页面的一个副本可以驻留在内存,但是 ps 命令会将代码段的大小作为每一个 RSS 的一部分,而该部分是 ksh 程序的一个实例。RSS 的值 (24) 与 Inuse 的值相关,后面的值由svmon 命令提供,为了进程的 private (6) 工作存储段,为了code (0) 段,也为了 lib data (0)。以 1K 计。

TRS 指的是文本的驻留集合(实际内存中)的容量。这个数字等于代码的数目乘以 4。正如我们较早提到的,这个数目大于程序使用内存的数目去乘以运行的实例的数目。这不包括进程的共享文本。TRS 的值 (0) 与 svmon 在 code 段里的页数相关,该段在 Inuse 栏里,以 1K 计。TRS 的值可能比 TSIZ 的值要大因为其他页,如 XCOFF 头文件,和载入区,可能包含在代码段里。

下面的计算公式有助于理解我们以上提到的值:

SIZE = 4 * Pgspace of (work lib data + work private)
RSS = 4 * Inuse of (work lib data + work private + pers code)
TRS = 4 * Inuse of (pers code)计算程序内存需求最小量
用以计算程序内存需求最小量的公式是:

总内存页数 (4 KB units) = T + ( N * ( PD + LD ) ) + F其中:

T
= 文本页数(所有用户共享)
N
= 该程序同时运行的副本数
PD
= 进程私有段中工作段数
LD
= 进程使用的共享库数据页数
F
= 文件页数(所有用户共享)
得到的结果乘以 4 就得到要求的数值,以千字节计。您可能也希望加入到内核,扩充内核和共享库的文本段的值到这里即使它们是为系统中所有进程共享的。例如,一些如 CATIA 的应用程序和数据库使用的很大的共享库模版。注意到我们只用了进程的单一快照的统计信息,没有理由认为我们从公式里获取的值就是正确的进程的最小工作集合的大小值。要得到工作集合的容量,需要运行如 rmss 命令的工具或者在进程的生命周期内拍摄许多快照,并取这些快照中的平均值(参看通过 rmss 命令访问内存需求)。

如果我们以程序的 pacman 估计最小内存需求,如查询内存泄漏程序所述,该公式应为:

T
= 2 (Inuse of code,/dev/lv01:12302 of pers)
PD
= 1632 (Inuse of private of work)
LD
= 12 (Inuse of lib data of work)
F
= 1 (Inuse of /dev/hd2:53289 of pers)
那就是: 2 + (N * (1632+ 12)) + 1, 等于 1644 * N + 3 (以 4KB 为单位)。

0 评论: