再谈ORACLE CPROCD进程

罗列一下有关oprocd的知识点

oprocd是oracle在rac中引入用来fencing io的

在unix系统下,如果我们没有采用oracle之外的第三方集群软件,才会存在oprocd进程

在linux系统下,只有在10.2.0.4版本后,才会具有oprocd进程

在window下,不会存在oprocd 进程,但是会存在一个oraFenceService服务,用来实现相同的功能,该服务采用的技术是基于windows的,与oprocd不同

oprocd进程可以运行在两者模式下:fatal和no fatal,在fatal模式下,如果系统hang住,或者其他原因触发oprocd则oprocd进程会自动重启服务器。在no fatal模式下,如果系统hang住,或者其他原因触发oprocd进程,则oprocd进程会在日志中记录警告信息,但是不会重启系统。

oprocd进程具有两个参数:timeout 指定oprocd进程调用的时间间隔   margin 指定允许的时间偏差,如果时间偏差超过margin,则oprocd进程会重启系统或者记录错误信息到日志。

oprocd进程的日志文件位于:/etc/oracle/oprocd  或者 /var/opt/oracle/oprocd

oprocd进程从cssd进程派生而来,并且以root用户身份允许

[[email protected] init.d]# ps -ef | grep oprocd
root      5109 11227  0 20:37 pts/0    00:00:00 grep oprocd
root      5758  4849  0 19:14 ?        00:00:00 /bin/sh /etc/init.d/init.cssd oprocd
root      6084  5758  0 19:14 ?        00:00:00 /u01/app/crs_home/bin/oprocd.bin run -t 1000 -m 10000 -hsi 5:10:50:75:90 -f

如果一个节点被hang住了很长时间,那么集群中的其他节点会把该节点剔除出去,在这种情况下,我们需要采取措施重启被hang住的节点,以便达到fencing io的目的。oprocd被设置了两个参数:timeout 和margin,进程会每间隔timeout时间被唤醒一次,如果本次被唤醒的时间与上次被唤醒的时间间隔超过timeout+margin,那么oprocd进程会认为oracle 节点被hang住,因此会自动重启节点或者将警告信息写入日志。

通常情况下,我们可以将oprocd进程重启系统的原因归为四类:

1::操作系统的调度问题

2:操作系统的存在硬件或者驱动问题

3:系统具有大量负载,导致调度程序无法及时调入oprocd进程

4:oracle bug

Bug 5015469 – OPROCD may reboot the node whenever the system date is moved

backwards.

Fixed in 10.2.0.3+

Fixed in 10.1.0.3 + One off patch for Bug 4206159.

Fixed in 10.2.0.4+

Fixed in 10.2.0.3+

Bug 4206159 – Oprocd is prone to time regression due to current API used (AIX only)

Diagnostic Fixes (VERY NECESSARY IN MOST CASES):

Bug 5137401 – Oprocd logfile is cleared after a reboot

Bug 5037858 – Increase the warning levels if a reboot is approaching

oprocd进程的两个参数:timeout和margin,其默认值在init.cssd 文件中指定,如

[[email protected] init.d]# cat init.cssd | grep ^OPROCD_DEFAULT_
OPROCD_DEFAULT_TIMEOUT=1000
OPROCD_DEFAULT_MARGIN=500
OPROCD_DEFAULT_HISTORGRAM=

因此,默认情况下,如果两次唤醒oprocd进程的时间间隔超过1.5s,oprocd进程就会重启系统。这往往是不合适的,如果我们手工修改init.cssd文件中的默认值,需要oracle support才可以。

如果需要突破1.5s的限制,我们可以调用init.cssd来实现目的,通过调用init.cssd可以修改两个参数:reboottime  和 diagwait,如果diagwait> reboottime,那么margin=diagwait-reboottime。在设置diagwait时,需要将集群中所有节点的所有进程停掉,都在可以造成数据损坏,只需在rac中的一个节点修改即可。建议将diagwait修改为13

[[email protected] bin]# ./crsctl get css reboottime
3
[[email protected] bin]# ./crsctl get css diagwait
13
[[email protected] bin]# ./crsctl set css diagwait 13 -force

在11.2.0.1后,我们不再需要修改diagwait,因此架构已经发生了改变。

在windows下我们也可以修改diagwait,但是与在linux下不同,修改diagwait不会造成上面的变化。

下面再来看一下有关hangcheck_timer的有关信息,hangcheck_timer与oprocd可以实现相同的功能,但是两者之间没有必然的联系

Hangcheck-Timer Module

Hangcheck-Timer Module Requirements for Oracle 9i, 10g, and 11g RAC on Linux

Starting in release 9.2.0.2 and later, Oracle RAC environments required using a new I/O fencing model, named the hangcheck-timer module. This module was implemented to replace the Watchdog module, which provided similar fencing functionality. Hangcheck-timer
was subsequently delivered as part of the standard kernel distribution for Linux kernel releases 2.4 and above.

Hangcheck-timer should be loaded at boot time, and monitors the Linux kernel for long operating system hangs that could affect the reliability of a RAC node.  It runs in kernel mode and uses the Time Stamp Counter (TSC) to catch scheduling delays or node hangs. 
This is done by setting a timer, then checking when the timer fires as to whether it was delayed by more than the allowed margin of error.  If the duration exceeds the allowed time of (hangcheck_tick + hangcheck_margin seconds), the machine is restarted. 
Hangcheck-timer will not cause reboots to occur due to CPU starvation.

Hangcheck-timer requires three configuration parameters:

hangcheck_tick - defines how often, in seconds, the hangcheck-timer checks the node for hangs. The default value is 60 seconds.

hangcheck_margin - defines how much margin is allowed, in seconds, between expected scheduling and real scheduling time. The default value is 180 seconds.

hangcheck_reboot - determines if the hangcheck-timer restarts the node if the kernel fails to respond within the sum of the hangcheck_tick and hangcheck_margin parameter values. If the value of hangcheck_reboot is equal to or greater than 1, then the hangcheck-timer
module restarts the system. If the hangcheck_reboot parameter is set to zero, then the hangcheck-timer module will not reboot the node, even if a hang is detected.   The default value varies by kernel version.  In the 2.4 kernel, the default is 1.  In 2.6
kernels, the default is 0.

Hangcheck-timer will provide message logging to the system messages log when a failure is detected, and a node restart is initiated by the module:

When Hangcheck-timer reboots it may leave "Hangcheck: hangcheck is restarting the machine" message in /var/log/messages

If you see the following message in /var/log/messages:  "Hangcheck: hangcheck value past margin!" this means a reboot was required but was not performed, because hangcheck_reboot was not set to 1.  If this message is seen, you must reload the hangcheck
module as described earlier in this note, with the hangcheck_reboot value set to 1.

Note : Hangheck timer is not required starting with Oracle Clusterware 11gR2

再谈ORACLE CPROCD进程,布布扣,bubuko.com

时间: 2024-10-18 09:13:49

再谈ORACLE CPROCD进程的相关文章

再谈MySQL全库备份

再谈MySQL全库备份 简介 Part1:写在最前 在很早之前,我写过一个MySQL生产库全库备份脚本,今天有同事问我是不是要再加一个-R参数来备份存储过程,理由的话是由于mysqldump --help中 关于存储过程的默认备份是false. routines                          FALSE MySQL生产库全库备份脚本 http://suifu.blog.51cto.com/9167728/1758022 实战 Part1:写在最前 我备份一般就三个参数 --s

浅谈oracle中rowid和rownum

[ 概要 ] 刚刚接触oracle的同学可能常常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有很大的帮助, 下面偶就抛砖引玉, 简单地谈谈他们之间的区别吧. [ 比较 ] rowid和rownum都是oracle中的伪列, 但他们还是存在本质区别: rowid: 是物理地址, 用于定位数据表中数据的位置, 它是唯一的且不会改变. rownum: 是根据查询的结果集给每行分配的一个逻辑编号, 查询结果不同, rownum自然不同. 对于同一条记录, 查询条件不同,

谈oracle数据比对(DBMS_COMPARISON)

今天是2014-08-19,我今天收到csdn给我发的申请博客专家的邀请,自己感觉实在惭愧啊.自从换了工作也一直没有精力在写点东西了.今天我一个同事,在群里贴出了一个数据比对的包(DBMS_COMPARISON),但是这个包相比用的比较少.所以今天就谈谈这个工具包的使用吧. 对于经常完数据迁移的朋友来说,在数据挪动之后,最重要也是最关键和最关心的一个问题是,目标端和源端的数据是否一致.数据的一致是否关系着大型oracle数据库数据迁移的成败与否.目前很多公司都开始研发自己的对比工具,如dsg的基

[转]Oracle DB进程体系结构

1.进程体系结构 Oracle DB 系统中的进程主要分为两组: ? 运行应用程序或Oracle 工具代码的用户进程 ? 运行Oracle DB 服务器代码的Oracle DB 进程(包括服务器进程和后台进程) 当用户运行应用程序或Oracle 工具(例如SQL*Plus)时,Oracle DB 会创建一个"用户进程"以运行该用户的应用程序. Oracle DB 还会创建一个"服务器进程"以执行该用户进程发出的命令,可以连接到oracle实例,它在用户建立会话时启动

WCF技术剖析之二:再谈IIS与ASP.NET管道

原文:WCF技术剖析之二:再谈IIS与ASP.NET管道 在2007年9月份,我曾经写了三篇详细介绍IIS架构和ASP.NET运行时管道的文章,深入介绍了IIS 5.x与IIS 6.0HTTP请求的监听与分发机制,以及ASP.NET运行时管道对HTTP请求的处理流程: [原创]ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI [原创]ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part I

再谈git和github-深入理解

git中的 objects 和 refs 是什么? 如何理解 HEAD? 如何理解git github的工作过程? 参考: https://www.zhihu.com/question/20070065 为什么git能够回滚到历史记录呢? 是因为每一次提交 commit, 就相当于 做了依次 项目/工程的 备份点一样, 每次 提交时 都会生成一个 唯一的 commit id, 一个 hash值 所以如同windows 的系统备份点一样, 可以保存多个备份点, 然后你可以选择 随时恢复到 / 回滚

沉淀再出发:再谈java的多线程机制

沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于java的多线程机制以及其中延伸出来的很多概念和相应的实现方式一直都是模棱两可的,虽然后来在面试的时候可能恶补了一些这方面的知识,但是也只是当时记住了,或者了解了一些,等到以后就会变得越来越淡忘了,比如线程的实现方式有两三种,线程池的概念,线程的基本生命周期等等,以及关于线程之间的多并发引起的资源的抢占

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g