优化这个话题是很多朋友感兴趣的,今天就再聊聊。很多人说给系统做优化就像医生治病,用药的君臣佐辅,下药的顺序都不能差了。我不懂中医之术,因此不好类比。不过我懂炒菜,就用炒菜的道理来聊聊优化这项工作吧。
要想让一道菜好吃,炒菜的主料配料选择与配比十分关键,只有主料一味未免单调,而选择比较抢戏的配料也不合适,会把主料的味道给冲了,让菜的味道变得比较怪异。合适的主配料搭配和配比是一道菜好吃不好吃的基础。

针对这个Load Profile我们可以看出系统中存在很多高负载的点,每秒redo超过9MB,逻辑读632万+,物理读高达6.4万+/秒,一小时内的读写IOPS高达1.8万+,读IO吞吐量500MB+/秒,写IO吞吐量15MB/秒,每秒事务数100+,每秒执行数接近5000。针对这个负载文件,我们能给它找出食材配料表吗?

也许有些朋友还比较谨慎,还需要继续看看等待事件和命中率的情况再下结论。从命中率上好像也看不出啥来,都是较高负载的系统应该有的命中率情况。唯一低点的是library Cache的命中率和软解析的比例。不过从解析占用的CPU资源上看,问题似乎也不算太大。
从等待事件上看,好像除了DB CPU外,都是gc方面的问题,单块读等待只占3.4%,而且平均延时只有1毫秒,说明存储性能不错。确实,本系统的主要数据都在闪存盘上。

从等待事件的分类统计上看,DB CPU占了近一半,cluster排第二位,占了26.9%。似乎解决掉这两个问题,系统的主要问题就都解决了。不过到这里我们还是无法做出很好的判断,必须继续分析。

这时候我们需要继续查看CPU的情况,因为从主要事件上看,CPU占比较大。从这个报告上看,LOAD居然高达500+,这对于128核,256线程的7、8年前采购的服务器来说,有点高了。

从OSW的数据上,我们也验证了CPU负载很高的问题。这套系统是问题十分严重的,因此现象表现其实是十分明显的,很容易找到我们需要的食材。CPU使用率过高、IO负载过高、REDO量过大、集群等待比较严重、共享池存在一定问题。这些都是目前系统存在问题的关键,也就是我们要享用的食材。
下一步就是怎么烹调这道菜了,煎炒烹炸,蒸煮煲汤,哪种方式更适合这些食材呢?这就是我们要制定的优化策略了。从这个系统上来看,有经验的DBA一定会选择先降低CPU的使用率,因为如此大的IO量,后端存储还撑得住,没有性能明显下降的趋势,在CPU与IO的选择中,首先会选择降CPU为主的做法。一旦确定了CPU优先的测了,那么在第一阶段的优化中,REDO的问题也不需要过多的考虑了,虽然平均每秒有9MB+的REDO量,以经验来看,全闪的SAN存储是没有任何问题的。
选定了烹饪方法之后,就要考虑烹制的细节了。先炝锅还是先爆锅,用荤油还是素油,加葱姜还是大蒜?这种选择奠定了采的基本味道,因此不得不重视。因为这套系统的优化需求十分紧急,因此找出一些逻辑读较高,CPU使用量较高的SQL,看看能不能通过添加索引,纠正执行计划等方法把CPU降一降。给后续的全面优化争取出一定的时间。
这个系统中的RAC GC的问题也很严重,要想分析如何优化GC,首先我们需要分析RAC的相关指标。

从RAC的相关指标上看,除了流量大一些以外,其他指标都正常,不算太差,说明GC问题不是系统性的,而仅仅是部分SQL不优化引发的,这种问题解决起来比较容易。在消息上,Ksxp队列上的延时比较大,indirect sent的比例偏高了一点。这些都是和流量较大有关的。因此降低RAC INTERCONNECT的流量应该是解决这个问题的比较稳妥的方法。虽然说优化CPU使用率高的SQL有助于降低RAC流量。不过我们如果能够针对性的解决问题,才会有更为明显的效果。

这些TOP SEGMENT相关的SQL语句是我们本次优化的重点,在这里我们发现了一张消息表。有200GB+,其中的数据可以删除清理。如果能够完成这个操作,可以大大降低RAC通讯流量。
经过这样一个个的分析,我们就基本上能够确定第一阶段的工作方案了。通过第一阶段,首先解决目前最为紧迫的问题,让系统恢复可用。然后给我们留出足够多的时间来做精细化的全面优化。通过全面优化,让系统焕然一新。
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
我知道全局变量$!包含最新的异常对象,但我对下面的语法感到困惑。谁能帮助我理解以下语法?rescue$! 最佳答案 此构造可防止异常停止您的程序并使堆栈跟踪冒泡。它还会将该异常作为值返回,这很有用。a=get_me_datarescue$!在此行之后,a将保存请求的数据或异常。然后您可以分析该异常并采取相应措施。defget_me_dataraise'Nodataforyou'enda=get_me_datarescue$!puts"Executioncarrieson"pa#>>Executioncarrieson#>>#更现实的
我在我正在处理的一些代码中发现了这一点。它旨在解决从磁盘读取key文件的要求。在生产环境中,key文件的内容位于环境变量中。旧代码:key=File.read('path/to/key.pem')新代码:key=File.read('|echo$KEY_VARIABLE')这是如何工作的? 最佳答案 来自IOdocs:Astringstartingwith“|”indicatesasubprocess.Theremainderofthestringfollowingthe“|”isinvokedasaprocesswithappro
我今天看到了一个ruby代码片段。[1,2,3,4,5,6,7].inject(:+)=>28[1,2,3,4,5,6,7].inject(:*)=>5040这里的注入(inject)和之前看到的完全不一样,比如[1,2,3,4,5,6,7].inject{|sum,x|sum+x}请解释一下它是如何工作的? 最佳答案 没有魔法,符号(方法)只是可能的参数之一。这是来自文档:#enum.inject(initial,sym)=>obj#enum.inject(sym)=>obj#enum.inject(initial){|mem
我刚刚有一个关于RubyonRails和模型(Rails3)中的attr_accessible属性的一般性问题。有人可以解释应该在那里定义哪些模型属性吗?我记得一些关于批量分配风险的事情,虽然我在这方面不太了解......谢谢:) 最佳答案 想象一个带有一些字段的订单类:Order.new({:type=>'Corn',:quantity=>6})现在假设订单也有折扣代码,比如:price_off。您不想将:price_off标记为attr_accessible。这会阻止恶意代码制作最终会执行如下操作的帖子:Order.new({: