Linux中的hangcheck-timer模块

       9.2以前使用一个名为watchdogd的用户空间监视后台程序来监视集群的状态情况,并在出现故障时重新启动RAC节点。从Oracle9.2开始,此监视后台程序已被名为hangcheck-timer的模块所代替,该模块可以更好地解决可用性和可靠性问题。

      hangcheck-计时器被加载到Linux内核中并检查系统是否挂起。它将设置一个计时器,并在特定的时间量之后检查该计时器。有一个用于检查挂起情况的可配置阈值,如果超过该阈值,计算机将重新启动。尽管Oracle CRS并不需要hangcheck-timer模块,但Oracle强烈建议使用它。

      

        hangcheck-timer模块使用了一个基于内核的计时器,该计时器周期性地检查系统任务调度程序,以捕获延迟,从而确定系统的运行状况。如果系统挂起或暂停,则计时器重置该节点。hangcheck-timer模块使用时间戳计数器(TSC) CPU寄存器,该寄存器在每个时钟信号处递增。由于此寄存器由硬件自动更新,因此TCS提供了更精确的时间度量。

      两个参数,即hangcheck_tick(定义系统检查频率,默认60s,oracle建议30s)和hangcheck_margin(定义在重置RAC节点前的最大挂起延时,默认180s,oracle建议180s)来确定节点是否出现故障。hangcheck-timer模块会根据hangcheck_tick的设置,定时检查内核。只要响应时间小于hangcheck_tick+hangcheck_margin,都会认为内核运行正常。否则,就意味着运行异常,模块会自动重启系统。

 

注意:crs的参数MissCount必须大于hangcheck_tick+hangcheck_margin的和(需考证)miscount的值用crsctl get css misscount查询,10gR2 linux平台,默认60s

 

设置hangcheck内核模块参数:

vi /etc/modprobe.conf

options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180

设置hangcheck内核模块开机加载

vi /etc/rc.d/rc.local

/sbin/modprobe hangcheck-timer

 

要立即加载模块,执行:

modprobe -v hangcheck-timer

检查加载情况:

[root@zhh1 ~]# lsmod | grep hangcheck_timer

hangcheck_timer        5593 0

此文档摘自METALINK:726833.1,所适用的ORACLE版本为:Oracle Server -
Enterprise Edition - Version: 9.2.0.8 to 11.1.0.7

从9.2.0.2版本开始,ORACLE RAC环境需要使用一个新的I/O
fencing模块,叫做hangcheck-timer模块。这个模块用来代替Watchdog模块,提供类似的fencing功能。Hangcheck-timer模块是标准的linux2.4以上的内核中的一个子功能被发布。

1. hangcheck-timer简介

Hangcheck-timer应该在系统启动的时候被加载, 并对于能够影响RAC节点稳定性的长时间的系统操作HANG进行内核监控。
它运行在内核级别并使用Time Stamp Counter(TSC)来捕捉调度的延迟和节点HANG。这是通过设置一个timer,然后检查这
个timer的fires情况来判断是否延迟是否超过了误差的幅度。如果这个周期超过了允许的时间(也就是hangcheck_tick+hangcheck_margin秒),机器将会被重启,如果是CPU资源不足的时候,Hangcheck-timer将不会导致重启。

Hangcheck-timer有三个配置参数:

hangcheck_tick:定义了hangcheck-timer检查节点是否hang的频率,单位是秒,缺省是60秒
hangcheck_margin:定义期望的和真正的scheduling之间允许的误差,单位是秒,缺省值是180秒
hangcheck_reboot:定义了如果内核在hangcheck-tick和hangcheck-margin相加的时间内响应失败的话,hangcheck-timer是否重启节点。如果hangcheck_reboot的值大于等于1,hangcheck-timer模块将会重启系统;如果设置为0,则即使系统hang的时候hangcheck-timer也不会重启系统。在linux 2.4的内核中,这个缺省值是1;在2.6的内核中,缺省值是0。

当hangcheck_reboot=1并且满足下面的公式时,hangcheck-timer将reboot系统system hang time > (hangcheck_tick + hangcheck_margin)

所有的hangcheck-timer的参数的缺省值必须在加载内核模块的时候被显式的覆盖,不同的oracle版本可以按照下面来设置:

9i: 假如"oracle misscount"的缺省设置是220秒,则hangcheck_tick=30 hangcheck_margin=180 hangcheck_reboot=1
10g/11g: 假如"CSS misscount"的设置是30或者60秒,则hangcheck_tick=1 hangcheck_margin=10 hangcheck_reboot=1

不过对于目前大多数的环境,我问了几个朋友的rac这几个参数的设置一般为
misscount=220
hangcheck_tick=30
hangcheck_margin=180

注意:你必须设置集群的misscount值大于hangcheck_tick + hangcheck_margin之和

2. hangcheck-timer.ko模块安装:

hangcheck-timer被默认安装在linux版本 2.4.9-e.12 及之上版本中,可以用如下命令核查hangcheck-timer是否安装。

[root@rac2 oracle]# find /lib -name "hangcheck-timer.ko"
/lib/modules/2.6.9-78.EL/kernel/drivers/char/hangcheck-timer.ko
/lib/modules/2.6.9-89.0.23.ELxenU/kernel/drivers/char/hangcheck-timer.ko
/lib/modules/2.6.9-78.ELsmp/kernel/drivers/char/hangcheck-timer.ko
有以上输出,代表已经安装了

modprobe命令将在模块路径/lib/modules/'uname -r'/中搜寻所有的模块和文件。

3. 配置hangcheck-timer
修改配置文件/etc/modprobe.conf ,我的这个文件的内容如下:

[root@rac2 oracle]# more /etc/modprobe.conf
alias eth0 pcnet32
alias eth1 pcnet32
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptscsi
alias scsi_hostadapter2 mptspi
alias scsi_hostadapter3 mptsas
alias scsi_hostadapter4 mptscsih
alias scsi_hostadapter5 ata_piix

options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
[root@rac2 oracle]#

4. 加载hangcheck-timer模块

这个模块是在oracle需要时自动调用的,可以不需要用modprobe或insmod命令来放在启动文件加载。但是一般的条件下,我们还是把这个命令放在系统引导文件中。

为了使得在系统启动的时候就自动加载,可以把上面的命令添加到/etc/rc.d/rc.local或者/etc/init.d/boot.local或者/etc/rc.local中,这个根据不同的发行版来决定。

例如:
# echo "/sbin/modprobe hangcheck-timer" >> /etc/rc.local

说明:

在oracle linux、红帽linux4/5或者SUSE linux9/10中,hangcheck-timer模块使用modprobe命令替换insmod命令
(因为modprobe更灵巧些)来进行加载:

# modprobe hangcheck-timer hangcheck_tick=1 hangcheck_margin=10 hangcheck_reboot=1

5. 查证hangcheck-timer的参数是否正确的方法

[root@rac2 ~]# /sbin/lsmod |grep hangcheck
hangcheck_timer         7897  0

hangcheck-timer的启动信息都会记录在系统日志里“ /var/log/messages”
重启时会记录"Hangcheck: hangcheck is restarting the machine"信息到/var/log/messages

如果你看到/var/log/messages中有"Hangcheck: hangcheck value past margin!"消息,表示系统需要重启但是没有重启,因为hangcheck-reboot参数没有设置为1。

还可以这样验证:

[root@rac2 ~]# su -
[root@rac2 ~]# grep hangcheck /var/log/messages |tail -2
May 10 10:03:56 rac2 kernel: Hangcheck: starting hangcheck timer 0.9.0 (tick is 30 seconds, margin is 180 seconds).
[root@rac2 ~]#

时间: 2024-09-21 19:27:52

Linux中的hangcheck-timer模块的相关文章

linux中Apache使用mod_limitipconn模块限制并发

mod_limitipconn模块下载 http://dominia.org/djao/limitipconn2.html Linux环境的安装 如果您需要手动安装mod_limitipconn,请按照下面的说明.下面的说明是主要应用于Apache 2.2.9,但它也支持任何更高版本的Apache. 编译到httpd的mod_limitipconn说明 tar xzvf httpd-2.2.9.tar.gztar xjvf mod_limitipconn-0.23.tar.bz2cd httpd

linux中php5安装pdo_mysql模块提示make: *** [pdo_mysql.lo] Error 1

错误提示如下 make: *** [pdo_mysql.lo] Error 1 解决办法 这是因为在编译时需要mysql的头的文件,而它按默认搜索找不到头文件的位置,所以才出现这个问题.所以要将 /usr/local/mysql/include/ 目录下的mysql头文件链接到 /usr/local/include/ 的目录下:ln -s /usr/local/mysql/include/* /usr/local/include/然后再make和make install,pdo_mysql模块加

解析Linux内核的基本的模块管理与时间管理操作---超时处理【转】

转自:http://www.jb51.net/article/79960.htm 这篇文章主要介绍了Linux内核的基本的模块管理与时间管理操作,包括模块加载卸载函数的使用和定时器的用法等知识,需要的朋友可以参考下   内核模块管理Linux设备驱动会以内核模块的形式出现,因此学会编写Linux内核模块编程是学习linux设备驱动的先决条件. Linux内核的整体结构非常庞大,其包含的组件非常多.我们把需要的功能都编译到linux内核,以模块方式扩展内核功能. 先来看下最简单的内核模块 ? 1

浅析Linux中的时间编程和实现原理(三) Linux内核的工作

引子 时间系统的工作需要软硬件以及操作系统的互相协作,在上一部分,我们已经看到大多数时间函数都依赖内核系统调用,GlibC 仅仅做了一次请求的转发.因此必须深入内核代码以便了解更多的细节. 内核自身的正常运行也依赖于时钟系统.Linux 是一个典型的分时系统,CPU 时间被分成多个时间片,这是多任务实现的基础.Linux 内核依赖 tick,即时钟中断来进行分时. 为了满足应用和内核自己的需求,内核时间系统必须提供以下三个基本功能: 提供系统 tick 中断(驱动调度器,实现分时) 维护系统时间

在Linux中打印常用书信与信封

管互联网已经十分普及了,E-mail也成为日常必不可少的迅捷交流工具,但在日常办公中仍然少不了传统书信.文书的交流.正因如此,许多Office软件都内置了诸如信纸,信封之类的模板,用户使用这些模板可以快速创建书信及信封.Linux中的办公套件,如OpenOffice.RedOffice.StarOffice等也都内置了大量的书信.信封模板,但却没有常用的信纸样式模板.笔者使用了永中Office 2007 Beta版之后,发现使用该Office的文字处理可以轻而易举地实现信纸样式的书信及信封制作.

Linux中errno使用

  当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少原本看来莫名其妙的问题.但是errno是一个数字,代表的具体含义还要到errno.h中去阅读宏定义,而每次查阅是一件很繁琐的事情.有下面几种方法可以方便的得到错误信息 (1)void perror(const char *s) 函数说明 perror ( )用来将上一个函数发生错误的原因输出到标

linux中出错处理

linux中,在支持多线程的环境中,通常每个线程都有属于自己的errno变量,是用来表示特定错误的常量.   以下是<errno.h>中定义的所有出错errno常量   #define EPERM            1      /* Operation not permitted */#define ENOENT           2      /* No such file or directory */#define ESRCH            3      /* No su

Linux中如何克隆KVM虚拟机

Linux中如何克隆KVM虚拟机 作者 digoal 日期 2016-11-11 标签 Linux , KVM , 虚拟化 , 克隆 背景 当需要批量部署虚拟机时,通常有几种做法,使用模板重新安装. 或者使用已有的虚拟机克隆. 使用模板安装可以参考kickstart脚本的编写方法. <install kvm hosts use kickstart in CentOS 6 in text mode> 本文介绍一下在已经安装好的虚拟机上,克隆虚拟机的方法. 从0开始安装一个虚拟机 在服务器安装必要

如何在 Linux 中根据国家位置来阻断网络流量

如何在 Linux 中根据国家位置来阻断网络流量 作为一名维护 Linux 生产服务器的系统管理员,你可能会遇到这样一些情形:你需要根据地理位置,选择性地阻断或允许网络流量通过. 例如你正经历一次由注册在某个特定国家的 IP 发起的 DoS 攻击:或者基于安全考虑,你想阻止来自未知国家的 SSH 登录请求:又或者你的公司对某些在线视频有分销权,它要求只能在特定的国家内合法发行:抑或是由于公司的政策,你需要阻止某个本地主机将文件上传至任意一个非美国的远程云端存储. 所有的上述情形都需要设置防火墙,