转自vage

讨厌香草冰激凌的汽车与Buffer busy wiats的故事

        记得好几年前看到过一个故事,通用公司曾收到一客户的邮件,邮件中客户描述了一个非常奇怪的问题。他们家有晚饭后去吃冰激凌的习惯,如果他们买的是香草味的冰激凌,则会打不着车子,买其他口味则没有问题。
        “汽车讨厌香草味冰激凌?”,这封奇怪的邮件,并没有被通用不屑一顾的弃之一边,相反通用反而派出工程师,专程到客户哪里调查问题。调查的结果大出人的意料,客户邮件中的问题,的确属实。
        而后工程师连续几天,每晚同客户一起去买冰激凌,而客户的问题,的确是“重可现”的,每次买香草味冰激凌,果然打不着车子。
        得到这个不靠谱的结果,通用没有找理由搪塞客户,而是让工程师继续调查。哪名工程师也够执着,在对汽车的一系列检查无果后,他转向客户买冰激凌的过程。他沉着的记下了客户买冰激凌的每个细节。然后,经过对细节的对比,他发现问题的根源有可能是时间。因为香草冰激凌最为畅销,因此商店将放在最显眼的地方,最容易找到。因此,“买香草冰激凌”这个动作所花的时间,比“买其他冰激凌”要短。这名工程从时间上着手,终于找到了通用汽车的一个漏洞。
        从不着边的事情入手,怀着一份好奇心,将目观关注在细节上,就能发现不靠谱的问题,原来挺靠谱。
        好,故事讲完了,下面说一个数据库的问题 。
        前些时应朋友之邀,帮忙诊断一个数据库问题,10.2.0.4,单实例的,现象很普通,就是客户反应慢。以半小时为期,查了几份AWR,I/O没有问题,日志文件写I/O有点慢,但量不大。TOP5等待中,buffer busy waits排的比较靠前。于是优化了几个逻辑读比较高的SQL,客户反应慢的操作,已经有反好转。再看buffer busy waits,有所缓解,但在AWR报告中还是有点靠前。按说,到这一步工作也就结束了,按常通常的理解,如果不能使用更小的数据块、在数据块中放入更少的行,buffer busy waits也没有什么好方法可以进一步调优了。更何况,客户反应已经可以,不需要再继续下去。。但是,正像“买香草冰激凌就打不着车”一样,我相信细节、好奇心,决定成败,特别是DBA这份工作尤是。我决定再仔细查查原因。
        Oracle数据库是一个庞大而复杂的软件,正是因为如此,才需要有DBA这个工种,专门维护它。这么复杂的一个软件系统,出现问题,往往都不是独立的,而是各种情况交织在一起的。如何从纷乱的信息中,找到入口点呢?我决定采取和通用工程师一样的方法,从时间上入手。仔细观察ASH视图,运气还算好,果然发现buffer busy waits有明显的、不定时的周期性。每隔一段不定长的时间,十分钟左右,就会突然高一下。
        很多时候,是没有这个好运气的。去年还在阿里时,为了查一个库回滚段空间为什么不足,我足足花了两周时间,做了N种测试方案,最终才定位到问题。现在也有时间了,我会慢慢整理出来,大家可以关注www.mythdata.com
        继续讨论今天的话题,在buffer busy waits的升高的同一时间点,还发现了Log file sync也会突增一下,但升幅没有buffer busy waits高。问题很可能会和日志文件有关联。进一步查看日志文件的切换,最后,终于定位到问题---日志切换。
        每次日志切换时,buffer busy waits的等待总会突然严重一些,而后下降至正常水平。
        buffer busy waits竟然和日志文件有关联,这还是第一次注意到。而且,Log file sync和日志切换的关联,比Buffer busy waits要大很多。但为什么这里却看到了相反的结果?问题的原因找到了,但更大的问题来了,这一切的原因是什么。而且,进一步观察,手动切了一个日志,发现等待Buffer busy waits的Session,都正在执行Select,没有DML。
        日志切换,会导致Select等待Buffer busy waits。
        
        和通用客户的问题一样,我也得到了一个奇怪的结论。为了测试是否在所有数据库是都是如此,我找了测试环境,测试如下:
        环境:版本10.2.0.4,Redo File大小200M,OS是Solaris。
        步1:打开两个测试用Session,此处SID分别是858和859,在另一会话处记录测试前数据:
set linesize 1000
col event for a30
select EVENT,TOTAL_WAITS,TOTAL_TIMEOUTS,TIME_WAITED_MICRO/100 from v$SYSTEM_EVENT where event in ('buffer busy waits','log file sync');
EVENT               TOTAL_WAITS TOTAL_TIMEOUTS TIME_WAITED_MICRO/100
------------------- ----------- -------------- ---------------------
buffer busy waits           479              8             131918.28
log file sync                11              2              39382.83
        步2:
        (1)、先在859会话开始跑如下程序块:
declare
   j number;
begin
for i in 1..30000 loop
   select count(*) into j from a1;
end loop;
end;
/
        这其中,表A1的所有数据,只占1块数据块,全扫描表1,只需要11个逻辑读。
        (2)、马上在858号会话开始执行如下包含DML的程序块:
declare
   j number:=0;
begin
for i in 1..30000 loop
   update a1 set id=id+0 where id<=10;
   if j >= 100 then
      commit;
      j:=0;
   end if;
   j:=j+1;
end loop;
commit;
end;
/
        反反复复的更新A1表,每更新100次,提交一次。
        步3:在步2中的两段程序执行完后,再次用步1中的SQL统计buffer busy waits和Log file sync的等待次数和时间。减去步1时的值。同时查询V$LOG,确定是否有日志切换。
        
        结果:我反复重复了N次如上测试,没有日志切换时,buffer busy waits通常等待少于3万次,2万9千多次和3万次之间。有日志切换时,这个值略有上升,在3万到3万零几百次之间。虽然次数差别不大,但等待时间上,差别可就大多了,没有日志切换时,等待时间在27、28秒左右,有日志切换时,则是58秒左右。
        
        既然走到这一步,不如再测一下。日志切换会影响buffer busy waits,原因还在于日志切换时,写日志文件会有短暂的阻塞。也就是说,写日志文件的速度,会影响buffer busy waits。进一步测试一下。将日志文件的位置移到更快速的存储设备上再测,从等待次数上看,下降不是很多,但从时间上看,下降非常明显,从原来的58秒(有切换)、27秒(无切换),下降到0.6秒(有切换)、0.5秒(无切换)。下降分别100倍(有切换)、50倍(无切换)。
        我分别在新、老Redo文件存储上,用dd命令测试了一下写入速度,原位置每秒200M左右,新位置每秒700M左右。写入速度增加了3至4倍,但buffer busy waits等待时间减少了至少50倍。看来,日志文件的写入性能,对buffer busy waits影响颇大啊。
        我将测试结果告知客户哪边的DBA,请他如果可能的话,将Redo文件放在更快的存储设备上。他果然找到一个空闲的8块盘的RAID10,将Redo文件重建在了上面,之后,buffer busy waits果然又下降很多,不但不会再出现在TOP 5中,而且几乎下降到没有。
        但是,用户体验哪边,反应平平,因为SQL调优之后,性能已经可以满足他们的需要。呵呵,这是正常的。百尺竽头,更进一步的调优是很困难的,而且,很多时候用户也并不十分认可这样的调优。也只有对技术有追求的人,才会坚持下去,追求将技术做到极致。
        我认为一家公司,大家各司其职。销售尽一切力量去推销,将销售做的极致;行政将服务做到极致;而技术人员,则想方设法将技术做到极致。哪么这个公司,就一定拥有无比的竞争力。就比如Google,就连厨房都可以做成精典。还有乔布斯,将东西做到极致的精神,使苹果在全球拥有众多忠实粉丝。
        这个问题还没有完,为什么在客户现场看到的,等待buffer busy waits的,都是Select?
        还有,更进一层,为什么日志文件的写入性能,会这么严重的影响buffer busy waits,进而影响逻辑读的性能呢?
        请继续关注。

buffer busy waits等待事件案例-vage的更多相关文章

  1. RAC性能分析 - gc buffer busy acquire 等待事件

    概述---------------------gc buffer busy是RAC数据库中常见的等待事件,11g开始gc buffer  busy分为gc buffer busy acquire和gc ...

  2. 模拟产生CBC LATCH与buffer busy wait等待事件

    数据库版本:11.2.0.4.0 1.查出表TEST相关信息 select rowid, dbms_rowid.rowid_row_number(rowid) rowid_rownum, dbms_r ...

  3. buffer cache —— buffer busy waits/read by other session

    oracle提供非常精确.有效的row level lock机制,多个用户同时修改数据时,为了保护数据,以块为单位挂起锁的情况不会发生.但这不太正确.以块为单位的锁虽然不存在,但正因为oracle I ...

  4. GC Buffer Busy Waits处理(转载)

    与单实例不同,在RAC环境中,由于多节点的原因,会因为节点间的资源争用产生GC类的等待,而这其中,GC Buffer Busy Waits又是最为常见的,从性能角度上说,RAC是把双刃剑,用的好,能够 ...

  5. buffer busy waits

    Buffer busy waits 当会话想要访问缓冲区中的数据块,而该数据块正在被其他会话使用时将产生Buffer busy waits事件. 其他会话可能正从数据文件向缓冲器读取同样的数据块,或正 ...

  6. SQL Server邮件相关SQL语句出现严重的ASYNC_NETWORK_IO等待事件案例

      DPA监控发现一台SQL Server服务器最近两天执行系统存储过程msdb.dbo.sp_MailItemResultSets中的某个SQL时,出现较严重的ASYNC_NETWORK_IO等待. ...

  7. 完全揭秘log file sync等待事件-转自itpub

    原贴地址:http://www.itpub.net/thread-1777234-1-1.html   谢谢 guoyJoe 老大 这里先引用一下tanel poder大师的图: 什么是log fil ...

  8. oracle之 等待事件LOG FILE SYNC (awr)优化

    log file sycn是ORACLE里最普遍的等待事件之一,一般log file sycn的等待时间都非常短 1-5ms,不会有什么问题,但是一旦出问题,往往都比较难解决.什么时候会产生log f ...

  9. ORACLE等待事件:read by other session

    read by other session简介 官方关于read by other session的介绍如下: When information is requested from the datab ...

  10. Oracle中常见的33个等待事件小结

    在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待事件的相关信息     一. 等待事件的相关知识 1.1 等待事件主要可 ...

随机推荐

  1. Self-Instruct 论文解读:利用大模型自己给自己生成指令数据,指令数据自动生成

    总览 大规模"指令调整"的语言模型,即指令微调的LLM,已经表现出非凡的零样本能力,尤其是推广新任务上. 然而,这些模型严重依赖于人类编写的指令数据,而这些数据通常在数量.多样性和 ...

  2. 应用CS5266设计一款TYPEC转HDMI带PD3.0+USB3.1扩展坞方案电路图

    目前市场TYPEC扩展坞有很多,基本都是大同小异,主要功能是TYPEC转HDMI带PD+USB3.1+RJ45+SD/TF读卡器等多种接口,由于产品类型较多,成本也都是越做越低,CS瑞奇达就开发一系列 ...

  3. 使用官方推荐的库来测react hook组件

    最近写单元测试的时候遇见了一些问题,当我使用使用jest测React. useRef,  React. useEffect时,总是测不到, 然后我去查阅了一下官方文档,它推荐了使用下面这个库 @tes ...

  4. PTA 21级数据结构与算法实验8—排序

    目录 7-1 统计工龄 7-2 寻找大富翁 7-3 点赞狂魔 7-4 插入排序还是归并排序 7-5 插入排序还是堆排序 7-6 逆序对 7-7 堆排序 7-8 石子合并 7-9 第k小 7-10 快速 ...

  5. 大白话讲讲 Go 语言的 sync.Map(二)

    上一篇文章 <大白话讲讲 Go 语言的 sync.Map(一)> 讲到 entry 数据结构,原因是 Go 语言标准库的 map 不是线程安全的,通过加一层抽象回避这个问题. 当一个 ke ...

  6. Unsupervised Learning of Depth and Ego-Motion from Video(CVPR2017)论文阅读

    深度估计问题 从输入的单目或双目图像,计算图像物体与摄像头之间距离(输出距离图),双目的距离估计应该是比较成熟和完善,但往单目上考虑主要还是成本的问题,所以做好单目的深度估计有一定的意义.单目的意思是 ...

  7. 修复grub分区

    修复grub分区 实验环境:grup.cfg文件丢失,引导出错 1,删除grup.cfg配置文件 2,重启虚拟机 3,重启进入救援模式 再读进度条的时候快速点击Esc键 选着光驱或者u盘启动  

  8. [python]从环境变量和配置文件中获取配置参数

    前言 从环境变量和配置文件中获取配置参数,相关库: python-dotenv:第三方库,需要使用pip安装 configparser:标准库 示例代码 test.ini [mysql] host = ...

  9. 查看Linux系统下CPU、内存、硬盘等信息

    做个记录,方便日后查看使用. 1. 查看CPU 1.1 查看CPU个数 [root@qy-ggyf-zyl-31 ~]# cat /proc/cpuinfo | grep "physical ...

  10. 一文详解自然语言处理两大任务与代码实战:NLU与NLG

    自然语言处理(NLP)涵盖了从基础理论到实际应用的广泛领域,本文深入探讨了NLP的关键概念,包括词向量.文本预处理.自然语言理解与生成.统计与规则驱动方法等,为读者提供了全面而深入的视角. 作者 Te ...