作者:IT168 杨宝秋
4 解惑及我的见解
4.1 glance、kmeminfo及ps都不是进程真实占用物理内存的反映
4.1.1 glance与kmeminfo对进程的内存占用是一样,都为RSS
glance、kmeminfo及ps都不是进程真实占用内存的反映,这是我的第一个见解。这么一说可能会有N个人出来反对我,主要原因在于kmeminfo这个工具。从kmeminfo这个工具的使用上看,它的体现的该是每个部分占用物理内存的大小,它的-user选项该也是每个进程实际占用物理内存,用过这个工具的人都会这样理解,我原来也这样认为。经过认真的评测,发现glance与kmeminfo对于某一个进程的内存占用实际上是一样的,也是一个东西,即为RSS,而不是真实的物理内存。这里又出现了一个概念上的问题,何为进程的真实的物理内存?何为RSS?
4.1.2 何为进程的真实的物理内存?何为RSS?
关于RSS,在hp-unix中的定义为:The size (in KB) of resident memory allocated for the process.
指的是进程相关数据驻留内存的大小。Hp-unix定义的RSS的计算公式为:
RSS = sum of private region pages +(sum of shared region pages /number of references)
其中sum of private region pages即为进程占用真实的物理内存(sum of shared region pages /number of references)表现的是为共享内存部分在某一个进程上的均分。
此时我们对一个进程内存占用该有一个清晰的理解,当fork一个进程,假定名字为p1,malloc一个区域,这个区域用于存放进程的data、stack、code等这些私有的数据,这才是真实的其物理内存的占用。同时系统内会有一些共享内存部分(ipcs看到的),如oracle的SGA区,p1也会引用到。此时p1的RSS该为:自已私有的占用+SGA它的引用。
假定p1的私有占用为2mb,它只引用共享部分如2gb的SGA区的5mb,那么p1的RSS=2+5=7mb,在glancee及kmeminfo的表现都会为7mb。
4.2 glance与kmeminfo的值不一样的原因在于glance的计算方式而产生的差别
4.1.1有人就会有不同意见,因为5861进程在glance中表现为占用57.9mb内存,kmeminfo表现为56.6mb内存,明明值不一样, 为什么说是一个东西?原因在于glance的不实时性及glance的计算方式而产生的差别。
做一个大量的抽样可以得到glance与kmeminfo的值不一样,可却相差很小,就像如上的57.9与56.6一样,也可以认为是等同的。Glance默认是每2秒刷新一次的,而且由于unix内存的管理如page in/out,两者会有一点差别。同时看一下Hp对Rss的描述也会知道,这有glance的计算方式而产生的差别的因素,原文中的一段如下:
On HP-UX, the calculation of this metric differs depending on whether this process has used any CPU time since the midaemon process was started. This metric is less accurate and does not include shared memory regions in its calculation when the process has been idle since the midaemon was started.
This value is only updated when a process uses CPU. Thus, under memory pressure, this value may be higher than the actual amount of resident memory for processes which are idle because their memory pages may no longer be resident or the reference count for shared segments may have changed.
即因glance软件启用后,是否进程使用了cpu会差生RSS计算上的一点差别。
4.3 ps中的sz是text、data和stack三项的和,而text在hp-ux下属于共享部分, 故产生了ps的计算也不准确的状况
3.2的测试可以看到ps里7861的sz为16992个内存页,计算起来为66.375mb,那这16992个内存页由哪些部分组成的呢?每
每部分都为多少呢?man一个ps命令就能知道ps中的sz是text、datat和stack三项的和。如果想要知道text、data和stack都为多少需要借助procsize工具了。
# ./procsize -R -p 7861
libp4 (6.93): Opening /stand/vmunix /dev/kmem
Loading symbols from /stand/vmunix
regions set to 1000
hpux 11.11 64 bit in Wide mode
nproc=30000
pid Comm UAREA TEXT DATA STACK SHMEM IO MMAP Total
7861 oracle r 8 16384 512 96 524661 0 1203 542865
其中-R表明查驻留的部分,可见16384(TEXT)+512(DATA )+96(STACK)恰好为16992。因TEXT部分在在hp-ux下属于共享部分,故产生了ps的计算也不准确的状况。
4.4 glance诊断单进程使用过多的问题
4.4.1 查看内存详细map列表
做了如些多的铺垫,该进入正题了,如下解析一下7861进程glance中57.9mb RSS源于何处的问题。
关注一下7861进程,进程列表界面按"s"键,然后提供process id 7861。
User CPU Util Cum Disk Thd
Process Name PID PPID Pri Name ( 300% max) CPU IO Rate RSS Cnt
--------------------------------------------------------------------------------
oraclevcard 7861 7860 154 oracle 0.0/ 0.0 0.2 0.0/ 0.0 57.9mb 1
Resources PID: 7861, oraclevcard PPID: 7860 euid: 103 User: oracle
--------------------------------------------------------------------------------
CPU Usage (util): 0.0 Log Reads : 0 Wait Reason : PIPE
User/Nice/RT CPU: 0.0 Log Writes: 0 Total RSS/VSS : 57.9mb/ 58.9mb
System CPU : 0.0 Phy Reads : 0 Traps / Vfaults: 0/ 0
Interrupt CPU : 0.0 Phy Writes: 0 Faults Mem/Disk: 0/ 0
Cont Switch CPU : 0.0 FS Reads : 0 Deactivations : 0
Scheduler : HPUX FS Writes : 0 Forks & Vforks : 0
Priority : 154 VM Reads : 0 Signals Recd : 0
Nice Value : 20 VM Writes : 0 Mesg Sent/Recd : 0/ 0
Dispatches : 0 Sys Reads : 0 Other Log Rd/Wt: 0/ 0
Forced CSwitch : 0 Sys Writes: 0 Other Phy Rd/Wt: 0/ 0
VoluntaryCSwitch: 0 Raw Reads : 0 Proc Start Time
Running CPU : 0 Raw Writes: 0 Fri Apr 18 09:14:16 2008
CPU Switches : 0 Bytes Xfer: 0kb :
Argv1: (DESCRIPTION=(LOCAL=YES)
Cmd : oraclevcard (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
再键入”M”,进入详细的内存分布列表,如下:
Memory Regions PID: 7861, oraclevcard PPID: 7860 euid: 103 User: oracle
Type RefCt RSS VSS Locked File Name
--------------------------------------------------------------------------------
NULLDR/Shared 137 4kb 4kb 0kb
MEMMAP/Shared 55 4kb 4kb 0kb /var/spool/pwgr/status
TEXT /Shared 41 64.0mb 64.0mb 0kb /oracle/.../bin/oracle
UAREA /Priv 1 32kb 32kb 0kb
DATA /Priv 1 2.0mb 2.0mb 0kb /oracle/.../bin/oracle
MEMMAP/Priv 1 512kb 512kb 0kb
MEMMAP/Priv 1 16kb 16kb 0kb
MEMMAP/Priv 1 8kb 8kb 0kb
MEMMAP/Priv 1 60kb 60kb 0kb /usr/lib/pa20_64/libc.2
MEMMAP/Priv 1 52kb 52kb 0kb
MEMMAP/Priv 1 12kb 12kb 0kb /usr/lib/pa20_64/libm.2
MEMMAP/Priv 1 4kb 4kb 0kb /usr/lib/pa20_64/libdl.1
MEMMAP/Priv 1 8kb 8kb 0kb
MEMMAP/Priv 1 4kb 4kb 0kb /usr/.../libnss_dns.1
MEMMAP/Priv 1 12kb 12kb 0kb /usr/.../libpthread.1
MEMMAP/Priv 1 8kb 8kb 0kb
MEMMAP/Priv 1 4kb 4kb 0kb /usr/lib/pa20_64/librt.2
MEMMAP/Priv 1 36kb 272kb 0kb /usr/lib/pa20_64/libcl.2
MEMMAP/Priv 1 0kb 32kb 0kb
MEMMAP/Priv 1 8kb 8kb 0kb
MEMMAP/Priv 1 500kb 504kb 0kb /oracle/.../libjox9.sl
MEMMAP/Priv 1 0kb 12kb 0kb
MEMMAP/Priv 1 4kb 4kb 0kb /oracle/.../libskgxn9.sl
MEMMAP/Priv 1 4kb 4kb 0kb /oracle/.../libodmd9.sl
MEMMAP/Priv 1 8kb 8kb 0kb
MEMMAP/Priv 1 8kb 8kb 0kb /usr/lib/pa20_64/dld.sl
MEMMAP/Priv 1 4kb 4kb 0kb
STACK /Priv 1 384kb 576kb 0kb
MEMMAP/Shared 44 140kb 140kb 0kb /usr/lib/pa20_64/dld.sl
MEMMAP/Shared 43 12kb 12kb 0kb /usr/.../libnss_dns.1
MEMMAP/Shared 44 16kb 20kb 0kb /usr/lib/pa20_64/librt.2
MEMMAP/Shared 41 4kb 4kb 0kb /oracle/.../libodmd9.sl
MEMMAP/Shared 41 8kb 8kb 0kb /oracle/.../libskgxn9.sl
MEMMAP/Shared 44 16kb 16kb 0kb /usr/lib/pa20_64/libdl.1
MEMMAP/Shared 44 72kb 532kb 0kb /usr/lib/pa20_64/libcl.2
MEMMAP/Shared 44 96kb 96kb 0kb /usr/.../libpthread.1
MEMMAP/Shared 44 136kb 152kb 0kb /usr/lib/pa20_64/libm.2
MEMMAP/Shared 44 1.1mb 1.1mb 0kb /usr/lib/pa20_64/libc.2
MEMMAP/Shared 41 1.9mb 5.4mb 0kb /oracle/.../libjox9.sl
SHMEM /Shared 41 2.00gb 2.02gb 0kb
Text RSS/VSS: 64mb/ 64mb Data RSS/VSS:2.0mb/2.0mb Stack RSS/VSS:384kb/576kb
Shmem RSS/VSS:2.0gb/2.0gb Other RSS/VSS:4.7mb/9.0mb
4.4.2 信息项说明
RefCt指的是Reference Count,即有多少个进程引用共享区域
/Priv表明该内存区是进程私有的,此时RefCt也为1。/Shared表明该内存区是共享的,此时RefCt>1。
Text表明的是文本及代码区,说过几次了,此部分在Hp unix是共享的。
Data表明的是数据区,是一个私有区,如Oracle进程的pga就位于此区。
Stack 即为栈区,这也是一个私有区
MEMMAP 大多表现的是与swap相关的部分
SHMEM 此处是Oracle共享内存
4.4.3 按RSS的定义来算一下
7861真实占用内存(私有区)=
32kb+2.0mb+512kb+….+500kb+0kb+4kb+4kb+8kb+8kb+4kb+384kb=3.6mb
Shared部分均摊=
4kb/137+4kb/55+64.0mb/41+…. +1.1mb/44+1.9mb/41+2.00gb/41=54mb
所以RSS=54+3.6=57.6mb
与57.9mb基本相当,当然这其中有精度及取舍的问题。
阅读(395) | 评论(0) | 转发(0) |