Oracle性能诊断的方法有很多,下面就此讲讲常用的几种方法。一般而言,如果需要进行性能调整,那么,肯定是存在一些性能问题。所以,诊断,要从用户所提出的性能问题开始着手,做到有的放矢。
用户可能会罗列出一大堆的性能问题,你比如说:某个操作比较慢呀,或者说当达到多少用户的并发时CPU和内存使用达到100%,死锁等等。所以,我们要对用户列出的这些性能问题进行分析。当然,首先得从用户认为最迫切的性能问题开始着手进行分析。
明确了性能问题,这是系统调优的***步,让我们有一个出发点,但是分析性能问题,找到性能问题产生的原因,这是一个复杂的过程,并且是性能调优的非常重要的一个过程。只有找到了产生性能问题的根源,你才好着手进行调整。
在Orace性能诊断上,首先要有一个思路。从整体到局部,从面到点,逐步定位是一个不错的方法。那么,什么是从整体到局部呢?
Oracle数据库本质上是运行于某一种计算机上的应用软件,所以,这个整体,我指的就是运行Oracle的计算机(即服务器)。如果,性能诊断问题的根源是因为计算机的性能低下所导致,那么,做其它的调整将不能根本改变Oracle的性能状况,我们得从调整这个整体开始(即服务器的性能)。
服务器的性能我觉得由2个因素所组成:硬件和操作系统。
(1)硬件包括:CPU,内存,存储等。检查的方法是我们可以登录到服务器发布一些命令来查看服务器CPU,内存,以及硬盘等的I/O速率,如UNIX下及类UNIX(LINUX)下可以发布:
Top,vmstat,iostat,free等等命令来检查这些硬件资源的使用状况。还可以使用一些第三方的测量工具。比如,有一些工具是专门用来测试硬盘的传输速率的,从中我们可以知道硬盘的平均带宽是多少。
通过这些工具,如果检查出来,发现是由于服务器的硬件资源所导致的性能问题,那么,我们就可以建议提升服务器的硬件。
(2)第二个因素是OS。因为Oracle是运行于OS之上的,所以OS的一些设置,也会导致一些性能问题。特别是在LINUX下,一些参数的设置,如:内核参数,交换空间(swap)等等,也能影响到整个系统的性能。所以,我们也可以在服务器上查看一下这些设置。如果是windows服务器,windows提供了一个性能测量工具,可以测量每秒的内存页交换(paging)等指标,从这些指标中我们也可以检查出内存是否足够,以及虚拟内存是否足够等等一些问题。
检查完服务器,就可以从Oracle本身开始进行分析了。分析的思路,我也是从整体到局部,从面到点。
整体:首先,我们可以从了解一下Oracle数据库的规划开始,这些规划具体包括:存储的规划,内存的规划,实例参数设置等等,下面我分别作一些简单的介绍。
(1)存储的规划(storage planning):实际上指的就是Oracle数据库的磁盘规划,这关系到Oracle的I/O性能。举例:oracle的数据文件磁盘是否和oracle软件磁盘分开?应用系统是否有创建单独的表空间?有没有为索引和大对象创建单独的表空间?多路复用(multiplexed)的控制文件是否分别存放于不同的磁盘?日志组的不同成员是否存放于不同磁盘?等等,这些都或多或少地影响到oracle的I/O性能。
(2)内存规划(memory planning):实际上指的是oracle SGA和PGA的分配是否合理?以及组成SGA的各个内存组件的内存分配是否达到***?一般而言,对于排序操作(sort operation)比较多的系统,比如,我们的XPC系统,或者报表系统,就应该适当地多分配一些内存给PGA。当然,PGA总体目标也要根据系统的连接数来确定。在SGA方面,总体原则是,尽量把大部分的内存分配给数据库高速缓存,以增加内存的命中率。至于其它组件如:JAVA池,大池等分配几十M就可以(32M一般就够了)。而对于共享池,则要根据CPU的性能来决定。一般而言,如果CPU很强(如采用多路CPU),则共享池设小一点也无所谓。一般而言,设80M~300M都能满足系统需求,再多设的话对系统性能增加不大,反而浪费内存。
(3)实例的参数:有些Oracle实例的参数能够影响到整个系统的性能。你比如:与oracle优化器相关的一些参数设置,与SQL共享和重用相关的参数,与是否预先将SGA装载到内存相关的参数等等.我们都要检查一些,这些参数设置是否合理.
那么,我们怎么能够检查出这些整体的设置是否就是导致性能问题的根源呢?Oracle有提供一个用于诊断性能问题的工具包(statspack).当然,可能也有一些第三方的用于oracle性能诊断的工具,但是我想没有其它工具比ORACLE本身提供的工具更全面,更准确了。
STATSPACK需要安装。安装后我们需要设置一下检查的时间间隔,实际上就是创建一个oracle的JOB。Statspack或根据我们设定的时间间隔来从oracle的动态性能视图中捕捉一些与性能相关的数据,然后根据一定的公式进行计算,生成一个有关于oracle各项性能指标的报告。报告罗列了一些实际的活动状况(负载,内存命中率等等),***等待事件,以及TOP SQL等内容,是我们进行Oracle性能诊断的一个比较综合的一个工具。
局部:oracle的整体调整完毕后,我们就可能逐步逐步调整某个局部了。你比如,我们可以根据用户反映出来的问题:比如说,在XPC中点击某个BUTTON或进行某项操作,系统响应比较慢,这个时候,我们就可能针对这个问题,来进行定位。导致这个操作慢有可能是由于这个操作执行的SQL语句比较慢,也有可能是由于我们的JAVA代码写得不够好,实现比较复杂,结构不合理等等所导致。往往,这样的性能诊断,要DBA和相关开发人员一起协同完成。在DB这一层,我们可以使用ORACLE的一些实用工具,如SQL TRACE等来捕捉这些SQL,然后对这个SQL的进行分析,并进行优化,从而解决这些性能问题。根据实践,相当大一部分性能优化是在SQL语句一级着手的。
除了上面我所描述的这些以外,其它与性能相关的情况也需要调查一下。如:Oracle是采用何种类型的优化器?如果是采用基于成本的优化器(CBO),是否有定期进行统计(gather shema statistics)?统计的时间间隔设置是否合理?
另外一个跟SQL性能相关的因素就是索引。我们也可以检查一下是否在相关表上有否建索引?这些索引建得是否合理?是否有存在从来没有被使用过的索引(通过索引监控工具来检查)?
***一个检查的项可能是和并发有关。假如用户反映说系统有时会出现死锁,这时,我们就要检查一下导致死锁的原因了,如捕获相关的引起死锁的SQL语句,分析是由于应用的架构设计所导致还是由于业务逻辑本身所导致。在DB这一级,我们可以检查一下事务的隔离等级是否高置合理。
【编辑推荐】