Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2623361
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(389)

分类: Oracle

2016-07-05 21:57:27

                                      Oracle LGWR进程跟踪


     Oracle LGWR进程在正常情况下有以下条件被唤醒:每三秒,写满logbuffer 1M,log buffer空间写满了三分之一,用户提交和其他进程通知需要写出log buffer(比如 dbwr进程在写出数据库块,都要通知LGWR进程先把对应的redo写出).

基本过程如下:
    用户进程发布提交请求=>LGWR进程被唤醒=>LGWR进程发布IO调用写出log buffer=>IO写出成功返回=>LGWR进程通知用户进程可以继续下一步操作.

用户进程实际上是使用semctl这个系统调用去唤醒LGWR进程


我们打开第一个窗口执行一条insert语句,然后再提交

DONGDONGTANG> insert into t1 values(10);
 
1 row inserted
 
DONGDONGTANG> commit;


另一个窗口跟踪进程调用

[oracle@localhost ~]$ strace -t -p 22777 

18:04:56 semctl(2883584, 17, SETVAL, 0x1) = 0
18:04:56 times(NULL)                    = 439153919
18:04:56 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={0, 86131}, ru_stime={0, 123814}, ...}) = 0
18:04:56 times(NULL)                    = 439153919
18:04:56 times(NULL)                    = 439153919
18:04:56 getrusage(0x1 /* RUSAGE_??? */, {ru_utime={0, 86138}, ru_stime={0, 123823}, ...}) = 0
18:04:56 semtimedop(2883584, {{47, -1, 0}}, 1, {0, 100000000}) = 0


用户进程在semid为2883584设置标志位,然后用户进程调用semtimedop,在2883584上进行睡眠.

系统为oracle分配了三个semphore id

[oracle@localhost ~]$ ipcs -s
------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0xaece40bc 2883584    oracle     640        152       
0xaece40bd 2916353    oracle     640        152       
0xaece40be 2949122    oracle     640        152  

LGWR进程的调用

18:04:55 semtimedop(2883584, {{17, -1, 0}}, 1, {3, 0}) = 0
18:04:56 times(NULL)                    = 439153919
18:04:56 times(NULL)                    = 439153919
18:04:56 pwrite(260, "\1\"\0\0\2158\0\0\17\0\0\0\20\200\331\217H\2\0\0\r\0\0\0=X\33\0\1\0\0\0"..., 1024, 7412224) = 1024
18:04:56 semctl(2883584, 47, SETVAL, 0x1) = 0
18:04:56 times(NULL)                    = 4391


在semid 2883584上被唤醒,通过pwrite调用写出日志文件,260刚好是当前打开的redo文件号.写出1024个字节后通过

过semctl调用返回给用户进程,用户进程接着可以继续下一步操作.

[oracle@localhost ~]$ ll  /proc/22040/fd | grep 260

lrwx------. 1 oracle oinstall 64 May 23 18:19 260 -> /u01/app/oracle/oradata/cdb12/redo03.log

DONGDONGTANG> select group#,status from v$log; 

    GROUP# STATUS
---------- ----------------
1 INACTIVE
2 INACTIVE
3 CURRENT

所以在这里可以看出几个比较重要影响LGWR进程效率的因素:1,cpu负载,如果cpu负载比较高,而LGWR进程一直
得不到cpu运行,会使log file sync时间变得很长,隐含参数_high_priority_process可以使LGWR进程的PI为-12
而正常的进程运行优先级为20.(VKTM,LMS进程默认为-2);2,io系统的性能,在影响LGWR的效率占主要因素,IO越快
那么LGWR进程对应也能越快返回; 3,使用sem效率的问题,当一个系统中大量用户进程提交时,使用sem单次操作的
最大限制受kernel.semopm限制.在后续的版本中引入了adaptive log fie sync机制,当达到一定值时,使用polling
机制.


阅读(3893) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~