1.起因
之前组里做了一个基于drools的业务逻辑校验程序,使用的是java语言。因为工作后一直就用C#,但是学校里教的都是java,用上了很久没用的java还是挺高兴的。做完,测试完,放到线上,回家。
我们的服务设定是每天早上5点定时跑的,到了第二天早上,手机就接到Zabbix的报警短信,我们的那台跑检验程序的机器CPU占用率超过80%,虽然我们之前Drools规则系统已经加入了很多业务,但是CPU占用过高这事从来没发生过,这锅看来必须自己背了。
2.定位问题
到了公司,赶紧看看出了什么问题。重新启动程序,发现CPU占用率在10-70之间波动。查看日志可以发现CPU占用率高的时候代码正在查询Sql Server数据库。
我们数据库访问用到了iBatis,第一感觉是iBatis开了多线程消耗CPU,但是观察程序运行时的线程数并没有增多太多。想着用最新版本是不是可以解决,于是更新了iBatis库的版本。。。然而CPU占用率还是很高。
为了确定是不是Sql语句本身导致的CPU占用,我在Sql Server客户端里面试着运行了下程序的Sql语句,发现CPU占用就没超过20%过。。。
然后用JDBC执行了下访问数据库的语句,发现CPU占用根本不高,而且程序速度也变快了很多。。。