基于Oracle数据库优化性能监控系统的设计与实现
2012-10-21蒋林华
蒋林华
基于Oracle数据库优化性能监控系统的设计与实现
蒋林华
(华侨大学工商管理学院,福建,泉州 362021)
在分析Oracle 性能优化的基础上设计了一个数据库性能监控系统,并利用Java RMI动态加载技术实现远程实时监控系统的解决方案,同时通过远程客户实现监控指令发布和实时监控数据回报。
Oracle;性能监控;J2EE;JFreeChart
随着应用的不断深入和扩大,数据库中的数据量迅速增长,数据操作也越来越复杂,Oracle数据库的表对象、过程SQL等往往不再按照开发人员设计时的思路运行,数据库性能成为制约整个应用系统性能的瓶颈[1]。所以,DBA的一个重要工作就是定期监控,分析评价Oracle数据库的性能是否依然满足客户的应用需求。因此,设计开发一个简单高效的数据库性能监控管理工具来辅助DBA对Oracle数据库进行性能分析和优化成为数据库应用不断扩展的需要。
1 Oracle的结构和性能
由Oracle的体系结构来看,主要包括用户进程和服务进程、Oracle的内存结构和Oracle数据库三个部分。
1.1 用户进程和服务进程
服务进程是充当用户进程和SGA之间的信息传递角色,它将用户进程提出的SQL命令与SGA区存放的信息进行交换。用户进程和服务进程是Oracle 数据库性能优化的一个重要方面,尤其是当用户的数量不断增大时,Oracle数据库性能恶化用户响应时间比较长,需要用户长时间的等待,建立与数据库的重复性临时连接的Web 应用系统会导致性能下降。
1.2 Oracle的内存结构
Oracle的内存结构包括SGA和PGA(PGA是不共享的,即其包含的信息是不一样的)。SGA是Oracle Instance的基本组成部分,包含一个Oracle实例的数据和控制信息的共享内存结构,主要是用于存储数据库信息的内存区,该信息为数据库进程所共享。它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
SGA在实例启动时被自动分配,当实例关闭时被收回。数据库的所有数据操作都通过SGA来进行。SGA中的数据库高速缓冲、重演日志缓冲、共享池、以及大缓冲池和Java池等组件的大小对数据库性能有比较大的影响,它们直接影响磁盘I/O的频率,从而影响Oracle 数据库的效率。
1.3 Oracle数据库
Oracle数据库是由数据文件、控制文件组成和日志文件组成。它们的逻辑结构和物理结构影响磁盘I/O速度和效率,磁盘I/O速度对整个系统性能有重要影响。影响磁盘I/O性能的主要有磁盘竞争、I/O次数过多和数据块空间的分配管理。
总之,对Oracle数据库的优化调整首先从整体环境考虑,包括数据缓冲区调整、SQL语句的重载率调整、磁盘、网络等。其中对控制SGA配置的初始化参数以及数据库的全局参数的值要特别注意。
2 Oracle主要监控对象及其实现
要优化Oracle数据库性能,DBA监控对象主要是对Oracle性能有比较大影响的部分,如:SQL语句的重载率、内存分配、磁盘I/O、Oracle等待、用户锁信息、回滚段等方面。以下重点介绍各种监控对象的具体实现[2-3]。
2.1 监控SQL语句的重载率
SQL的重载率,就是相同的语句,由于无法使用共享池里已经保存的执行计划而不得不重新将代码载入后执行分析,建立查询树后再进行执行的一个过程。每当有应用程序要执行SQL或PL/SQL语句时, 这些代码必须先暂存在Oracle的库缓存中。当应用程序运行代码时,Oracle会先搜索库缓存看该代码是否已经存在于内存中。如果代码已经写入内存中,Oracle就可以重新使用该已存代码(也称为软解析)。如果内存里找不到该代码,Oracle 必须将代码载入到内存中(也称为硬解析或库缓存不命中)。库缓存偶尔会给用户带来的麻烦通常源于各种锁以及随之而来的由锁机制引发的以下等待事件:(1)库缓存加载锁:当有其他用户端对同一对象使用了库缓存加载锁时,新来的客户端必须等待先前的用户将锁释放出来;(2)库缓存锁:比如两个用户端想要同时编译某段相同的代码时;(3)库缓存pin:这时意味着其他会话以不兼容模式锁定了该子堆。
不管库缓存中出现了哪种类型的等待事件,想要确定哪些会话在等待以及在等待的是什么资源,可以通过V$SESSION_WAIT视图查询进行诊断。也可以使用DBA_WAITERS视图并执行以下查询SELECT waiting_session, holding_session FROM dba_waiters。如果等待事件持续的时间过长,那么库缓存内部很可能发生了错误或故障。唯一的补救办法就是杀死持有该锁的所有进程。
2.2 调整内存分配
内存资源的监控主要是Oracle为一个实例分配的一组共享内存缓冲区,它包含该实例的数据和控制信息的监控。内存结构(SGA)由三部分构成:共享池、缓冲区高速缓存、重做日志缓冲区。
2.2.1 共享池
共享池由库高速缓存区和数据字典缓冲区构成,包含用来处理的SQL语句信息和数据字典存储区,共享SQL区包含执行特定的SQL语句所用的信息。库高速缓存区是SGA中的一块区域,Oracle对最近执行的SQL语句执行计划和解析树进行缓存。对缓存的语句核查每一条进入的SQL语句,无论什么时候只要可能,重新使用执行计划。库高速缓存区的命中率表明了SQL语句使用的频繁程度,其相关性能参数可由V$LIBRARYCACHE视图查询。
2.2.2 缓冲区高速缓存
用户进程所存取的所有数据都是经过缓冲区高速缓存来存取,所以该命中率对Oracle性能至关重要。存放数据库中数据库块的copy。它由一组缓冲块组成,这些缓冲块为所有与该实例相连的用户进程共享。缓冲块的数目由初始化参数DB_Block_buffers确定,缓冲块的大小由初始化参数DB_BLOCK_SIZE确定。大的数据块可提高查询速度。
Oracle用LRU(Least recently used)机制维护数据库缓冲区,使得最近使用的块存放在数据库缓冲区。重新获取数据的时候,可以直接从缓冲区中来获得,而不必进行I/O,从而提高性能。LRU命中率反映是否存在LRU latch争用。LRU命中率要求大于99%,如果该值过低,应考虑增加DB_BLOCK_LRU_LATCHES。
2.2.3 重做日志缓冲区
重做日志缓冲区用于在内存中存储未被刷新写入联机重做日志文件信息。它是循环使用的缓冲区,当重做日志缓冲区填满时,将其内容写入联机重做日志文件。可通过计算重做缓冲区分配尝试统计信息的比率来衡量重做日志缓冲区的性能。
用户服务进程尝试把新的联机日志写入日志缓冲区时,如此时无可用缓冲区,就会试图覆盖日志缓冲区的现有条目。但当LGWR进程还没有将当前的条目写入到联机日志文件,用户服务进程就必须等待,然后重新尝试。redo buffer allocation retries就是统计这种情况发生的次数,而redo entries反映DML、DDL语句的重做信息的总数[4]。日志缓冲区的大小由初始化参数LOG_BUFFER确定,大的日志缓冲区可减少日志文件I/O的次数。
2.3 磁盘I/O
磁盘I/O速度对数据库系统读取性能有比较大的影响,其中主要有磁盘竞争、I/O读取次数过多和数据块空间的分配管理。数据文件、事务日志文件分别存放在不同的磁盘上,这样事务处理执行的磁盘访问不妨碍对相应的事物日志登记的磁盘访问;一个应用的表数据和索引分散存放不同表空间上,并且尽量把不同类型的表空间存放在不同磁盘上,这样就消除了表数据和索引数据的磁盘竞争。
监控数据文件的磁盘I/O情况可以通过查询v$filestat,v$datafile,v$tempfile等数据视图获得,主要包括磁盘物理读写次数,执行I/O所花费的最长、最短时间,执行读写I/O所花费的最长、最短时间。根据监控数据,可以发现最有可能引起磁盘I/O瓶颈的文件,并进行性能调整。
3 系统功能模块
通过对Oracle性能元数据的抽取,实现对监控对象性能的实时跟踪和分析,将采集到的性能信息以简洁、直观的图形化方式呈现给DBA,从而帮助DBA更好、更快地定位和解决系统性能的瓶颈。监控系统主要由以下几个功能模块组成:
3.1 数据库概览
后台数据库性能指标的概览,主要是一些直观反映数据库状况的概要信息,包括CPU和内存使用、SGA、进程、磁盘存储等。
3.2 例程监控模块
提供对数据库配置信息、例程信息及内存分配信息的查询,如数据库启动的初始化参数、数据打开模式及是否归档等;并对内存分配的共享池、缓冲区及PGA进行建议,以曲线形式直观地显示各内存分配的指标变化趋势,方便DBA对Oracle数据库进行适当调整。
3.3 性能监控模块
主要对CPU使用状况进行监控,具体包括:对SGA中的共享池、缓存区高速缓存、重做日志缓冲区中统计信息监控,并统计各性能比率及相关命中率;监控回滚段信息和I/O统计信息,了解各数据文件在系统I/O的读写状况;对锁信息进行监控,并对各Latch的使用信息及其相关的比率进行监控等。
3.4 安全管理模块
对用户的账户信息进行监控,如查看用户的账户状态、所使用的默认表空间、临时表空间及概要文件,并可查询用户拥有的角色信息及已授予的系统权限及对象权限等。
3.5 存储管理模块
直观显示数据库控制文件、表空间、数据文件信息及重做日志文件,方便DBA实时了解数据库文件存储状态变化。
3.6 数据库活动情况
监控当前数据库的活动session,通过动态性能视图查找活动session的执行语句,V$open_cursor视图列出session打开的所有cursor,从等待、阻塞锁、事务等子部分详细反应数据库的活动情况。
3.7 SQL活动情况
根据实时显示的SQL语句,发现数据库的SQL语句中重载率比较高的部分,并将较高重载率的SQL语句进行终止。
4 详细设计与实现
设计采用MVC(模型/视图/控制器)模式[5-6],以保证系统的易用性和可扩展性,采用JSP-Servlet- JavaBean技术实现如图1所示的B/S三层架构。前端是IE客户端,中间是基于J2EE实现的应用服务层,后台是存放历史性能数据的MySQL数据库和被监控的Oracle数据库。
MVC的模型部分代表系统的状态,是系统业务逻辑核心,本系统主要对应实时监控模块。实时监控部分采用RMI(Remote Method Invocation)技术实现。它通过定时轮询或客户请求机制从后台数据库获取性能参数,以异步方式发送到客户端,并将相应的性能参数记录到历史性能数据库。这样的处理方式使得客户端程序不需要实现底层JDBC访问机制,而是直接调用RMI应用服务器提供的高层API;同时,应用服务器则可通过对客户端请求施加一定约束来保证系统的安全性。RMI应用程序实现主要包括以下几个步骤:定义和注册RMI服务器→定义和实现RMI远程调用接口→定义和实现RMI远程客户端→产生stub/skeleton→运行服务端和客户端程序。
图1 系统框架
主页面的Applet通过RMI远程调用获取监控数据,RMI服务器将查询结果封装在视图类ViewBean中返回给Applet。Applet先将数据缓存,然后调用主页绘图类绘制结果数据,以Applet插件和HTML方式在IE客户端显示。实时监控的性能数据和历史性能数据大都以折线、饼图、柱状图以及表格等形式呈现给用户。客户端图形对象的绘制调用JfreeChart类库中的相关方法实现,它们的绘制过程被封装到一个类中,提供公共接口供不同的显示程序调用。
系统前端页面与后台RMI服务器之间的通信使用Servlet技术实现,它位于J2EE应用服务器上。因为Applet受浏览器安全模式限制,不能读取客户端文件系统和运行客户端程序,因此只能建立Applet和Servlet之间的网络连接作为唯一的通信路径。我们采用HTTP对象流并结合对象序列化技术从Servlet向Applet传输完整的JAVA对象。
IE客服端主要包括两部分:实时监控的APPLET和数据采集客户页面。其中在实时监控部分显示线程通过消息定购或远程调用不断获取数据库系统信息数据,并把相关信息传递给一些已经设计好的UI组件进行显示。
5 数据采集及显示
在图1中,我们选择使用RMI远程调用来实现实时监控的数据采集,远程对象服务器通过设置java.rmi.server.codebase的属性来指定远程对象的codebase。服务器用RMI registry注册工具通过绑定一个名字来注册这个远程对象,以使客户程序能够通过引用这个名字来调用远程服务对象。RMI 客户请求一个引用来定位到一个命名的远程对象上,这个引用就是远程对象的Stub类的实例,它用来创建客户与远程对象之间的联系。Stub 类担当了一个位于远程服务器上的远程对象的代理,客户用codebase指定远程对象所在机器上的Java 虚拟机上执行代码,然后再将结果( 包括错误信息) 返回给客户端。
另外,MainApplet程序对监控数据进行采集并通过RMI远程存入缓冲区,然后调用主页绘画类DrawMainPage作图显示。在监控系统中实时监控和历史监控数据分析部分的结果大都是以折线图、柱状图、表格等形式反馈给DBA的。
6 结束语
Oracle数据库性能监控系统通过对Oracle性能元数据的抽取,实现对监控对象的实时跟踪和分析,将采集到的运行数据以直观图形方式呈现给DBA,从而帮助DBA更好定位和解决系统性能瓶颈。本系统功能后续工作主要包括提供数据报表、自动故障诊断和性能优化建议、自动联动告警等。
[1] 王娜,宿红毅,白琳,等. 数据库性能监控分析系统的设计与实现[J]. 计算机工程, 2005, 31(24): 105-107.
[2] 盖国强. 循序渐进Oracle[M]. 北京: 人民邮电出版社, 2007.
[3] Ingram G. Oracle 性能优化[M]. 张建明, 英宇译.北京: 清华大学出版社, 2003.
[4] 陈云芳. 精通Struts 2:基于MVC的Java Web应用开发实战[M]. 北京: 人民邮电出版社, 2008.
[5] 刘晓华.精通 Java 核心技术[M].北京:电子工业出版社,2003.
[6] 朱福喜, 唐晓军. Java 程序设计技巧与开发实例[ M] . 北京:人民邮电出版社, 2004.
Design and Realization of Oracle Performance Monitoring System
JIANG Lin-hua
(College of Business Administrator, HuaQiao University, Quanzhou, Fujian 362021, china)
A database performance monitoring system was designed with analyzing performance optimizing of Oracle. It put forward a solution which developed a system of remote real-time monitor based on dynamic code downloading using Java RMI, and realization that the remote client can control the controller and get the Real-time data.
oracle; performance monitoring; J2EE; JFreeChart
TP393
A
10.3969/j.issn.1674-8085.2012.02.017
1674-8085(2012)02-0068-04
2012-01-13;
2012-02-21
蒋林华(1979-),男,湖南永州人,实验师,主要从事计算机应用技术研究(E-mail: yalin@hqu.edu.cn).