Oracle中qmnc是什么,诊断案例:PMON failed acquire latch QMNC Holder

诊断案例:PMON failed acquire latch QMNC Holder

6ee5639a40442445944d63b514b2dd02.png

在有些情况下,数据库关闭时会遇到PMON进程阻塞的情况,如果PMON进程不能及时获得Latch锁资源,就无法及时去清理事务,关闭进程,就会导致数据库无法关闭的情况。

这种情况在数据库运行状况下也可能发生,一旦这类情况出现,数据库就会出现严重的阻塞,失败的进程也无法获得清理和恢复,是严重的故障情况。

昨天一个客户的数据库就遇到这样的问题,在数据库关闭时出现如下错误。

首先是Latch无法获得,这里提示可能的阻塞者是 13648 号操作系统进程:* SESSION ID:(333.1) 2011-06-23 00:48:48.250

PMON unable to acquire latch  c00000002000a558 slave class create level=0

Location from where latch is held: ksvcreate:

Context saved from call: 0

state=busy, wlstate=free

waiters [orapid (seconds since: put on list, posted, alive check)]:

18 (53275, 1308761328, 53275)

68 (3218, 1308761328, 334)

waiter count=2

gotten 11442 times wait, failed first 1324 sleeps 1325

gotten 0 times nowait, failed: 0

possible holder pid = 34 ospid=13648

----------------------------------------而34号数据库进程,13648号系统进程,其详细进程信息随后输出:

SO: c000000436007f78, type: 2, owner: 0000000000000000, flag: INIT/-/-/0x00

(process) Oracle pid=34, calls cur/top: c0000004362407c8/c0000004362407c8, flag: (2) SYSTEM

int error: 0, call error: 0, sess error: 0, txn error 0

(post info) last post received: 0 0 9

last post received-location: ksqrcl

last process to post me: c000000436003808 1 2

last post sent: 0 0 24

last post sent-location: ksasnd

last process posted by me: c000000436000868 1 6

(latch info) wait_event=0 bits=1

holding    (efd=3) c00000002000a558 slave class create level=0

Location from where latch is held: ksvcreate:

Context saved from call: 0

state=busy, wlstate=free

waiters [orapid (seconds since: put on list, posted, alive check)]:

18 (53275, 1308761328, 53275)

68 (3218, 1308761328, 334)

waiter count=2

Process Group: DEFAULT, pseudo proc: c00000003b3adad8

O/S info: user: oracle, term: UNKNOWN, ospid: 13648

OSD pid info: Unix process pid: 13648, image: oracle@wfrb1 (QMNC)

Short stack dump:

Dump of memory from 0xC00000003B39BA58 to 0xC00000003B39BC60

C00000003B39BA50                   00000005 00000000          [........]

C00000003B39BA60 C0000004 3927CAF8 00000010 0003139D  [....9'..........]

C00000003B39BA70 C0000004 362407C8 00000003 0003139D  [....6$..........]

C00000003B39BA80 C0000004 362EED70 0000000B 0003139D  [....6..p........]

C00000003B39BA90 C0000004 36224388 00000004 00031291  [....6"C.........]

C00000003B39BAA0 C0000004 36300C28 0000000D 0003139D  [....60.(........]

C00000003B39BAB0 00000000 00000000 00000000 00000000  [................]

Repeat 26 times可以看到进程是QMNC后台进程,QMNC进程是用于AQ队列的监控,为Oracle的流复制所使用:

qmnc -A queue monitor process which monitors the message queues. Used by Oracle Streams Advanced Queuing.

QMNC进程对于AQ表来说就相当于CJQ0进程之于作业表。QMNC进程会监视高级队列,并警告从队列中删除等待消息的"出队进程

"(dequeuer):已经有一个消息变为可用。QMNC和Qnnn还要负责队列传播(propagation),也就是说,能够将在一个数据库中入队(增加)的消息移到另一个数据库的队列中,从而实现出队(dequeueing)。

Qnnn进程对于QMNC进程就相当于Jnnn进程与CJQ0进程的关系。QMNC进程要通知Qnnn进程需要完成什么工作,Qnnn进程则会处理这些工作。

QMNC和Qnnn进程是可选的后台进程。参数AQTMPROCESSES

可以指定最多创建10个这样的进程(分别名为Q000,...,Q009),以及一个QMNC进程。如果AQTMPROCESSES设置为0,就没有

QMNC或Qnnn进程。不同于作业队列所用的Jnnn进程,Qnnn进程是持久的。如果将

AQTMPROCESSES设置为10,数据库启动时可以看到10个Qnnn进程和一个QMNC进程,而且在实例的整个生存期中这些进程都存在。这个进程可以安全的Kill掉,以消除阻塞,在客户的这个系统中:

kill -9 13648

就释放了这个Latch占用。

根据Bug 5069930: QMNC PROCESS IS SPINNING AND CONSUMING HIGH CPU 的描述,在Oracle 10g中,可能存在QMNC进程SPIN空耗CPU的问题。

BUG描述如下:PROBLEM:

--------

QMN process oraqmnc is taking upto 99% of CPU.

Customer is on 10.2.0.1.0.

DIAGNOSTIC ANALYSIS:

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

+ looks like the oraqmnc process is not doing anything.

+ tried to take a 10046 trace using oradebug, but does not dump anything.

+ tried to find out if any SQLs executing using

DBMSSYSTEM.SETSQLTRACEINSESION, but again no SQLs found

+ errorstack shows, this process is apparently spinning.

+ system call trace (using strace) shows it is spinning on "times(NULL) =

489352606" system call.

WORKAROUND:

-----------

NONE

RELATED BUGS:

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

REPRODUCIBILITY:

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

reproducing at production, development and test environments of the customer.

TEST CASE:

----------

STACK TRACE:

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

SQL> oradebug setospid 8692

Oracle pid: 24, Unix process pid: 8692, image:

oracle@ftibprod-db01.aozora.lan (QMNC)

SQL> oradebug shortstack

ksdxfstk()+32

SQL> oradebug shortstack

ksdxfstk()+32

SQL> oradebug shortstack

ksdxfstk()+32

SQL> oradebug short_stack

ksdxfstk()+32

这里通过short Stack跟踪堆栈的方法非常有助于判断问题的故障点。通常情况下,如果没有使用Streams选件,直接Kill掉QMNC进程就可以了。

By eygle on 2011-06-23 11:41 |

Comments (0) |

Case | 2822 |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值