客户那边多年前的项目,最近总是系统卡顿,cpu居高不下,查看资源管理器,发现io和网络都很高。
偶尔还发现数据库连接不释放,分析程序发现程序是好的,也使用了try catch finally 释放了数据库连接。仔细分析,问题可能出在以下几个方面:
1、程序的写法问题
2、weblogic jdk32位的问题(可以分配的内存空间比较小)
3、数据库clob字段的问题
4、weblogic参数设置的问题(包括数据源和服务器性能参数配置)
依据上面几个方面,分别找解决办法:
1、因为没有源码了,仅仅在维护的项目,通过反编译程序简单看了下代码,发现基本没有太大的问题,这个问题暂时放放,优先级排在最后
2、针对jdk32位的问题,先从oracle官方下载最后一个版本的jrocket1.6 64位版本,在服务器上安装,然后把jdk的的文件夹中的文件覆盖到原来weblogic下的jdk中,运行起来发现出现BEA-000438的问题,又百度,说是jdk32位的native和64位不一致造成的,又从网络上下载了对于的64位native替换后(wlsserver-10.3/server/native/win/32替换本文件夹),完美!把内存空间从1536M改为4096M,运行良好。
3、针对clob字段,发现oracle官网有个clob的优化措施(oracle11g, storeas
SecureFiles
):
create table contracts_sec ( contract_id number(12), contract_name varchar2(80), file_size number, orig_file blob )
tablespace users
lob (orig_file)
store as securefile ( tablespace users enable storage in row chunk 4096 pctversion 20 nocache nologging )
经措施,发现确实比以前好点!
4、经过测试,发现数据库最大连接在200以内,超过150,原来weblogic中配置最大连接数为150,则现在修改为最大连接数为350,调整oracle中的processes和sessions,可以通过(show parameters processes,show parameters sessions)查看oracle数据库原本支持最大的process和session数量,现在改为1000,
alter system set processes=1000 scope=spfile;
alter system set sessions=1105 scope=spfile;
两个参数满足原则:sessions = processes*1.1+5;
在oracle数据库的
LISENER.ORA配置文件中加入:
DIRECT_HANDOFF_TTC_LISTENER = OFF --命令 回收关闭掉长久不用连接
重新启动数据库服务,发现正常,数据库的性能也非常好!
经验总结:原本造成cpu占用非常高,io和带宽非常大,应该是jdk内存空间分配小,32位处理慢以及oracle数据库里面的参数配置比较小,造成很大线程阻塞。经过以上优化发现没有线程阻塞,cpu占用也不高了,io和带宽也下来了。看来jdk的64位版本和数据库层面调优要结合起来用才有良好的效果。之前都是从某一个方面来调优总是效果不尽如人意。