51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4700|回复: 0
打印 上一主题 下一主题

Statspack之十四-"log file sync" 等待事件

[复制链接]
  • TA的每日心情
    慵懒
    2015-1-8 08:46
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2007-10-17 14:38:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    当一个用户提交(commits)或者回滚(rollback),session的redo信息需要写出到redo logfile中.
    用户进程将通知LGWR执行写出操作,LGWR完成任务以后会通知用户进程.
    这个等待事件就是指用户进程等待LGWR的写完成通知.
    对于回滚操作,该事件记录从用户发出rollback命令到回滚完成的时间.
    如果该等待过多,可能说明LGWR的写出效率低下,或者系统提交过于频繁.
    针对该问题,可以关注:
    log file parallel write等待事件
    user commits,user rollback等统计信息可以用于观察提交或回滚次数
    解决方案:
    1.提高LGWR性能
    尽量使用快速磁盘,不要把redo log file存放在raid 5的磁盘上
    2.使用批量提交
    3.适当使用NOLOGGING/UNRECOVERABLE等选项
    可以通过如下公式计算平均redo写大小:
    avg.redo write size = (Redo block written/redo writes)*512 bytes
    如果系统产生redo很多,而每次写的较少,一般说明LGWR被过于频繁的激活了.
    可能导致过多的redo相关latch的竞争,而且Oracle可能无法有效的使用piggyback的功能.
    我们从一个statspack中提取一些数据来研究一下这个问题.
    1.主要信息
    DB Name         DB Id    Instance     Inst Num Release     OPS Host------------ ----------- ------------ -------- ----------- --- ------------DB           1222010599  oracle              1 8.1.7.4.5   NO  sun                Snap Id     Snap Time      Sessions                ------- ------------------ -------- Begin Snap:       3473 13-Oct-04 13:43:00      540   End Snap:       3475 13-Oct-04 14:07:28      540    Elapsed:                  24.47 (mins)Cache Sizes~~~~~~~~~~~           db_block_buffers:     102400          log_buffer:   20971520              db_block_size:       8192    shared_pool_size:       600MLoad Profile~~~~~~~~~~~~                            Per Second       Per Transaction                                   ---------------       ---------------                  Redo size:             28,458.11              2,852.03                  ......                          
    2.等待事件

    Event                               Waits   Timeouts  Time (cs)    (ms)   /txn---------------------------- ------------ ---------- ----------- ------ ------log file sync                      14,466          2       4,150      3    1.0db file sequential read            17,202          0       2,869      2    1.2latch free                         24,841     13,489       2,072      1    1.7 direct path write                     121          0       1,455    120    0.0db file parallel write              1,314          0       1,383     11    0.1log file sequential read            1,540          0          63      0    0.1....log file switch completion              1          0           3     30    0.0refresh controlfile command            23          0           1      0    0.0LGWR wait for redo copy                46          0           0      0    0.0....log file single write                   4          0           0      0    0.0      
    我们看到,这里log file sync和db file parallel write等待同时出现了.
    显然log file sync在等待db file parallel write的完成.
    这里磁盘IO肯定存在了瓶颈,实际用户的redo和数据文件同时存放在Raid的磁盘上,存在性能问题.
    需要调整.
    3.统计信息

    Statistic                                    Total   per Second    per Trans--------------------------------- ---------------- ------------ ------------....redo blocks written                         93,853         63.9          6.4redo buffer allocation retries                   1          0.0          0.0redo entries                               135,837         92.5          9.3redo log space requests                          1          0.0          0.0redo log space wait time                         3          0.0          0.0redo ordering marks                              0          0.0          0.0redo size                               41,776,508     28,458.1      2,852.0redo synch time                              4,174          2.8          0.3redo synch writes                           14,198          9.7          1.0redo wastage                             4,769,200      3,248.8        325.6redo write time                              3,698          2.5          0.3redo writer latching time                        0          0.0          0.0redo writes                                 14,572          9.9          1.0....sorts (disk)                                     4          0.0          0.0sorts (memory)                             179,856        122.5         12.3sorts (rows)                             2,750,980      1,874.0        187.8....transaction rollbacks                           36          0.0          0.0transaction tables consistent rea                0          0.0          0.0transaction tables consistent rea                0          0.0          0.0user calls                               1,390,718        947.4         94.9user commits                                14,136          9.6          1.0user rollbacks                                 512          0.4          0.0write clones created in backgroun                0          0.0          0.0write clones created in foregroun               11          0.0          0.0          -------------------------------------------------------------      
    avg.redo write size = (Redo block written/redo writes)*512 bytes      = ( 93,853 / 14,572 )*512       = 3K   

    这个平均过小了,说明系统的提交过于频繁.

    Latch Sleep breakdown for DB: DPSHDB  Instance: dpshdb  Snaps: 3473 -3475-> ordered by misses desc                                Get                                  Spin &Latch Name                    Requests         Misses      Sleeps Sleeps 1->4-------------------------- -------------- ----------- ----------- ------------row cache objects              12,257,850     113,299          64 113235/64/0/                                                                  0/0shared pool                     3,690,715      60,279      15,857 52484/588/65                                                                  46/661/0library cache                   4,912,465      29,454       8,876 23823/2682/2                                                                   733/216/0cache buffers chains           10,314,526       2,856          33 2823/33/0/0/                                                                  0redo writing                       76,550         937           1 936/1/0/0/0session idle bit                2,871,949         225           1 224/1/0/0/0messages                          107,950         159           2 157/2/0/0/0session allocation                184,386          44           6 38/6/0/0/0checkpoint queue latch             96,583           1           1 0/1/0/0/0          -------------------------------------------------------------      
    由于过渡频繁的提交,LGWR过度频繁的激活,我们看到这里出现了redo writing的latch竞争.
    关于redo writing竞争你可以在steve的站点找到详细的介绍:
    http://www.ixora.com.au/notes/lgwr_latching.htm

    转引如下:

    When LGWR wakes up, it first takes the redo writing latch to update the SGA variable that shows whether it is active. This prevents other Oracle processes from posting LGWR needlessly. LGWR then takes the redo allocation latch to determine how much redo might be available to write (subject to the release of the redo copy latches). If none, it takes the redo writing latch again to record that it is no longer active, before starting another rdbms ipc message wait.
    If there is redo to write, LGWR then inspects the latch recovery areas for the redo copy latches (without taking the latches) to determine whether there are any incomplete copies into the log buffer. For incomplete copies above the sync RBA, LGWR just defers the writing of that block and subsequent log buffer blocks. For incomplete copies below the sync RBA, LGWR sleeps on a LGWR wait for redo copy wait event, and is posted when the required copy latches have been released. The time taken by LGWR to take the redo writing and redo allocation latches and to wait for the redo copy latches is accumulated in the redo writer latching time statistic.
    (Prior to release 8i, foreground processes held the redo copy latches more briefly because they did not retain them for the application of the change vectors. Therefore, LGWR would instead attempt to assure itself that there were no ongoing copies into the log buffer by taking all the redo copy latches.)
    After each redo write has completed, LGWR takes the redo allocation latch again in order to update the SGA variable containing the base disk block for the log buffer. This effectively frees the log buffer blocks that have just been written, so that they may be reused.


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 04:46 , Processed in 0.073261 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表