背景:发现oracle占用内存过大,根据自己的memory_target配置,最大占用内存设定为20G,sga_max_size和pga_aggregate_target设置也不大,而oracle占用的内存已经远远超过了20G。
环境:windows server 2008 R2,oracle 11.2.0.4。
现象:查询v$process视图发现有个进程ORACLE.EXE(SHAD),占用大量内存。
select PROGRAM,
PID,
SPID,
SERIAL#,
pga_used_mem / 1024 / 1024 / 1024 USED_MEM_G,
PGA_MAX_MEM / 1024 / 1024 / 1024 MAX_MEM_G
from v$process t
order by pga_used_mem desc;
SHAD服务器进程有人称之为shadow process,但实际上,这个进程在体系结构中都很少提到。可能是在Oracle Dedicated Server模式下收到客户端请求后,Oracle将为客户端创建的一个新的服务器进程和会话。
在11gR2版本中,pga_aggregate_target只是一个建议值。在12c的版本已经有了pga_aggregate_limit,解决了pga过大的问题。限制pga的大小
该进程内存过大原因未知,过了一段时间,内存又降下去了。如有大佬告诉我可能的原因,感激不尽;
顺藤摸瓜:查询官方文档,了解下在专用服务模式下的pga占用内存的估算算法
假设有5000个客户端在连接数据库,其中每个会话所需的内存为400 KB,每个服务器进程所需的内存为4 MB。那么pga的占用内存大概为
Dedicated Server
Memory used = 5000 X (400 KB + 4 MB) = 22 GB
在实际使用中,也可以查询视图可以设置合理的memory_target:
select value from v$pgastat where name='maximum PGA allocated';
--查询对应的pga最大大小
memory_target = sga_target + max(pga_aggregate_target, maximum PGA allocated)