白鳝的洞穴 ( 白鳝与Oracle的亲密接触 ) 给他(她)留言   |  相册  |  回到专栏  |  管理  |   登录  博客首页
白鳝在工作中的点滴积累,不仅仅包括技术的
白鳝
  •    我的栏目
  •   我的文章
      Oracle杂谈
      内部分析
      优化
      案例
      小技巧
      BUG与故障
      SQL与PL/SQL开发
      DBA日记
      IT长篇小说第一部:IT的I
  •    最新文章
  •   DBA日记第三部 像Oracle一样
      DBA日记第三部 像Oracle一样
      DBA日记第三部 像Oracle一样
      DBA日记第三部 像Oracle一样
      DBA日记第三部 像Oracle一样
      CPU_COUNT对共享池的影响
      DBA日记 第三部 像Oracle一样
      DBA日记 第三部 像Oracle一样
      3月24日 简单任务 (1)令人
      3月23日 理解表的存储结构 (
  •    最新评论
  •   [HadaVopsesoto]   Would you like to play solitaire against real persons?
      [飞帆]   回复:DBA日记第三部 像Oracle一样思考 3月28日 理解索引(1)
      [xhh]   回复:健康性检查
      [jimlist]   回复:Oracle常用EVENT参考(3)
      [edwards6309]   回复:DBA日记第三部 像Oracle一样思考 4月2日 索引危机(3)效果不错
      [eagle_fan]   回复:DBA日记第三部 像Oracle一样思考 4月2日 索引危机(3)效果不错
      [白鳝]   回复:DBA日记第三部 像Oracle一样思考 4月2日 索引危机(3)效果不错
      [白鳝]   回复:DBA日记第三部 像Oracle一样思考 4月2日 索引危机(3)效果不错
      [killkill]   Re:DBA日记第三部 像Oracle一样思考 4月2日 索引危机(3)效果不错
      [sir.liang]   回复:健康性检查
  •    博客统计
  •   文章 - 166
      评论 -772
      访问 - 57817
  •    友情链接
  • 主题:DBA日记 第三部 像Oracle一样思考 3月25日 简单任务 (2)解决之道 发表时间:2010-4-11 15:35:00 
    作者:白鳝  离线 回复:3   浏览:904

    325 简单任务 2)解决之道

    今天一早老方就回北京了,昨天晚上我和老方一直在讨论这个项目,从采集到的信息来看,只能通过调整操作系统、数据库的参数,以及调整表的一些参数来达到提升系统总体性能的目标。而对于系统性能来说,最为关键的也就是大量的话单插入操作。目前话单插入是由8个并发进程完成的,每次的插入批量试800条记录。

    既然实际情况和预先估计的有出入,那也只能硬着头皮上了。今天我主要要分析一下在哪些环节可以进行优化,以及每个环节可能的性能提升比例,从而为优化计划的制定提供一个基础。另外采集性能基线的工作也同时在进行,由于这个项目的特殊性,我们无法采集去年春节期间的数据了。这种系统,非业务高峰期的性能数据比较的意义不是很大。通过昨天的分析,在平时,每天的话单量在2000万条左右,而在中秋节和除夕,话单量可能达到1亿8千万到2亿。按照忙时集中系数为0.1计算,在平时,每天最忙的1个小时内,产生的话单量为200万条,折算到每秒钟产生的话单量为555条,而业务高峰期的量可能达到5550条。平均分配到两个系统,每个系统每秒要处理近3000条话单,才能确保系统不出问题。由于华为的系统中有内存缓冲区,可以进行一定程度的平滑高峰处理,因此华为方面提出能够达到每秒处理2000条话单以上的处理能力,就可以保证不丢话单,而目前华为工程师的测试结果为系统处理能力仅能达到1500条话单,这个优化项目,能够做到性能提升50%,就可以确保万无一失,提升25%以上,可以基本达到华为的最低要求。仅仅想通过调整系统参数和表的存储参数来实现这个目标,确实是具有一定的挑战性。

    上午我分析了系统的主要等待事件,以及各个缓冲区的情况:

    Instance Efficiency Percentages (Target 100%)

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

                Buffer Nowait %:   99.98       Redo NoWait %:  100.00

                Buffer  Hit   %:   99.69    In-memory Sort %:   99.97

                Library Hit   %:   99.79        Soft Parse %:   88.82

             Execute to Parse %:   98.61         Latch Hit %:   99.98

    Parse CPU to Parse Elapsd %:   93.32     % Non-Parse CPU:   98.51

     

     Shared Pool Statistics        Begin   End

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

                 Memory Usage %:   93.70   95.50

        % SQL with executions>1:   35.74   34.34

      % Memory for SQL w/exec>1:   29.93   21.30

     

    Top 5 Wait Events

    ~~~~~~~~~~~~~~~~~                                             Wait     % Total

    Event                                               Waits  Time (cs)   Wt Time

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

    db file parallel write                              2,922       36,456   47.99

    db file sequential read                            16,401       15,874   20.90

    log file parallel write                             8,824       10,812   14.23

    log file sync                                       2,907        5,169    6.80

    direct path read                                   17,046        3,639    4.79

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

     

    从主要缓冲池的指标上来看,没有明显的问题。而从主要等待事件上看,主要都集中在和IO相关的项目上。看样子IO系统的写性能指标并不好。另外REDO LOG相关的等待事件占整个等待事件的21%,REDO LOG看样子存在优化的可能。

    Statspack报告上看,每个小时的redo buffer allocation retries483次,目前的LOG BUFFER1M,加大LOG BUFFER可以减少这方面的等待。而目前共有16个日志组,每个日志组1个文件,每个文���60M。从日志切换情况来看,今天业务高峰期平均1分钟多一点切换一次日志。由于无法查看去年中秋节期间的数据,因此我只能推算,如果业务量加大10倍,那么每隔56秒钟就会产生一次日志切换,这样对系统的性能就会产生较大的影响。看样子,加大LOG BUFFER,增加REDO LOG文件的大小,性能提升10-15%还是很有可能的。

    从今天的STATSPACK报告中,我们没有看到明显的BUFFER BUSY WAITS,一个小时也只有几百个BUFFER BUSY WAITS等待。通过测算,现在每个系统每秒的话单量不到300条,而每个插入的批次是800条,因此多个插入进程同时插入数据的机会较少,热块冲突不会很明显,而如果业务量增加10倍,那么热块冲突可能会变得很严重。目前南坪系统的数据库是8.1.7.4,人和系统的数据库是9.2.0.5。两套系统都没有使用自动段空间管理(ASSM)。通过检查,发现freelists参数都是缺省的1,这对于并发插入操作会有较大的影响。加大freelists参数,不仅仅可以减少并发插入时分配空块的等待,而且不同的插入进程会使用不同的freelists,因此不同的插入进程不会往同一个数据块中插入数据,从而避免不同的插入进程之间在业务高峰期间可能出现的热块争用。根据以往的经验,如果freelists设置合理,减少了这方面争用可能带来的性能提升可能达到5%-10%

    目前核心表SM_HISTABLE是每天一张独立的表,每张表都是分区表,表中设置了一个专门的分区字段ID_HINT,进行范围分区,这个字段的值是循环使用的,到达10000000后自动回绕为1,分区脚本如下:

    PARTITION BY RANGE (ID_HINT)

    ( 

      PARTITION PART_01 VALUES LESS THAN (1000000)

        NOLOGGING

        TABLESPACE CQYDSMSC_CENTER1

        PCTUSED    40

        PCTFREE    10

        INITRANS   1

        MAXTRANS   255

        STORAGE    (

                    INITIAL          504K

                    MINEXTENTS       1

                    MAXEXTENTS       2147483645

                    FREELISTS        1

                    FREELIST GROUPS  1

                    BUFFER_POOL      DEFAULT

                   ), 

     

    这种分区模式对于减少热块冲突帮助不大,不过如果调整了FREELISTS参数后,热块冲突的严重程度也会下降,对性能的影响也不会特别大。不过如果能把不同的分区放到不同的磁盘组上,那么使用HASH分区比范围分区在IO负载均衡方面的作用就更为明显了。于是我马上要来了系统底层存储的设计文档。南坪系统的底层设计了多个磁盘组:

    #1  磁盘数:4X36.4   RAID类型:RAID10   对应PVhdisk2   对应VGDATA1VG

    #2  磁盘数:6X36.4   RAID类型:RAID10   对应PVhdisk3   对应VGDATA2VG

    #3  磁盘数:6X36.4   RAID类型:RAID10   对应PVhdisk4   对应VGDATA3VG

    #4  磁盘数:16X36.4  RAID类型:RAID10   对应PVhdisk5   对应VGDATA4VG

    #5  磁盘数:16X36.4  RAID类型:RAID10   对应PVhdisk8   对应VGDATA5VG

    人和系统使用的是72G的磁盘,20块磁盘做成RAID 10,VG划分的时候做了stripe。从底层存储的设计上,对于南坪系统,如果使用HASH分区,可以将IO均匀的分配到5个盘组上,从而避免业务高峰期的IO热点。这方面的调整,根据以往的经验,可以提升性能10-15%

    ID_HINT列上,使用了一个SEQUENCEID_SEQ,我检查了一下,这个SEQUENCECACHE设置为1000,根据我以往的经验,设置为1000一般来说也够用了,不过下一步我们还需要进一步测试一下,CACHE设置的更高是否可能带来性能的提升。

    从刚才的分析来看,我们目前可以达到的系统性能提升为1-1-0.1*1-0.05*1-0.1=23%。这是一个比较保守的数字,实际上提升的比例可能更高。因此通过这些方面的调整达到预定的优化目标还是很有可能的。

    实际上,对于INSERT操作来说,使用BULK INSERT操作可以大幅度提升插入的性能,不过使用BULK INSERT,对于华为来说,应用需要做较大的修改,昨天在讨论方案的时候,华为方面感到如果要在短时间内完成修改,有些为难。而用户也希望把BULK INSERT作为最后的解决方案,可以作为建议提出来,华为在下一步的优化工作中进行修改,但是不列入本次优化的范围。

    今天是在分析问题的过程中度过的,因此感觉过得很快。快下班的时候,老方打电话过来,说今天在武汉飞机晚点,刚刚到北京。一下飞机他就打电话询问情况。我说通过一天分析,感觉通过我们昨天考虑的几方面的优化,性能提升30%还是比较靠谱的。老方听后长舒了一口气,在飞机上他一直在考虑这个项目在售前阶段过于自信,没有做深入的分析,最终能不能让客户满意。

    和老方通完电话,我给客户的余经理打了个电话,问她能不能安排一个业务不是很忙的时间,让我做一些针对性的实验,以便于确定优化方案。余经理说这是一个后台系统,我可以随便进行测试,只要不让话单积压过于严重,导致话单丢失就可以了。于是我连忙联系华为的维护工程师,和他讨论如何避免系统话单积压。华为的维护人员说他们本身就有一个实时监控系统,如果话单缓冲区占用率超过60%,就会产生告警,只要缓冲区保持在60%以下,风险就不是很大。于是我们约定好,明天白天我就开始进行一系列实验,一旦系统出现风险,他们马上通知我,我立即停止实验。

     

    本文链接:http://www.oraclefans.cn/blog/showblog.jsp?rootid=18186
     
           网友评论
    ─ 评论人 roger    10-04-16 19:21
     
    ─ 评论人 自由    10-04-18 10:27
     
    ─ 评论人 tomzzy    10-07-29 16:29
      老白继续~
    >> 请登录以后评论!您还没有注册?   

    Powered by CWBBS 2.1  © 2005-2006 Cloud Web Soft
      Email:webmaster@justdb.cn