Recent Posts

RSS Feeds

DBA日记第三部 像ORACLE一样思考 (1) 前言

 

 

DBA日记第三部 ORACLE一样思考

 


1 前言

每个来应聘DBA的人我都会问他们一个问题:“Oracle到底是什么?”,有些人会用数据库基础的理论来回答我:“数据库是数据的集合”,也有些人会感到茫然,不知道我问这个问题是什么意思。实际上很多Oracle DBA从来没有思考过这个问题。“Oracle就是Oracle,是一个产品,还能有什么意思呢?我不知道Oracle到底是什么也没有影响到我做一个合格的DBA”,很多人都会这么想。

实际上对于Oracle我们确实还需要重新去认识认识,每个DBA在学习Oracle的时候都往往注重于学习如何建库、如何管理、如何编程、如何优化。虽然说这也是学习Oracle数据库最为常见的一种方法,但是这样学习下去,我们总是在记忆一些枯燥的语法和脚本,虽然经过数年我们积累下了大量的经验,但是我们还是无法真正的理解Oracle,数据库升级了,系统变化了,我们就必须从头去学习。常年累月,我们总是在一次一次的循环往复的重复着同样的事情,直到我们筋疲力尽,对Oracle失去往日的激情,最终DBA成为一个职业,Oracle成为我们谋生的手段。

事实上,我们可以换一种方式来学习Oracle,让Oracle的精神融入DBA的血液中,让DBAOracle一样思考问题,Oracle作为我们的爱好,作为我们生活的一部分存在。对于大多数DBA来说,这也许只是一个乌托邦式的理想,对于绝大多数DBA来说,我们需要有一份工作,需要靠这份工作来生存,娶妻生子,享受生活。并不是所有的人希望让Oracle成为生活的一部分,这是很现实的,不过我们虽然可以仅仅把Oracle当做是生活的一部分,当做是谋生手段,但是我们也可以同时尝试了解更多的Oracle的本质,让我们像Oracle一样思考。

Oracle一样思考虽然不能带给你更多的生活乐趣,但是通过这样的方式去学习和思考,我们会更加精确的了解Oracle的精髓,让我们在DBA的成长过程中少走弯路。10多年前我第一次接触JAVA的时候,感到十分头痛。不是自夸,10多年前,我是一个相当不错的C程序员,最高纪录是一天之内编写500多行复杂的代码,而且一次性编译通过,一次性测试通过,这样的记录的诞生是基于十分良好的过程思维能力的。不过当我这个自认为的编程高手第一次接触JAVA的时候,却感到十分吃力。我无法用面向对象的思想去编写程序,所以我学习JAVA的过程十分痛苦,几次学习,最后都放弃了。直到有一天我看到了一本英文的书籍《Thinking in JAVA》,通过这本书,我掌握了JAVA和面向对象设计、编程的主要思路。自从看了这本书之后,我再次面对JAVA程序的时候,发现一切都是那么的简单。很快我就掌握了JAVA编程。现在我虽然还仍然只是一个三流的JAVA程序员,不过粉丝网的一些修修补补的工作我完全能够胜任了,而且在一些和开发人员交流的时候,我也能够很快的理解他们的思路。

后来我总结了一下,在看《Thinking in JAVA》这本书之前,我在编写JAVA程序的时候,并没有理解面向对象编程的概念,只能是照猫画虎,拿着一个例子在上面修改,实际上我的编程风格还是面向过程的,因此写出来的代码质量很差。而通过《Thinking in JAVA》的阅读,我终于学会了硬面向对象的方法,用JAVA本身的思想去考虑问题,因此我能够更加准确的抓住问题的本质。我想,学习Oracle数据库也是这样,如果我们通过一个案例一个案例的去学习Oracle,那么我们将永远停留在表层上,哪怕我们干上1020DBA,也可能只能学到Oracle的一些皮毛,一旦碰到一个我们没有见到的案例,可能我们就会感到手足无措。

这些年里我接触过大量的DBA,我一般把这些DBA分为四大类。第一类DBA是经验型的,他们处理问题的主要方式取决于以往的经验,他们往往都有很好的习惯,会把每一个处理过的案例整理出来,今后再碰到这类案例的时候,他们会很快的解决问题。这类DBA随着工作时间的增长,他们的技术也会相应的提高。第二类DBA是理论型的,他们具有很深的理论基础,经常探讨一些“Oracle Internal Only”的高深问题,但是他们在某些方面的研究很深,比如他们能够很清晰的告诉你共享池分配的算法,告诉你checkpoint的工作原理,但是这些DBA往往缺乏实际的工作经验,他们研究Oracle但是很少有机会接触大型的数据库系统,因此他们实际解决问题的能力并不强。第三类DBA是技巧型的,他们并不注重理论的学习和经验的积累,他们在处理问题的时候往往能够利用metalink和谷歌百度之类的工具去搜索解决方案,这类DBA是我见到过的最多的,这类DBA处理问题的时候,往往取决于运气。第四类DBA是虚心请教型的,这类DBA无论碰到什么问题,甚至连错误信息都没有看明白,就开始到处叫“我的系统出问题了”,然后到处去问如何解决。

实际上,这四类DBA都是有缺陷的,第一类DBA可能经过多年的工作,有十分丰富的经验,处理问题的能力很强,而且对分析问题十分敏感,很容易抓到问题的关键,但是由于缺乏深入理解Oracle的理论,因此在碰到一些较为深入的问题的时候,在初期总是很难把握住问题的关键,虽然凭借着自身丰富的经验和问题分析排查能力,他们最终也能解决大部分的问题,但是很多时候问题解决后还是无法真正的弄明白为什么会解决问题,下一次碰到类似的问题,可能还是要花很大的代价。

第二类DBA在某些方面的理论知识很强,总是喜欢研究一些十分高深的原理性的东西,但是这类DBA的主要精力都放在了研究一些Oracle内部原理上了,他们没有更多的时间去实践,去把他们学到的理论融合到实践中去。这类DBA往往知识面较为狭窄,仅精通于自己研究比较深入的领域,在实际工作中也很难发挥出自身对理论研究的成果来。

第三类DBA实际上在我们的现实生活中是最常见的,“万事不明问百度,百度不明就抓瞎”,确实谷歌百度和Metalink能够帮助我们解决不少问题,但是这类DBA往往在问题解决后没有好好思考一下,为什么这个方法能够帮助我们解决问题,更没有认真总结和归纳一下,于是下一次碰到类似的问题,还是无法依靠自己的思考去解决问题,于是再google一把,也许这一次运气没有这么好了,google出来的资料不是上回的那个了,于是结果很可能是很悲惨的。

第四类DBA在我们现实生活中也经常出现,网络社会十分发达,打个电话或者在qq群里,msn里问问,也许就有人帮我解决问题,久而久之,这些人放弃了自己思考问题,碰到一点点小问题都首先问起再说。

看到这里,大家可能明白了,老白实际上说的不是四类DBA,而是DBA的四种性格,这四种性格可能会集中在某一个人身上,以老白学习DBA的经验来看,理论结合实践是十分重要的。在2000年前,老白虽然做了很多项目,也是很多人眼里的Oracle数据库高手,但是在2000年前,老白就是第一类DBA的典型,没有经过多少理论学习,几乎所有的Oracle数据库的技能都是从实践中获得的。虽然在实践中我总结出大量的经验,甚至有很多客户建议我写一本书,把我对Oracle的理解写出来。不过当我自信满满的开始写书的时候,我突然发现,我的一些知识需要进行确认,否则写出来就贻笑大方了。于是我开始大量的学习Oracle的一些理论知识,随着写书的过程的深入,我越发感到自身理论水平的不足。《Oracle数据库深度历险》这本书我写了3年,实际上2002年我就彻底放弃了出版这本书的念头,因为我发现我的理论知识确实还需要进一步的梳理,但是我并没有放弃写书,因为我发现通过写书,我更为系统的将Oracle的理论知识梳理了一遍,这次梳理是通过我以前的知识体系、工作经验,用Oracle Concepts的理论基础进行了一次完整的整合。通过这3年的写作,我终于完全疏通了Oracle的理论体系,好像一个练武术的人,终于打通了任督二脉,感到无比的畅快。

听老白说了这么一大通,是不是很多人都感觉到手脚发凉,难道成为一个合格的DBA有这么难吗?如果我没有打通任督二脉,就不算一个合格的DBA吗?实际上DBA成长的道路是很多的,并不一定要走老白这一条路,老白仅仅是根据自身的经历,通过这本书来帮助大家梳理Oracle的一些基础知识而已,还是那句话,如果Oracle是你的爱好,那么你无论花多大代价去研究它都是值得的,如果Oracle只是你职场生涯中的一个工作而已,那么只要你认真对待他就可以了,没必要像老白那样执着。

在这本书里,老白会把《Oracle数据库深度历险》中的一些内容,结合老白的实际工作经验,剖析起原理,并结合案例来说明这些理论知识如何在实践中实际应用,展现给大家,希望老白的这次写作经历,能够给大家带来一些帮助。

 

 


Permalink     2 Comments

DBA日记第二部(补) 5月22日 如何解决?

请点击下列链接查阅

http://www.oraclefans.cn/forum/showtopic.jsp?rootid=16050

Permalink     No Comments

DBA日记第三部 象ORACLE一样思考 前言-写作初衷

最近一直在考虑DBA日记的第三部该写点什么,不少网友也提出了很多好的建议,不过我觉得总是没有抓住要领。老白写DBA日记的本意是写一系列介绍方法的书,而不希望DBA日记写成介绍技术的,因为介绍技术的书实在是太多了,老白目前公务缠身,没有那么大的精力来编写一本精益求精的技术书籍。DBA日记一直以来都是把老白的经历介绍给大家,把老白的一些处理问题的思路介绍给大家,我想第三部也应该是如此。

今年的元旦我是在客户现场度过的,为一家银行的年终决算做护航,期间我和客户的IT部的两位老总分别聊了半个多小时,两位老总都提出了在我们的合作中,希望我能够给他们的技术人员多传授一些方法,让他们的技术人员思考问题的能力有所提升。我和很多客户的IT部门的领导交流过,大多数领导都希望我们能够帮他们提升运维能力,这还是第一次有人希望我能够教会他们如何思考。1号下午,在飞机上昏昏沉沉的我突然有了一个想法,我应该写一本书,通过这本书,让读者能够学会思考问题的方法。一直以来,我都认为Oracle是有生命,有自己的思维的。要想学好ORACLE数据库,就一定要学会按照ORACLE来思考问题。一个DBAORACLE的基本原理理解的越深刻,那么他在处理问题的时候越容易抓住要点,少走弯路。

记得几年前也是冬天的时候,外面的路边积着厚厚的积雪,我和阿风在中原的一个省城为一个客户做数据库优化,那也是阿风第一次参加优化项目。在项目刚刚开始的时候,阿风对于数据库优化十分迷茫,他希望我能够给她讲讲如何做优化。我并没有给他讲优化的技术和技巧,而是带着他一起回顾了数据库的一些基本的组件、基本的原理和算法。记得那次我们住在开发区的一家不错的酒店里,不过出了酒店就是黑乎乎的一片,了无生机。外面是零下56度的严寒,屋内还是暖融融的。我们两个坐在沙发上,喝着茶,上着网,聊着ORACLE。有一天,阿风突然兴奋的叫了起来:“我领悟到了,我领悟到了”。于是我问他领悟到了什么,阿风把一些ORACLE的基本组件、对象和基本算法串在一起给我讲解了一通。我知道这半个月时间我的心血并没有白费,阿风终于学会了用ORACLE的思维来思考问题,这意味着他终于突破了一道很难突破的瓶颈。

我告诉阿风,这个项目我终于可以放心的交给你来做了。阿风很奇怪的问我,你还没有教我如何做优化呢,这个项目我一个人能完成吗?我说难道你这些天学习的不正是优化的方法吗?你现在对如何优化这个系统还是一头雾水吗?

这个项目最后完成的很完美,虽然这是阿风的处女作,不过在我的帮助下,他终于独立完成了大多数的优化工作。通过这个项目也让阿风在技术上获得了一次大的飞跃。技术的完善是可以靠勤奋的学习来实现的,经验的积累是可以靠岁月来堆积的,然而为什么大多数DBA都只能止步于某个阶段,无法成为高手和大师呢?这是因为大家并没有懂得如何用ORACLE的方式来思考问题,不幸的是,如果你没有学会真正的用ORACLE的方式来思考问题,你就永远无法成为一个真正的高手。

DBA日记第三部仍然准备以日记的形式编写,用日记的形式主要是因为我的写作比较随意,所以也无法在初期就很严谨的编写大纲,不过这种写作方式也有不好的地方,就是内容会略显杂乱。在DBA日记正式出版前,我都会对内容进行修订,在修订的时候我会把日记进行重新的调整,使之更为严谨,结构更为合理。

DBA日记第三部会以每天一个技术要点的形式一个一个的分析ORACLE的技术点,采用深入浅出的方式,逐步剖析ORACLE的技术要点的基本原理以及思路。让大家通过对这些技术要点的理解,学会分析问题,处理问题的方法。

至于知识点的来源,我会以ORACLE CONCEPTS为主,我认为理解基本概念是成为一个高手的起点,这些看似简单的基本概念,你真的搞明白了吗?也许你看了老白的日记,会有不同的感受。希望我能带给大家一次愉快的阅读。

 

Permalink     2 Comments

DBA日记第二部 (补) 5月21日 奇怪的性能问题(中)

请到粉丝网查阅

http://www.oraclefans.cn/forum/showtopic.jsp?rootid=15797

Permalink     No Comments

DBA日记第二部 (补) 5月21日 奇怪的性能问题(上)

由于文本较长,在这里贴需要分为几段,已经发到粉丝网了,大家可以点击链接查阅:

 

http://www.oraclefans.cn/forum/showtopic.jsp?rootid=15792

 

Permalink     No Comments

新的一年,新的想法

DBA日记第三部写点什么,我以前一直在考虑,昨天是元旦,下午在回深圳的飞机上突然有了一个想法。题目就叫《象ORACLE一样思考》,很多DBA总觉得自己在分析问题的时候很难抓到要点,实际上这主要是我们缺乏对ORACLE的深入了解,无法象ORACLE一样思考问题。于是我觉得写一本介绍ORACLE基本原理的书,让大家对ORACLE的基本概念有个深入的理解,并且在日常的工作中指导自己的工作,这本书大概在1月上旬开始写吧,届时欢迎大家指正。

Permalink     No Comments

新补写的一节DBA日记

 

请到粉丝网查阅:

http://www.oraclefans.cn/forum/showtopic.jsp?rootid=15757

 

由于DBA日记第二部正在修订,并且元旦要交给出版社,所以近期DBA日记没有更新了,请大家原谅,元旦后交稿后我会继续写第三部,届时欢迎大家阅读

Permalink     No Comments

DBA日记第二部做了结构性调整,正在修订中,第三部的连载要退后一段时间,见谅

前些天和责任编辑一起沟通了一下,对书的结构作了调整,调整后的结构如下(还有一些内容需要补充,所以估计要多花半个月时间修订)

目录

1. 序章 5

1.1. 老白学RAC 8

2. 基础知识篇 10

2.1. 关于RAC安装的一些网络资源 10

2.2. CACHE FUSION的概念 10

2.3. 举例说明CACHE FUSION的算法 12

2.3.1. 场景(1C节点申请访问DB1 12

2.3.2. 场景(2B节点需要读DB1 13

2.3.3. 场景(3B节点需要修改DB1 14

2.3.4. 场景(4C节点需要修改DB1 14

2.3.5. 场景(5B节点需要将DB1存盘 15

2.4. 什么是CRS 16

2.5. RAC的主要性能指标 19

2.5.1. 总体负载与命中率指标 19

2.5.2. 消息传输相关的指标 21

2.5.3. GLOBAL CACHE SERVICE的相关指标 22

2.6. 如何阅读SYSTEMSTATE DUMP 23

2.6.1. 标准的STATE OBJECT HEADER 25

2.6.2. PROCESSSTATE DUMP (ksupr) 26

2.6.3. SESSION STATE OBJECT 29

2.6.4. CALL STATE OBJECT 31

2.6.5. ENQUEUE STATE OBJECT 31

2.6.6. 使用ASS分析SYSTEMSTATE DUMP 36

2.6.7. 一个通过SYSTEMSTATE DUMP定位故障的案例 64

2.7. AWR中的主要事件分析 75

2.8. AWR中的主要WAIT EVENT分析 87

2.8.1. WAIT EVENTS分析的一些常识 87

2.8.2. LATCH FREE 91

2.8.3. db file sequential read 92

2.8.4. db file scattered read 94

2.8.5. Buffer busy waits 98

2.8.6. REDO LOG相关等待 99

2.8.7. enqueue 100

2.8.8. DFS LOCK HANDLE 100

3. 安装升级篇 104

3.1. 麻烦不断的安装历程 104

3.1.1. 31日 安装这种活也找我? 104

3.2. 单机升级到RAC 106

3.2.1. 414日 各怀心思的研讨会 106

3.2.2. 519日 令人目瞪口呆的方案 110

3.2.3. 620日 令人沮丧的实验 116

3.2.4. 621日 好事多磨 122

3.2.5. 71日 一身冷汗 126

3.2.6. 后记-值得总结的教训 135

4. 故障处理篇 137

4.1. 经常宕机的RAC系统 137

4.1.1. 32日 上海的紧急故障 137

4.1.2. 33日 上海第一天 143

4.1.3. 34日 决定 155

4.1.4. 35日 平安无事了 162

4.1.5. 后记-态度决定一切 166

4.1.6. 技术要点-如何分析CRS宕机故障 167

4.2. 好的方法是成功的一半 172

4.2.1. 88日 又宕机了 172

4.2.2. 89日 求人不如求自己 178

4.2.3. 89日夜 定位故障 185

4.2.4. 810日 及时雨 191

4.2.5. 后记-方法的正确性是成功的保障 197

5. 性能优化篇 202

5.1. EIA系统的性能问题 202

5.1.1. 36日 紧急求援 202

5.1.2. 37日 典型的RAC性能问题 206

5.1.3. 38日 阿才的奇怪问题 213

5.1.4. 后记 217

5.1.5. 案例的启示-RAC环境下的常见优化方法 219

5.2. 奇怪的RAC性能问题 222

5.2.1. 84日 系统告急 222

5.2.2. 85日 分析的方法 231

5.2.3. 86日 extent pre-allocation 237

5.2.4. 后记-谈谈负载均衡模式下的RAC优化要点 241

5.3. 爱刨根问底的客户 242

5.3.1. 815日 奇怪的性能下降 242

5.3.2. 816日 系统级的调整 248

5.3.3. 817日 负载均衡OR NOT261

5.3.4. 后记#1-RAC环境中的并行查询 277

5.3.5. 后记#2-为什么在CPU出现瓶颈的时候要加大DB CACHE 279

5.4. 外来的和尚好念经 281

5.4.1. 425日 一封邮件引发的事端 281

5.4.2. 427日 突生变故 284

5.4.3. 429日 Richard Warham 290

5.4.4. 430日 IO优化 296

5.4.5. 51日 在家聊天 299

5.4.6. 58日 危机再现 303

5.4.7. 512日 Richard180度大转弯 308

5.4.8. 513日 系统扩容 311

5.4.9. 514日 Richard请客 316

5.4.10. 61日 新的起点 319

5.4.11. 67日 孤独的唱反调的人 323

5.4.12. 68日 ITL等待引发的RAC性能问题 326

5.4.13. 69日 ORA-8104 329

5.4.14. 615日 又陷危机 331

5.4.15. 616日 IO负载均衡 335

5.4.16. 618日 按下葫芦浮起了瓢 340

5.4.17. 619日 实施优化 343

5.4.18. 后来 347

6. 设计好的RAC应用,也算后记 349

 

Permalink     2 Comments

DBA日记第三部预告

 

老白将于本周完成DBA日记第二部的修订工作,随后将开始第三部的写作。

 

只不过对于第三部写点什么现在还没拿好主意。

Permalink     1 Comment

预备知识之常见WAIT EVENT分析的一个例子

1.1.1. db file sequential read

WAIT EVENT

注释

db file sequential read

这个等待事件是单块读的IO导致的,一般情况下,如果通过索引访问某张表的数据,那么很可能产生这个等待事件。因此这个等待事件可能是一个系统中排名第一的事件,在一个正常的系统中,这个等待事件所占的比例可能超过50%。在一个IO性能正常的系统中,这个等待事件的平均等待在4毫秒左右,平均小于10毫秒都是可以接受的。如果这个等待事件的平均等待时间超过20毫秒就值得引起我们的注意

db file sequential read的平均等待时间如果超过20毫秒,那么我们需要检查IO系统的读写性能,可以使用iostat,sar -d等工具进行分析,也可以使用操作系统自带的工具,比如HP-UXglanceAIX上的nmon等。比如我们用sar -d来检查,如果发现某个设备的繁忙度长时间超过90%,那就说明该设备比较繁忙,如果该设备的avservavwait比较大或者比其它设备高很多.那么就说明该设备存在性能问题。比如下面的数据:

Average      hdisk0      4      0.0       12       48      0.5      3.4

             hdisk1      4      0.0       12       48      0.6      3.3

               dac0      0      0.0      899    12164      0.0      2.9

            dac0utm      0      0.0        0        0      0.0      0.0

               dac1      0      0.0     1918    18031     11.2      6.6

            dac1utm      0      0.0        0        0      0.0      0.0

             hdisk2     41      0.0      156     3412      0.0      5.6

             hdisk3     42      0.0      140      960      0.0      5.7

             hdisk4     39      0.0      154     1219      0.0      4.9

             hdisk5     39      0.0      156     1239      0.0      5.2

             hdisk6     10      0.0      516     6929      0.0      0.7

             hdisk7      8      0.0      322     2617      0.0      0.3

             hdisk8     11      0.0      394     4460      0.0      0.3

             hdisk9      6      0.0      351     3236      0.0      0.3

            hdisk10      0      0.0        0        0      0.0      0.0

            hdisk11      0      0.0        0       26      0.0      0.2

            hdisk12      0      0.0        0        0      0.0      0.0

            hdisk13      0      0.0        0       26      0.0      0.3

            hdisk14      0      0.0        0        0      0.0      0.0

            hdisk15      0      0.0        0       25      0.0      1.0

            hdisk16     27      0.0       71      601      0.0      5.3

                cd0      0      0.0        0        0      0.0      0.0

            hdisk17     99      0.9      549     5434     57.6     36.4

其中的hdisk17上的读写数量虽然不是最高的,但是busy值为99%avwait57.6毫秒,avserv36.4毫秒,这个HDISK的性能存在问题。通过AWR报告我们可以看到存储在这个LUN上文件的IO响应速度指标均较差:

正常的LUN上的文件IO指标:

Tablespace               Filename

------------------------ ----------------------------------------------------

                 Av      Av     Av                       Av     Buffer Av Buf

         Reads Reads/s Rd(ms) Blks/Rd       Writes Writes/s      Waits Wt(ms)

-------------- ------- ------ ------- ------------ -------- ---------- ------

BAR_RECORD_D04           /dev/rv_bard4_1_10g

        25,073       7   15.1     1.0           10        0      2,700   12.3

BAR_RECORD_D04           /dev/rv_bard4_2_10g

        24,958       7   15.2     1.0           15        0      2,733   13.0

BAR_RECORD_D04           /dev/rv_bard4_3_10g

        24,462       7   15.1     1.0           10        0      2,549   12.5

 

HDISK17上的文件IO指标:

Tablespace               Filename

------------------------ ----------------------------------------------------

                 Av      Av     Av                       Av     Buffer Av Buf

         Reads Reads/s Rd(ms) Blks/Rd       Writes Writes/s      Waits Wt(ms)

-------------- ------- ------ ------- ------------ -------- ---------- ------

BAR_RECORD_I04           /dev/rv_nb100_8g

        27,834       8  102.8     1.0       63,865       18      2,688   31.3

BAR_RECORD_I04           /dev/rv_nb101_8g

        27,893       8  102.1     1.0       62,061       17      2,644   27.5

BAR_RECORD_I04           /dev/rv_nb102_8g

        27,921       8  107.0     1.0       62,788       17      2,708   33.6

BAR_RECORD_I04           /dev/rv_nb103_8g

        27,540       8  106.1     1.0       62,082       17      2,471   36.6

BAR_RECORD_I04           /dev/rv_nb104_8g

        27,618       8  100.7     1.0       62,030       17      2,996   23.4

BAR_RECORD_I04           /dev/rv_nb105_8g

        28,183       8  105.0     1.0       63,669       18      2,891   30.7

BAR_RECORD_I04           /dev/rv_nb106_8g

        28,055       8  104.3     1.0       62,848       17      2,981   30.7

BAR_RECORD_I04           /dev/rv_nb107_8g

        28,038       8  103.6     1.0       63,435       18      3,393   20.3

 

 

Permalink     No Comments

DBA日记第二部的预备知识部分内容简介

最近DBA日记第二部正在整理,争取这个月上旬截稿并交给出版社。第一部由于出版社内部原因导致延误,可能大家还要等一段时间了。第二部有望在2月份前和大家见面。

在预备知识部分准备了几个内容:

1、CACHE FUSION的基本原理

2、用案例来讲解CACHE FUSION的基本算法

3、RAC相关的主要性能指标

4、CRS主要模块功能介绍

5、如何阅读SYSTEMSTATE DUMP

6、AWR/STATSPACK报告中的主要指标值的含义

 

举例:

名称

注释

CPU used by this session

统计CALL发起开始到结束的CPU时间片的数量,每个计数代表一个CPU周期,也就是10毫秒。不过如果有一个CALL不足一个CPU周期就执行完了,那么统计值的时候START TIME和END TIME是相同的,这样会计算为0.这个计数基本上可以代表了ORACLE数据库消耗的CPU资源,不过计算的时候要注意单位是厘秒(cs),乘以10可以换算成毫秒。比如平均每秒这个指标值是782.1,表示ORACLE消耗了7821毫秒CPU时间,如果这个系统是一个16个CPU的系统,那么这个指标可以说明ORACLE消耗了超过50%的CPU资源。不过由于部分小的CALL可能由于消耗的时间小于10毫秒而没有计算进去,实际的使用率可能略高于通过这个值计算出来的。一般来说大多数CALL消耗的CPU都会大于10毫秒,所以这个值还是能够基本反映出ORACLE对CPU资源的开销

CR blocks created 

CURRENT块被克隆后用于创建CR(consistent read)块。被克隆的主要原因是BUFFER被非兼容的模式占用,如果单位时间内CR BLOCKS CREATED值比较高,说明数据库中对某些数据块的修改和访问比较频繁。如果这些访问集中在某些热块上,那么可能会形成较为严重的BUFFER BUSY WAITS,在RAC环境中,可能还会导致全局热块冲突,如果这个指标比较高,那么应该关注BUFFER BUSY WAITS以及CACHE BUFFER CHAINS闩锁等

current blocks converted for CR

一个CURRENT的BUFFER在被使用前生成了CR

DBWR buffers scanned

当某些触发条件发生时,DBWR会在LRU链的冷端开始扫描脏块,组成DBWR BATCH,这个指标统计的是DBWR在LRU上扫描的BUFFER的总数,包含脏块和干净的块,这个指标除以DBWR LRU SCANS这个指标就是每次扫描查找的数据块的数量。

Permalink     1 Comment

补写的2小节DBA日记

1.1.1. 6月8日 ITL等待引发的RAC性能问题

从这几天的情况来看,虽然说系统性能还很不错,不过我从IOCPU的性能趋势上,已经感觉到了不妙。我习惯于每天把STATSPACK报告中的关键数据采集到一个EXECL表格里,定期生成一个折线图来查看趋势。这几天我明显看到折线的斜率在持续增加,以我的经验,这是很不好的先兆。今天早上和老万在QQ上聊了几句,和他说了我的担心。老万随后又咨询了一下RichardRichard认为目前IO上升只是因为这几天的系统负载在不断增长,IO系统经过前一段时间的优化已经有了数倍的提升,肯定可以确保不会成为瓶颈。

看样子老万也是被最近良好的系统状态迷住了眼睛,对我的判断也开始将信将疑了。在这种情况下我也不好多说什么,反正主动权也不在我手里,就由着Richard折腾吧,如果折腾好了,那大家都消停了,如果出问题了,我再出面吧。

老万和我聊了几句就出去开会了,我正准备离开,突然小吴给我的MSN发来一个消息:

老白:帮下忙,我这里出大问题了。一套3节点的RAC系统,最近这几天总是会莫名其妙的变慢甚至HANG住,有时候几分钟,有时候10多分钟。重启应用后也不能解决问题,过一段时间又出问题了。

今天关了一个节点,只剩下两个节点,系统反而稳定了,一上午都没有出现HANG主的现象,不过本来三个节点的业务压在两个节点上,两个节点的的CPU都快100%了,内存也有点不够用。用户很着急,想尽快找到问题的原因,尽快解决了,然后把第三个节点也用起来。

我马上看了看他发过来的AWR报告:

 

 Instance Efficiency Percentages (Target 100%)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Buffer Nowait %: 99.57  Redo NoWait %: 99.99

Buffer Hit %: 98.06  In-memory Sort %: 100.00

Library Hit %: 99.81  Soft Parse %: 99.73

Execute to Parse %: 21.28 Latch Hit %: 99.86

Parse CPU to Parse Elapsd %: 57.16 % Non-Parse CPU: 97.01

 

从命中率上看,各项指标都还算正常,BUFFER NOWAIT的比例略微偏低一些。TOP 5 EVENTS是:

Top 5 Timed Events

~~~~~~~~~~~~~~~~~~  % Total

Event  Waits  Time (s)  Ela Time

-------------------------------------------- ------------  ----------- --------

enqueue    1,872,325  85,528  39.87

buffer busy global cache      218,188  34,053  15.88

db file sequential read    1,366,797  20,368   9.50

log file sync     499,127  20,099   9.37

buffer busy waits     216,884    9,241   8.97

TOP 5 EVENTS上来看,ENQUEUE等待占近40%buffer busy global cache等待占15.88%,这是典型的全局热块冲突现象。看样子解决热块冲突是最终解决问题的关键。我看了一下热块冲突相关的等待情况:

Class

Waits

Total Wait Time (s)

Avg Time (ms)

data block

108,5360

10200

9

1st level bmb

7930

10

1

undo header

2820

0

0

2nd level bmb

560

0

0

segment header

520

0

0

undo block

3

0

0

看样子热块冲突主要集中在数据块上,看样子又免不了要调整表的存储结构。我又往下看了看锁等待情况的分析:

                                                     Avg Wt         Wait

Eq Requests     Succ Gets    Failed Gets       Waits Time (ms)  Time (s)

-- ------------ ------------ ----------- ----------- ------------- ------------

TX     568,022       568,098                81,688      1,031.33       84,247

US   1,170,363     1,170,362               806,425          1.12          901

SQ         247           247                    25     11,396.24          285

CF       6,252         6,249                   190        256.92           49

HW       2,787         2,787                 1,162          2.10            2

 

从锁等待的情况来看,主要的等待还是TX锁,从这里也可以为我刚才的热块冲突导致问题提供一个旁证。锁等待过高的原因不是因为Oracle内部锁,而是因为TX事务锁导致。小吴他们在故障发生的时候还走了HANGANALYZESYSTEMSTATE DUMP。从HANGANALYZE上我们看不到任何异常的地方,把SYSTEMSTATE DUMPass.awk分析后也没有发现很明显的问题。主要的等待是TXBUFFER BUSY GLOBAL CRBUFFER BUSY WAIT

我问小吴故障出现时有没有检查过V$LOCK,小吴说当时都看了,主要都是TX锁。我问小吴当时有没有留意TX锁的LMODE是多少,小吴马上翻看了一下日志,说大多数是6,不过也有不少是4LMODE=4是共享模式,LMODE=6是排他模式。如果存在大量的LMODE=4的锁请求,那说明可能ITL存在等待现象,因为LMODE4一般来说可能是ITL等待或者等待索引页节点分裂。于是我让小吴检查一下ITL等待的情况:

set line 132

col statistic_name format a30 trunc

SELECT T.OWNER, T.OBJECT_NAME, T.OBJECT_TYPE, STATISTIC_NAME, T.VALUE value

     FROM v$segment_statistics T

     WHERE t.STATISTIC_NAME = 'ITL waits' 

     AND t.VALUE > 0 order by value;

这个查询排在前几位的对象都是我们需要关注的。从查询的结果来看,排在前面的10几张表和索引都有大量的ITL等待。于是小吴检查了一下这几张表,发现这些表的存储参数中initrans都是2pctfree都是缺省的10。看样子问题很明显了,initrans是导致问题的元凶。我建议他们把这些表和索引的inittans加大为10,并且最好把相关的表和索引都重建一下。小吴说其中有几张表基本上只做insert ,不会做UPDATEDELETE操作,是不是只需要修改参数,不需要重建了,那几张表都是分区表,最小的也有78G

我想了想,INITRANS参数修改后,新的数据块中这个参数就会起作用,而老的数据块不会生效,所以需要对表进行重组才能彻底解决问题。而像小吴说的那种情况,老的数据块很少会做DML操作,表不重组问题也不大。不过索引还是需要REBUILD的,否则索引上的ITL争用也可能会导致问题。

小吴马上修改了这些表和索引的参数。索引重建和部分表的重组工作只能等晚上停了应用再做了。和小吴分析了半天才发现已经是下午的3点多钟了,午饭还没吃,不过一点饥饿的感觉都没有,看样子也没必要去吃午餐,只能晚上多吃点了。这样的生活习惯,人不胖才怪呢。

1.1.2. 6月9日 ORA-8104

昨天和小吴处理了一个RAC的性能故障,昨晚上小吴他们重建了部分表和索引,上午10点多钟小吴给我打了电话,他说今天3个节点都开了,从上午的ASHAWR报告情况来看,BUFFER BUSY GLOBAL CRENQUEUE等待得到了很大的改善,现在排在TOP 5 EVENTS第一位的是CPU TIME了。

小吴看到今天系统的状态,觉得RAC优化方面需要考虑的问题太多了。小小的ITL居然会引起如此严重的问题。确实是,在单机环境下,这些等待往往只是导致系统变慢而已,但是在RAC环境下,如果这些等待严重了,后果要严重的多。在RAC环境下,除了INITRANS外,FREELISTS FREELIST GROUPSPCTFREE等参数都是需要关注的,如果设置不合理,都可能导致严重的性能问题。

今天没什么事,和小吴聊了会天,随便在楼下吃了点午饭,想想下午也没什么事了,就跑到旁边的游泳池游了会泳。由于是下午,泳池里没几个人,水也挺干净,不过少了养眼的漂亮妹妹,游起来也觉得比较枯燥。刚游了两个来回就觉得有点困了,于是在躺椅上眯了一会。醒来一看,已经是下午4点多钟了,急忙换好衣服,一边拿着棉签抠着耳朵,一边拿出手机看了看了一下,发现有10个未接电话。

我还没来得及查看哪来的电话,又有一个电话打了进来。电话是小吴打来的,他们上午的时候发现了一个索引的ITL等待十分严重,于是趁着中午业务比较少,对这个索引做了一个在线重建(REBUILD ONLINE),两点多钟的时候,他们发现业务有点慢,怕是这个索引重建引起的,于是就杀掉了做REBUILD索引的进程。没想到杀掉进程后麻烦就大了,有一个业务不停的报ORA-8106,他们判断这个报错可能和中断的REBUILD ONLINE有关,于是想再次重建这个索引,可是一做REBUILD ONLINE,就报ORA-8104错误,这个索引无法REBUILD了,而且想删除掉后重建也不行了。这个错误已经持续了快3个小时了,目前他们让前台暂时手工处理那个业务,等修复后补录数据。

ORA-8104是一个十分常见的错误,总有一些心急的DBA半路杀掉正在做REBUILD ONLINE的会话,而每次杀掉REBUILD ONLINE的会话,都会经历一个噩梦。由于在做索引在线重建的时候,可能相关的表还在变化,Oracle需要记录这个索引的相关变化,因此Oracle会创建一张临时表来记录这些变化,等索引重建完成后再删除这张临时表,这张临时表的名字为SYS_JOURNAL_<INDEXOBJECT_ID>REBUILD ONLINE刚刚开始的时候就会去创建这张日志表,但是如果创建日志表的时候,发现这张表已经存在了,就可能会报ORA-8104,并无法继续做REBUILD ONLIE(普通的REBUILD会检查索引的FLAG标志和这张表,如果冲突,也会失败)。如果REBUILD ONLINE被中途杀掉了,那么这张表和IND$中的FLAGS不会被自动清除,必须由SMON来清除。而SMON每个小时会进行一次类似的清除工作,SMON做清除前首先要锁住日志表,如果这个索引相关的表还在变化,那么SMON可能无法锁住这张表,如果SMON锁表失败,就会放弃这次清理工作,等一个小时后再来清理。这样一来,在业务较为繁忙的生产系统上,可能SMON永远都没有机会清除这张日志表。我就曾经碰到一个客户,这个错误持续了34天才恢复。

ORACLE 10G中,Oracle提供了一个存储过程来代替SMON做手工清除(DBMS_REPAIR.ONLINE_INDEX_CLEAN),只要不停的重复执行这个存储过程,就可能清除失败的索引。不过如果是9i的数据库就很麻烦了。去年我曾经碰到一个客户,他们也是做了核小吴他们类似的操作,导致系统出现故障,没办法重启了数据库都没有解决问题。后来我建议他们手工清除了日志表,并且修改了索引的FLAGS。手工解决这个问题分为两个步骤:

1、手工删除日志表:

Permalink     8 Comments

DBA日记 第二部 (42) 优化实施

1.1.1. 6月19日 实施优化

早上9点多钟我被一阵电话铃声惊醒,一想到昨天晚上做的工作,我感觉不太妙。昨天晚上10点开始,我们对系统进行了一些调整,主要是把几张碎片较为严重的表做了重建,然后REBUILD了部分索引。

昨天的优化包含几个部分,第一部分是参数的调整,把SHARED_POOL_SIZE3G加大到了4G,同时把SESSION_CACHED_CURSORS100加大到150,这部分工作在昨天下班前就做完了,我首先把spfile做了一个备份,然后用alter system命令直接修改了SPFILE的内容,只要数据库重启一下这些参数就可以生效了。

第二部分工作是把一些常用的PL/SQL对象KEEP到共享池里,这些对象包括一些系统的包和一些开发商开发的包,还有几个触发器。这些PL/SQL对象执行的频率十分高,但是也经常有RELOAD现象出现。KEEP的脚本我事先写好了,并且放在了服务器上,只要数据库重启后执行一下就可以了。KEEP部分SQL的工作比较麻烦,需要找到HASH VALUEADDRESS,因此需要第二天业务跑一段时间后再做,我已经把查找ADDRESS的脚本写好,只要跑一下就可以生成出DBMS_SHARED_POOL.KEEP的脚本出来。

第三部分工作是整理存在碎片的表,由于只有451200M的表,所以这部分工作也比较简单,我们准备直接使用move来处理,不过为了安全起见,我们在做MOVE之前先通过exp对这几张表进行了备份。备份完成后,直接执行aleter table <owner.table> move;然后rebuild一下这张表的索引,然后重新分析一下表和索引。

第四部分工作是REBUILD一下索引,事先我已经把REBUILD索引的脚本都编写好了。实施的步骤是首先加大PGA_AGGREGATE_TARGET4G,然后执行脚本REBUILD索引,最后对这些索引进行重新分析,最后把PGA_AGGREGATE_TARGET修改回原来的值。加大PGA_AGGREGATE_TARGET可以提高排序的性能,这对于提高索引重建的速度有较大的帮助。

这些操作都是十分常规的优化操作,所以我们也没有做特殊的准备。晚上10点钟开始停应用,10点半的时候开发商告诉我应用已经全部停了,首先关闭了listener,然后检查了一下操作系统中是否还有前台进程,通过ps -ef|grep "LOCAL=NO"发现还有10多个前台进程没有正常退出,于是我用

ps -ef|grep "LOCAL=NO" |awk '{ print "kill -9 " $2}'|sh

清理掉了所有的前台进程,然后开始了今天的工作。由于今天整理的表都比较小,最大的一张表也不过200M左右,所以今天我们只是在整理前通过exp工具将要整理的表都导出,然后直接采用ALTER TABLE ... MOVE进行整理,而没有采用以前常用的先RENAME然后再创建新表,插入数据的做法。MOVE表,重建索引,分析表和索引,整个工作不到一个小时就完成了。

REBUID索引比较耗时,在近100GWORKORDER表上有7个索引,REBUILD这张表上的索引就花了1个多小时,还好我们有5个小时的停机时间。不过总的来说一切都比较顺利,2点半我就收工了。由于我是通过VPN连上去的,所以所有的操作都是由现场的小马实施,我只是通过MSN和小马进行协调和沟通。

今天早上不到9点钟,小马就又回到公司了,老万手下只有这么一个DBA,他也够辛苦的了。小马一上班就发现系统的活跃会话数量不太正常,平时一般来说9点左右的时候活跃会话数在100-120之间,今天早上活跃会话数量在150左右。他马上检查了一下cpu的使用情况,发现CPU使用率明显高于昨天,平均值居然达到了85%,甚至有时还出现了IDLE0的现象。

我听小马一说,就感觉到可能是昨天的优化操作出问题了,于是我马上打开电脑通过VPN连了过去。使用glance一看,确实是CPU的使用率明显比昨天高了不少,通过OEM的健康性图表观察,发现BUFFER GET的数量也比昨天多了很多,从OEM的平均事务响应时间图表来看,平均事务响应时间变化不大,在1.4秒左右波动,比昨天还是略高。不过从健康性图表上看到,主要的等待事件和昨天差不多,主要是db file sequential read,在TOP等待事件里,并没有出现共享池相关的等待事件,通过闩锁图表来看,共享池的相关闩锁还算正常,争用比昨天小。看到这里我感觉一块石头落了地,只要不是共享池的调整出现了负面影响,那么基本上可以确定是某些SQL的执行计划发生了变化,因为我们昨天做的操作也只会影响到这两个方面。

于是我马上做了一个6级的STATSPACK采样,并且和9点的SNAP生成了一份报告。从报告上看,排在BUFFER GET前几位的SQL里出现了几条陌生的语句,这几条语句以前都没有出现在BUFFER GET相关的TOP SQL里的。看样子就是这几条语句出了问题。我看了一下,在10分钟里,这几条语句分别执行了几十次到几百次不等,每次执行的BUFFER GET的数量在10万到60万之间,还有一条执行了30多次的SQL,每次执行的BUFFER GET的数量达到220万。

看样子昨天为了节省时间,只重新分析了处理过的相关表和索引,而并没有对所有的表重新做一次分析,这导致了部分SQL的执行计划改变。于是我马上又做了一个6级的STATSPACK采样,然后把这几条SQLSQL报告生成来了。

打开一个SQL报告正准备认真分析分析,老万的电话打了进来。我感觉老万很紧张:“老白,好像出问题了,昨天的优化非但没有见到好的效果,反而情况更恶化了”。

我告诉老万,昨天晚上只分析了相关的表,导致了部分执行计划发生了改变,这个问题不大,我分析一下,然后把相关的表重新分析一下就应该没问题了。今天晚上争取再把系统中其他的表都分析一下,昨晚已经把系统中最大的3张表都重新分析过了,剩下的表估计56个小时就能全分析了。

“老白,那你快想想办法,尽快解决这个问题,10点钟系统负载就高了,别顶不住了”,老万还想继续罗素,被我打断了:“万科,我正在分析呢,你就别添乱了,10点前肯定搞定它”。

放下老万的电话,我继续分析SQL报告。发现这几条SQL都有一个特点,都是通过NESTED LOOP连接,而且这些SQL都和WORKORDER,FEEDBACK相关,连接的表中大多数包含了23张小表。于是我检查了这几张和这些SQL相关的小表,发现这些小表的统计数据都是3个月前的,从dba_tables来看,这几张表都只有10来条记录,是十分小的表。这些表走NESTED LOOP也很正常。难道是这些表的数据发生了变化。于是我对这几张表做了一个SELECT COUNT(*)。这么一查,就发现了问题了,这几张表的数据和DBA_TABLES里的统计数据有了较大的差异,一张以前分析的时候只有12条记录的表,现在居然有100多条记录了。看样子这就是导致执行计划发生变化的原因了。

于是我马上对这几张小表做了一个分析,分析操作刚完成,我就发现平均事务响应时间的曲线突然下降了。曲线波动的中心点从1.4秒下降为1秒了。我马上用vmstat检查了一下CPU的使用情况,发现CPU的使用率明显下降了,平均使用率在60%左右,看样子问题已经解决了。

中午的时候,我分析了一下10点到11点的STATSPACK报告,发现TOP SQL中的几个SQL的平均每次执行的BUFFER GET数量均有少量的下降,这是昨天晚上优化的效果,共享池方面的改善不是很明显。平均每秒的CPU开销也略有下降,大约在1017厘秒左右,昨天的优化目的已经基本达成。

下午我在STATSPACK报告里又发现了一个存在异常的SQL,检查了一下发现还有一张参照表存在类似的问题,对这张表做了分析后,这个SQL就从TOP SQL中消失了。下午3点到4点这段时间,CPU使用率一直保持在70%左右,从STATSPACK报告上看,CPU used by this session的值为1065。我给老万打了个电话,告诉他优化效果不错,CPU使用率下降了5%,老万听了也很高兴。

晚上的时候,我收到了老万的一个邮件,对我表示感谢。邮件的最后,老万希望我能够再拿出点压箱底的东西来,再做几次优化,这样他心里也能踏实点。我给他回复说,优化是整体工程,象昨天这种单方面的优化效果不会特别好。经过前一段时间的优化,目的已经基本达成,没必要再画蛇添足了。如果要优化,明年我们做个大的,通过对底层应用的优化,一劳永逸的解决这个系统的问题。

回了邮件没过多久,就收到了老万的回复。回复很简单,只有一句话:“收到,经费问题我想办法”。

Permalink     3 Comments

关于DBA日记第二部的说明

DBA日记第二部还有最后一节就结束了,大家有什么建议可以提提。下面这段时间里我会修订这部分内容,希望能够尽快成书和大家见面。

对DBA日记第二部的修订大家有什么好的建议可以提出来。另外第三部写些什么,也可以提一些建议

Permalink     No Comments

DBA日记 第二部 (41) 按下了葫芦浮起了瓢

1.1.1. 6月18日 按下葫芦浮起了瓢

昨天系统运行很正常,IO明显好转,CPU使用率虽然也有所上升,不过一直在60-70%之间波动,偶尔突破80%,不过最高的时候也没有超过85%。昨天老万和我还特意冒充业务人员在QQ群里说今天系统用的真爽,此话一出应者云集,大家都对系统的情况表示满意。不过也不乏忧患意识比较强的人,他们担心这又是昙花一现。在QQ群里愉快的聊了聊天,我和老万又在网上聊了一会。老万问我今年的业务高峰这个系统应该没问题了吧。我说应该差不多了,目前系统已经日处理单量接近15万单了,业务部门预计今年的最高日单量也不过15万,这个系统应付每天15万单还是绰绰有余的。老万最后问我,如果系统出问题,那会出在什么地方,我想了想说,如果出问题,也许应该是在CPU上吧,如果真的每天的单量超过20万的话。

今天早上起得很早,7点多就睡不着了,起床后一边打开电视,一边打开电脑收邮件。小马把昨天的Statspack报告发过来了,顺便还留了一句留言:“昨天截止晚上18点的单量居然突破性的达到了17万单,这是这个系统有史以来处理的最高日单量,系统状态良好,平均事务响应时间为1.13秒。”

看到这个信息,我下意识的感到有点什么不对劲,昨天的最高单量居然超过了17万单,这已经远远超出了业务部门评估的最高日单量。我连忙打开下午3点到4点的STATSPACK报告,看了看CPU used by this session,这份报告里这个指标的值是1184,也就是说平均每秒钟的CPU消耗达到11.84秒,对于一个16 CPU的系统来说,意味着在3点到4点期间的平均CPU使用率为75%,这是最近这段时间以来最高的。

昨天我还和老万聊到CPU可能会是下一个出问题的地方,而老万还对于20万的单量表示怀疑,昨天老万还颇具调侃意味的说:“如果真能达到每天20万单,那今年我们的奖金就大大的有了”。从昨天超过17万单的数字来看,这20万单也确实不是不可能的事情。我急忙通过VPN拨到系统上,查了一下昨天截止到临晨12点的总单量,统计结果让我大吃一惊,昨天处理的总工单量居然达到了不可思议的182千多单。

吃过早饭后,我又登上系统看了看,往常8点半开始业务逐渐增多,到10点钟达到高峰,11点后业务量开始回落,直到下午2点开始回升,到下午34点钟达到一天中的最高峰。6点后,业务量开始减少。今天早上8点半的时候,系统的CPU就已经达到了60%,比前几天高出不少,看样子今天系统的负载也会很高。

我给老万打了个电话,老万也正在看着昨天的统计数据发呆,我打电话过去的时候,他刚刚和业务部门的人通过电话,业务部门说今年天热的早,而且华北、西北、华中、东北地区持续高温的天数比往年长20天左右,因此造成了今年空调、冰箱、风扇和热水器销售的井喷,生产那边也在拼命加班,所以今年的工单量到底增长多少,现在还在测算中,不过据现在保守估计,高峰时突破20万工单已经不是悬念了。

对于20万工单这个新的情况,我和老万都感到了压力,以目前系统的情况来看,CPU还真有点悬。老万问我有没有什么简单的办法,能够减少CPU的使用率。我想了想,要想减少CPU的使用率,最好还是修改应用,不过在目前的情况下,想简单的调整一下来实现这个目标,唯一可行的就是整理一些常用的中等规模表的碎片,重建索引,添加几个索引,改善一些常用SQL的性能。和老万商量好后,我们决定今天晚上申请4个小时的停机时间,把几张一直想整理的碎片较多的表整理一下,并且重建WORKORDERFEEDBACK表等几张和工单相关的大表的索引。鉴于目前IO系统状况较好,因此我建议如果CPU确实比较危险了,那么可以把部分KEEP POOL中的索引和表放回DEFAULT POOL,甚至可以减少一些DB CACHE的大小,从而以增加IO开销来平衡CPU负载。不过现在还没有危机到这一步,暂时可以作为一个备选预案保留。

今天上午业务高峰期的CPU平均使用率已经达到了70%以上,偶尔也有CPU超过90%的情况出现。中午12点多的时候统计了一下工单量,居然已经接近8万,看样子今天全天突破18万是肯定的了。

我下午又分析了一下,发现共享池的争用也很厉害,SHARED POOLLIBRARY CACHE的相关闩锁争用较为严重,闩锁争用导致的等待占总等待的6.5%,闩锁争用会导致不必要的CPU资源消耗,看样子优化一下共享池也可以减轻一些CPU的负担。于是我马上又做了一个调整共享池的方案,共享池从3G加大到4G,并且把部分常用的PL/SQL对象和SQL语句通过dbms_shared_pool.keep PIN到共享池中。由于这个操作需要重启数据库,因此我和老万商量了一下,把停机时间从4个小时增加到5个小时。

下午CPU使用率一度高达80%左右,不过从系统的各项指标来看,都很正常,平均事务响应时间也保持在1.2秒左右,下午3点到4点的平均每秒事务数量超过了70,这也是这段时间以来的一个高峰。下午的时候老万又给我打了个电话,他对CPU的情况十分担忧,我只能安慰他,从目前来看,日工单量已经超过了18万,按往年的惯例,78月份业务最高峰的时候,顶多比现在高20%左右,而目前CPU资源还有20%多的空闲,增加15-20%的业务量,虽然会出现一些轻微的瓶颈,平均事务响应时间可能会有所下降,不过估计也能保持在2-3秒之间。通过我们今晚的一些优化,估计可以减少5%CPU使用率,这样就为渡过业务高峰奠定了基础。等10月份高峰过了,我们再考虑启动一个全面优化的项目,在明年业务高峰到来前,这个系统的问题就可以彻底解决了。

听了我的分析,老万悬着的心放下了不少,不过他对今天晚上的优化又多了一丝期望,他问我今晚还能做点什么,他可以申请的最大停机窗口是8小时,如果能做,就尽可能多做一些,随着业务高峰的来临,今后要想申请停机也会越来越困难。我想了想,目前能做的事情也就这么多了,这种关键的生产系统,只有最有把握的操作才敢去做,否则做出问题来就麻烦了。

快下班的时候,我把优化实施方案发给了老万他们,临下班的时候,小马通过MSN向我建议说,既然共享池有争用,是不是可以设置CURSOR_SPACE_FOR_TIMETRUE,这样可以减少SQL分析。我告诉小马,这个参数虽然可以减少软分析,不过这个参数会导致某个会话在退出前,使用过的CURSORPIN在共享池里,时间长了会导致共享池出现严重的碎片。因此现在一般情况下都会通过SESSION_CACHED_CURSORS,而尽可能不要使用CURSOR_SPACE_FOR_TIME。我们的系统是三层结构的,WEBLOGIC通过连接池访问数据库,在连接池的设置上,MINMAX设置是一样的,也就是说我们采用了长连接的方式,几乎所有的连接是不会断开的。一旦我们使用了CURSOR_SPACE_FOR_TIME,那么共享池可能会出现严重的碎片化情况,严重的情况会导致宕机。

小马听了我介绍了这个参数,恍然大悟的说“我刚才在网上GOOGLE到一篇介绍减少共享池争用的文章,里面就介绍了通过设置这个参数来优化共享池,没想到还有这种副作用。看样子今后看GOOGLE的东西还是要慎重”。

Permalink     No Comments