windows下禁用CPU导致CPU资源过高

基本要素

接KM公司技术人员反馈,用户新安装的一台windows200864位HIS服务器,数据库版本是10.2.0.4,将业务迁移到新服务器后正常运行情况下CPU资源占用异常的高,经常达到100%,导致业务经常卡顿,用户查看资源管理器未发现异常进程,CPU资源大部分被ORACLE进程占用。

问题分析

步骤一:首先分析会话占用CPU

         遇到这种情况,一般就想到先看到底是oracle的那个进程(会话)过多消耗CPU,如果是linux系统,我们可以通过PS命令轻松的查找到进程号,但是本案例中的环境是windows,该环境下如果在资源管理器中只能看到一个oracle.exe进程,而会话的‘进程’是通过线程的形式,这里我们就必须借助第三方软件,这里推荐Process Explorer,执行界面如下:

windows下禁用CPU导致CPU资源过高_第1张图片

         点中oracle.exe进程,双击进去,选中线程,如下:

windows下禁用CPU导致CPU资源过高_第2张图片

         这里的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消耗

         接下来我们再分析下数据库整体的CPU消耗,我们通过取AWR报告分析,结果如下:

 windows下禁用CPU导致CPU资源过高_第3张图片

         整体CPU的消耗并不高,这就奇怪了,为什么CPU会占用这么高呢?再分析awr报告的操作系统信息,发现了问题:

windows下禁用CPU导致CPU资源过高_第4张图片

         我们这里看到数据库统计的CPU信息中,NUM_CPUS为2,NUM_CPU_CORES为1,这就意味着该服务器只有2颗CPU,每个CPU只有1核,作为一台承担医院HIS业务主服务器,这样的CPU配置肯定是不够的,怎么会这样呢?为了确认CPU的情况,我通过CPU-Z这个软件,进行了查看,确认确实当前服务器只使用了1核,如下:

windows下禁用CPU导致CPU资源过高_第5张图片

         咨询现场的技术人员,原来他进行了限制,当时在安装数据库时,遇到典型的错误windows2008R2安装到2%就卡住的问题,根据网上的资料进行了处理,百度文库中有该文档地址http://wenku.baidu.com/view/6a24eab9c77da26925c5b0ef.html,在msconfig中对CPU进行了调整,当时技术人员把处理数调整为2,如下:

windows下禁用CPU导致CPU资源过高_第6张图片

         但是他在安装完成后,并没有按照文档说的改回来,因此导致CPU一直被限制只能用2个处理器。

解决过程

步骤:调整msconfig中的CPU限制

         既然已经找到原因,就把取消掉该限制,在命令行中输入msconfig, 去掉之前的勾,然后重启下服务器,如下

windows下禁用CPU导致CPU资源过高_第7张图片

         通过修改,可以看到下面的处理器也可以选择,而且核数和线程都变成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,在安装完数据库后记得改回去。

你可能感兴趣的:(ORACLE-整体优化)