观察cpu的时间,虽然不能很准确的定位问题产生的点,因为有可能因为其他任务导致这些线程运行的cpu时间很久,可以想象,如果当某个任务或者某个功能占用cpu高,所有的其他任务,cpu的等待时间也会很久,所以先分析cpu高的可能点:<b><font color="#c41230">由堆栈信息可以看出大量的线程阻塞到socket读的地方,</font></b><font color="#c41230"><b>推断可能是由于网络延迟或TCP服务连接后没有响应造成 java.net.SocketInputStream.socketRead0一直阻塞等待读取,再继续看,我们可以看到很多地方出现了getConnection,而getConnection后面没有连接释放等操作,大概率卡在和数据库的连接上了</b></font><br>
引发思考:1. 什么原因导致卡在连接上的?2. 卡连接会导致cpu高吗?<br>
解答:1. 原因导致卡连接的有如下情况:(1)网络在那一刻延迟严重 (2)数据库压力很大,导致连接数据库做操作的时候,数据库响应时间很久,连接会一直保持不释放,这样的情况,有可能会造成连接池溢出,或者连接池接近满的状态<br>
主要分析第二种情况:数据库压力大体现在,cpu高的阶段,数据库在执行大量的sql导致,或者跑某些大的定时任务,导致数据库压力很大,这个时候如果是oracle数据库,可以取awr在cpu高的时间段内的报告(sqlserver暂时不清楚),看看是否有大sql一直在运行;此类问题不方便重现的情况下,要尽量找到历史原因,一个一个因素排除掉,首先要排除的是数据库在那时刻的压力,如果数据库正常,我们再想着是不是网络延迟导致的,网络延迟的问题,可以通过脚本ping出记录,如果oa和数据库服务器分开部署,且是linux,可以通过两台机子测试网络状况,见标签;所以卡连接导致cpu高的原因,是因为cpu调度分配线程,线程要去做很多工作,这些工作如果都在一直在运行状态且卡着无法执行下去,cpu肯定会高;所以,导致cpu高的因素,实际上你就只要发现某个任务,某个线程只要一直卡着做某个事情,这个事情无法得到cpu合理的调度,并且cpu一直在处理这个事情,无果,cpu就很大概率会高上去,但是反之,cpu高,并不一定会引起其他的都高,具体的要具体分析。<br>
总结:遇到问题,虽然会产生各种疑问,但是不要害怕,一个一个来解决,解决问题的方式=产品的熟悉+经验<br>