顶顶顶顶顶顶顶顶顶顶 |
如果你感觉系统命令不是很熟悉,你可以看一下v$pgastat、v$systat来看一下uga等使用情况。 |
我的这个系统是运行定时的工作流,每天的session数量基本上是固定的。session数量没有明显增加。 另外,我用ps -ef |grep ora|wc -l 可以看到300个左右的进程,不知道用什么方法可以定位出哪个进程发生了内存泄露。 还有个疑问,pga_aggregate_target 是 3062M,理论上讲,PGA的使用总量不应该超过这个值。SGA target和pga_aggregate_target之和,是不是理论上应该是oracle server应该使用的内存上限?我的服务器上只有oracle运行。这样理论上,我oracle的内存使用率应该在 40%左右,加上server的内存的使用,应该不超过60%.对这点,还是很疑惑。 |
昨天发的问题,不知啥原因丢了 |
我用以下命令 ps -ef|grep ora|wc -l 查出我的系统里有大概300个和oracle有关的进程,如何甄别是哪个进程发生了内存泄露呢? 我理解的内存泄露的概念是,某个进程在运行的过程中使用了1m内存,在进程结束后,只还给了操作系统0.8m的内存,这样0.2m的内存就被无端占用,其他进程也无法再使用这0.2m的内存了,这样就造成了内存泄露。 pga_aggregate_target 的值是限定了oracle session 总的pga使用量,理论上将不应该超过这个上限的。 |
谢谢老师的分析。我的系统每天基本上是运行固定次数的工作流,session数量没有明显的增加。我再研究研究动态监控的办法。 另外想请教老师个问题,理论上讲,sga_target和pga_aggregate_target之和是不是应该是oracle可以使用的最大内存数?如果是这样的话,我的这个oracle sever理论上不应该超过40%内存使用率,主机本身如果不运行其他应用,整个服务器的内存使用率理论上将不应该超过60%. 另外,内存泄露是否是oracle所导致,是否为系统的bug? |
内存的使用情况基本上是和进程的使用情况同步的,因此重点关注下面的几点: 1、用户session数的增加 2、pga的使用情况 3、使用topas+pmap,找出占用内存比较大的server process的情况 |
随着时间的推进,你的内存使用会逐渐增加,那么最常见的情况就是内存泄漏。 你需要关注一下pga的使用情况,具体的命令,论坛里面有。 对于单个进程的内存使用情况,你可以使用pmap命令来看,论坛里面有详细的说明。 你的内存的增长,主要是pga内存的增长。 |
oracle重启以后,内存使用率下降很正常。 因为重新启动以后,PGA不会在短时间上升。 而且SGA开始也不会占用那么多。 |