關於程式的實體記憶體RSS

liiinuuux發表於2015-03-24
通常習慣直接把ps裡的RSS看做是程式使用的實體記憶體。
例如linux下ps的說明如下
rss        RSS      resident set size, the non-swapped physical memory that a task has used
                    (in kiloBytes). (alias rssize, rsz).

隨便在筆記本虛機上看一個oracle程式,居然有30M之巨
[oracle@server2 ~]$ ps aux | head -n 1; ps aux | grep LOCAL=YES| grep -v grep
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
oracle    2295  0.0  1.6 856044 30764 ?        Ss   21:23   0:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))


再比如這臺惠普,有1823個遠端連線。
SQL> !ps -ef| grep LOCAL=NO| wc -l
1823

glance裡按RSS排序,直接看最後一頁,最少都是200多兆,這麼算起來400多G。
                         User      CPU %    Thrd Disk        Memory       Block
Process Name     PID     Name   (12800%max) Cnt  IOrate      RSS/VSS      On
--------------------------------------------------------------------------------
oraclePRODB2       17050 grid          0.0     1   0.0   226.5mb  241.9mb SOCKT
oraclePRODB2        7029 grid          0.0     1   0.0   216.6mb  218.9mb SOCKT
oraclePRODB2       16306 grid          0.0     1   0.0   227.8mb  239.3mb SOCKT
oraclePRODB2       17114 grid          0.1     1   0.0   224.3mb  243.7mb SOCKT
oraclePRODB2       15957 grid          0.0     1   0.0   226.5mb  240.2mb SOCKT 
...
...

但是這臺機器的實體記憶體一個1T,SGA就固定400G,現在使用者程式只用了447G,因此按程式上的RSS簡單相加肯定是不準的。
Event         Current   Cumulative   Current Rate   Cum Rate   High Rate
--------------------------------------------------------------------------------
Page Faults       858         4050       343.2      470.9       662.5
Page In             0            0         0.0        0.0       148.9
Page Out            0            0         0.0        0.0         0.0
KB Paged In       0kb          0kb         0.0        0.0         0.0
KB Paged Out      0kb          0kb         0.0        0.0         0.0
Reactivations       0            0         0.0        0.0         0.0
Deactivations       0            0         0.0        0.0         0.0
KB Deactivated    0kb          0kb         0.0        0.0         0.0
VM Reads            0            0         0.0        0.0         0.0
VM Writes           0            0         0.0        0.0         0.0
Total VM : 464.7gb   Sys Mem  : 104.9gb   User Mem: 447.8gb   Phys Mem :  1023gb
Active VM: 261.3gb   Buf Cache:     0mb   Free Mem: 455.8gb   FileCache:  14.5gb
MemFS Blk Cnt:                0   MemFS Swp Cnt:                0


以程式17050為例,glance裡顯示226.5m。檢視pga實際分配了3M
SQL> select round(pga_alloc_mem/1024/1024, 2)||' (MB)' alloc_mb from v$process where spid = 17050;

ALLOC_MB
-----------------
3.09 (MB)

整個PGA一共也就分配了11G
SQL> select round(sum(pga_alloc_mem)/1024/1024/1024, 2)||' (GB)' sum_alloc_mb from v$process;

SUM_ALLOC_MB
---------------------------------------------
11.47 (GB)


於是檢視glance裡RSS的說明
On HP-UX, for processes that use CPU
time subsequent to midaemon startup,
the resident memory is calculated as
                                   
RSS = sum of private region pages +
      (sum of shared region pages /
       number of references)
       
                                   
The number of references is a count
of the number of attachments to the
memory region.
  Attachments, for   
shared regions, may come from      
several processes sharing the same 
memory, a single process with      
multiple attachments, or           
combinations of these.

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.

上面提到有兩個原因會造成RSS顯示遠大於程式實際使用的記憶體
  1. RSS除了程式私有實體記憶體之外,還要加上[它所使用的共享記憶體大小 / 所有正在使用這個共享記憶體的程式數]。
  2. 由於RSS只有在程式使用CPU時才更新,如果程式idle了,就再也不會更新,永遠是那麼大。

因此每個程式最少200多M,應該就是透過SGA的400000 / 1823 = 219 算出來的。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26239116/viewspace-1472417/,如需轉載,請註明出處,否則將追究法律責任。

相關文章