前几天同事反馈:数据库主机上的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/