ITPub博客

首页 > Linux操作系统 > Linux操作系统 > log等待事件

log等待事件

原创 Linux操作系统 作者:care_ever 时间:2011-01-11 10:31:56 0 删除 编辑

开发的同事最近在优化一段每小时都会运行的程序,希望这段程序可以更快速的完成操作。优化后找到我,要求我帮忙看下当前数据库是否有瓶颈,于是做了statspack,发现当前数据库由于是测试库,所有参数均未有过任何优化调整。

Cache Sizes (end)
~~~~~~~~~~~~~~~~~
               Buffer Cache:        32M      Std Block Size:          8K
           Shared Pool Size:       112M          Log Buffer:        512K

8G内存的服务器上,SGA仅仅分配了不到200M,这是明显不合理的。

Top 5 Timed Events
~~~~~~~~~~~~~~~~~~                                                     % Total
Event                                               Waits    Time (s) Ela Time
-------------------------------------------- ------------ ----------- --------
CPU time                                                          578    59.24
log file sync                                      40,094         201    20.62
log file parallel write                            40,821         184    18.87
control file parallel write                           372           6      .58
db file sequential read                           122,328           6      .57
          -------------------------------------------------------------
         
我们可以清晰的看到2个等待事件:log file sync、log file parallel write

log file sync及log file parallel write 的等待次数都超过4W次,等待时间已经接近总运行时间的40%
由此分析,如果我们可以解决这2个等待事件,对数据库性能必定有所提升。

产生这些log等待根本原因为:
log buffer 尾指针已经追上了头指针写入速度,导致整个log buffer 都为脏读redolog,均需要由LGWR进程写入redolog

分析可能是由如下几种情况导致:
1. 由于logbuffer设置过小
2. 磁盘io速度太慢,导致写入速度过慢
3. 提交过于频繁,由于每次commit都需要LGWR进程写入redolog中,所以需要LGWR频繁完成写入操作,导致等待。

查看top SQL 我们可以发现,这段程序多为update操作,这也可能是为什么会产生大量log等待的原因。

大概了解了情况以后,首先增加了SGA大小,将Log Buffer为15M。

重新执行程序,发现执行时间仅仅提升了5%左右,且等待事件依旧为log的等待,且等待时间并没有明显的下降。
至此已经排除了 log buffer设置过小导致的等待,那么磁盘io经过测试也没有问题,那么最有可能的就是过于频繁的commit导致的。

让我们看看redo的写入情况
我们使用(redo blocks written/redo writes )*512 得出每次LGWR写入redolog的大小为:(41333/24828)*512=852byte
每次写入仅852byte,写入次数已经将近2.5w次。每秒钟写入redo次数为:redo writes/Elapsed time= 24828/322 =77次/s


这似乎不太正常,每秒钟竟然有77次的redo写入,频率太高了,我猜测,就是由于commit太过频繁导致的log等待。

随后我咨询了开发的同事,正如我所料,果然每次update都会提交,我建议他修改提交频率,后再次运行程序,我在做一次statspack。

这次的statspack变的明朗了许多:
Top 5 Timed Events
~~~~~~~~~~~~~~~~~~                                                     % Total
Event                                               Waits    Time (s) Ela Time
-------------------------------------------- ------------ ----------- --------
CPU time                                                          298    98.06
latch free                                         12,456           3      .89
log file parallel write                               123           1      .49
control file parallel write                            79           1      .48
db file sequential read                                36           0      .05
          -------------------------------------------------------------
         
CPU time已经达到了98%以上,日志等待事件虽然仍在其中,但是等待时间少的已经可以忽略。

我们在看一下redo的写入情况
每次LGWR写入redolog的大小:(20001/123)*512=83256byte
每秒钟写入redo次数为:(123/238)=0.5 次/s

最后询问了开发组的同事,程序运行时间已经缩短了20%

至此本次优化可以说圆满结束了。

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25226068/viewspace-683591/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-01-11

  • 博文量
    1
  • 访问量
    649