接KM公司技术人员反馈,用户新安装的一台windows200864位HIS服务器,数据库版本是10.2.0.4,将业务迁移到新服务器后正常运行情况下CPU资源占用异常的高,经常达到100%,导致业务经常卡顿,用户查看资源管理器未发现异常进程,CPU资源大部分被ORACLE进程占用。
遇到这种情况,一般就想到先看到底是oracle的那个进程(会话)过多消耗CPU,如果是linux系统,我们可以通过PS命令轻松的查找到进程号,但是本案例中的环境是windows,该环境下如果在资源管理器中只能看到一个oracle.exe进程,而会话的‘进程’是通过线程的形式,这里我们就必须借助第三方软件,这里推荐Process Explorer,执行界面如下:
点中oracle.exe进程,双击进去,选中线程,如下:
这里的TID就对应数据库V$PROCESS视图里面的SPID,通过对CPU消耗的排序,我们找到TID后,再通过下面的SQL去看该线程在进行什么操作,如下:
Select s.Sid, s.Status, q.Sql_Text
From V$session s, V$sqltext q
Where s.Sql_Hash_Value = q.Hash_Value And s.Sql_Address= q.Address And
s.Sid In (Select s.Sid
From V$sessions, V$process p
Where s.Paddr= p.Addr And p.Spid = &TID)
Order By q.Piece;
我们发现消耗CPU消耗最高的线程经常再变更,频率很高,随机找了一条当时消耗最高的线程,通过查询看到是执行的一条普通查询SQL,由于该SQL没有问题,执行计划都正常,这里就不再磊述。
接下来我们再分析下数据库整体的CPU消耗,我们通过取AWR报告分析,结果如下:
整体CPU的消耗并不高,这就奇怪了,为什么CPU会占用这么高呢?再分析awr报告的操作系统信息,发现了问题:
我们这里看到数据库统计的CPU信息中,NUM_CPUS为2,NUM_CPU_CORES为1,这就意味着该服务器只有2颗CPU,每个CPU只有1核,作为一台承担医院HIS业务主服务器,这样的CPU配置肯定是不够的,怎么会这样呢?为了确认CPU的情况,我通过CPU-Z这个软件,进行了查看,确认确实当前服务器只使用了1核,如下:
咨询现场的技术人员,原来他进行了限制,当时在安装数据库时,遇到典型的错误windows2008R2安装到2%就卡住的问题,根据网上的资料进行了处理,百度文库中有该文档地址http://wenku.baidu.com/view/6a24eab9c77da26925c5b0ef.html,在msconfig中对CPU进行了调整,当时技术人员把处理数调整为2,如下:
但是他在安装完成后,并没有按照文档说的改回来,因此导致CPU一直被限制只能用2个处理器。
既然已经找到原因,就把取消掉该限制,在命令行中输入msconfig, 去掉之前的勾,然后重启下服务器,如下
通过修改,可以看到下面的处理器也可以选择,而且核数和线程都变成6和12,CPU的资源利用率也不再是100%,降到了合理的范围。
1.windows查看线程的工具:windows下没有linux下面这么方面,可以通过命令查看进程号,因此必须借助第三方工具,这里推荐Process Explorer,绿色,方便,直观。
2.根据spid查询会话的执行语句:
Select s.Sid, s.Status, q.Sql_Text
From V$session s, V$sqltext q
Where s.Sql_Hash_Value = q.Hash_Value And s.Sql_Address= q.Address And
s.Sid In (Select s.Sid
From V$sessions, V$process p
Where s.Paddr= p.Addr And p.Spid = &TID)
Order By q.Piece;
3.msconfig禁用CPU:利用msconfig禁用CPU,在安装完数据库后记得改回去。