某项目现场反馈无任何业务连接,查询v$process仍有500多个进程;
查询会话连接,也只有十几个会话;
select b.MACHINE, b.PROGRAM,b.USERNAME, count(*)
from v$process a, v$session b
where a.ADDR = b.PADDR
and b.USERNAME is not null
group by b.MACHINE, b.PROGRAM,b.USERNAME
order by count(*) desc;
以下sql查询(将b.USERNAME is not null去掉)也只查询出100+条连接;
select b.MACHINE, b.PROGRAM,b.USERNAME, count(*)
from v$process a, v$session b
where a.ADDR = b.PADDR
group by b.MACHINE, b.PROGRAM,b.USERNAME
order by count(*) desc;
查询是否有远程连接ps -ef|grep "odw (LOCAL=NO)"|wc -l,也没查到;
但是查ps -ef|grep odw,发现p***进程数总共400+个,大概定位到了原因;
本以为是有数据泵或者并行查询在跑,经业务确认没有任何并行跑;
后发现是parallel_min_servers参数是实例启动时自启动的并行进程,这些进程供并行语句使用;PARALLEL_MIN_SERVERS=cpu_count*parallel_threads_per_cpu*2,而parallel_threads_per_cpu默认为1,一般不会手动修改,所以PARALLEL_MIN_SERVERS可以说是由cpu_count确定;
此现场由于有将近20个实例跑在一台主机,cpu配了112物理core,开了超线程为224,而cpu_count为主机cpu线程数,故为224
解决方法:
直接减小直接减小parallel_min_servers并重启库没有效果,起来的ora_p进程数量还是cpu_count*parallel_threads_per_cpu*2,需要手动将cpu_count数调小,根据20个实例的负载大小来调整每个实例的cpu_count,并重启库(cpu_count不需要重启生效,但是已经启动的p***进程并不会自动释放,需要重启释放)