Linux进程内存占用数的计算

 前几天同事反馈:数据库主机上的server process占用的物理内存过大,比v$process视图中的大很多。他是使用ps查看rss来计算物理内存的。
 
 man ps中对rss的解释:
  RSS      resident set size, the non-swapped physical memory that a task has used (in kiloBytes).
                    (alias rssize, rsz).
 通过这个解释,大家很容易认为RSS就是process实际占用的物理内存。
 
其实,ps命令出来的rss结果是不正确的。因为ps在计算RSS时是包括了共享内存的。这个共享内存是多个process间共享的,实际上仅是占用了一份内存。
 
让我们通过实验来证明:
实验环境:Oracle Linux6.2(虚拟机)
oracle版本:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
 
[root@study1 ~]# ps aux | head -1;ps aux | grep 22922
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
oracle   22922  0.2  1.9 462176  28820 ?        Ss   09:20   0:00 oraclestudydb1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root     22955  0.0  0.0   4328   728 pts/1    S+   09:21   0:00 grep 22922
 
22922 为sqlplus连接数据库产生的服务端oracle process,这里RSS= 28820 k(28多m)
使用pmap分析进程22922
[root@study1 ~]# pmap -d 22922
22922:   oraclestudydb1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
Address   Kbytes Mode  Offset           Device    Mapping
08048000  136740 r-x-- 0000000000000000 0fd:00000 oracle
105d1000    1004 rwx-- 0000000008589000 0fd:00000 oracle
106cc000     200 rwx-- 0000000000000000 000:00000   [ anon ]
1169b000     400 rwx-- 0000000000000000 000:00000   [ anon ]
20000000  309248 rwxs- 0000000000000000 000:00004   [ shmid=0x30004 ]
427d8000     120 r-x-- 0000000000000000 0fd:00000 ld-2.12.so
427f6000       4 r-x-- 000000000001d000 0fd:00000 ld-2.12.so
427f7000       4 rwx-- 000000000001e000 0fd:00000 ld-2.12.so
427fa000       4 r-x-- 0000000000000000 0fd:00000 libaio.so.1.0.1
427fb000       4 rwx-- 0000000000000000 0fd:00000 libaio.so.1.0.1
427fe000    1572 r-x-- 0000000000000000 0fd:00000 libc-2.12.so
42987000       4 ----- 0000000000189000 0fd:00000 libc-2.12.so
42988000       8 r-x-- 0000000000189000 0fd:00000 libc-2.12.so
4298a000       4 rwx-- 000000000018b000 0fd:00000 libc-2.12.so
4298b000      12 rwx-- 0000000000000000 000:00000   [ anon ]
42990000      12 r-x-- 0000000000000000 0fd:00000 libdl-2.12.so
42993000       4 r-x-- 0000000000002000 0fd:00000 libdl-2.12.so
42994000       4 rwx-- 0000000000003000 0fd:00000 libdl-2.12.so
42997000      92 r-x-- 0000000000000000 0fd:00000 libpthread-2.12.so
429ae000       4 r-x-- 0000000000016000 0fd:00000 libpthread-2.12.so
429af000       4 rwx-- 0000000000017000 0fd:00000 libpthread-2.12.so
429b0000       8 rwx-- 0000000000000000 000:00000   [ anon ]
429b4000     160 r-x-- 0000000000000000 0fd:00000 libm-2.12.so
429dc000       4 r-x-- 0000000000027000 0fd:00000 libm-2.12.so
429dd000       4 rwx-- 0000000000028000 0fd:00000 libm-2.12.so
429f6000      28 r-x-- 0000000000000000 0fd:00000 librt-2.12.so
429fd000       4 r-x-- 0000000000006000 0fd:00000 librt-2.12.so
429fe000       4 rwx-- 0000000000007000 0fd:00000 librt-2.12.so
45a32000      92 r-x-- 0000000000000000 0fd:00000 libnsl-2.12.so
45a49000       4 r-x-- 0000000000016000 0fd:00000 libnsl-2.12.so
45a4a000       4 rwx-- 0000000000017000 0fd:00000 libnsl-2.12.so
...
mapped: 462172K    writeable/private: 5064K    shared: 309248K
[ root@study1 ~]# 
这里就很明白了。这里的lib*.so是会被很多process load自己的运行环境中,都被ps计算到rss中。
从pmap最后一行的输出中: 
    writeable/ private : 5064K   :这个才是程序真正占用的物理内存。
 
再以top命令看看:
[root@study1 ~]# top -p 22922
top - 09:24:15 up 15:57,  3 users,  load average: 0.10, 0.18, 0.17
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  5.8%sy,  0.0%ni, 90.4%id,  2.3%wa,  0.2%hi,  0.3%si,  0.0%st
Mem:   1507836k total,  1442392k used,    65444k free,    33732k buffers
Swap:  2097144k total,   307124k used,  1790020k free,   559744k cached
 
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                
22922 oracle    20   0  451m   28m   26m S  0.0  1.9   0:00.22 oracle  
 
这儿SHR(共享内存)=26m RES=28m, 28-26=2m(实际占用的物理内存,这个与上面的pmap有点差异)
 
在看看Oracle内存的统计:
SQL> select spid,
        addr,
  2    3          round(pga_used_mem / 1024 / 1024, 0) pga_used_mem,
  4          round(pga_alloc_mem / 1024 / 1024, 0) pga_alloc_mem,
  5          round(PGA_FREEABLE_MEM / 1024 / 1024, 0) PGA_FREEABLE_MEM,
  6          round(pga_max_mem / 1024 / 1024, 0) pga_max_mem
  7     from v$process
  8    where spid = &id;
Enter value for id:                22922
old   8:   where spid = &id
new   8:   where spid =                22922
 
SPID                     ADDR     PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
------------------------ -------- ------------ ------------- ---------------- -----------
22922                    31DFDD20            1             1                0           1
 
pga为1m,与通过top计算的差不多。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/195110/viewspace-764322/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/195110/viewspace-764322/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值