vcdog 发表于 2011-12-23 03:07

ORACLE RAC 之I/O分离--hangcheck-timer模块配置

<P>ORACLE RAC 之I/O分离--hangcheck-timer模块配置</P>
<P>此文档摘自METALINK:726833.1,所适用的ORACLE版本为:Oracle Server - Enterprise Edition - Version: 9.2.0.8 to 11.1.0.7</P>
<P>从9.2.0.2版本开始,ORACLE RAC环境需要使用一个新的I/O fencing模块,叫做hangcheck-timer模块。</P>
<P>这个模块用来代替Watchdog模块,提供类似的fencing功能。Hangcheck-timer模块是标准的linux2.4以上的内核中的一个子功能被发布。</P>
<P>1. hangcheck-timer简介</P>
<P>Hangcheck-timer应该在系统启动的时候被加载, 并对于能够影响RAC节点稳定性的长时间的系统操作HANG进行内核监控。</P>
<P>它运行在内核级别并使用Time Stamp Counter(TSC)来捕捉调度的延迟和节点HANG。这是通过设置一个timer,然后检查这个timer的fires情况来判断是否延迟是否超过了误差的幅度。如果这个周期超过了允许的时间(也就是hangcheck_tick+hangcheck_margin秒),机器将会被重启,如果是CPU资源不足的时候,Hangcheck-timer将不会导致重启。</P>
<P>Hangcheck-timer有三个配置参数:</P>
<P>hangcheck_tick: 定义了hangcheck-timer检查节点是否hang的频率,单位是秒,缺省是60秒</P>
<P>hangcheck_margin: 定义期望的和真正的scheduling之间允许的误差,单位是秒,缺省值是180秒</P>
<P>hangcheck_reboot: 定义了如果内核在hangcheck-tick和hangcheck-margin相加的时间内响应失败的话,hangcheck-timer是否重启节点。</P>
<P>如果hangcheck_reboot的值大于等于1,hangcheck-timer模块将会重启系统;如果设置为0,则即使系统hang的时候hangcheck-timer也不会重启系统。</P>
<P>在linux 2.4的内核中,这个缺省值是1;在2.6的内核中,缺省值是0。</P>
<P>当hangcheck_reboot=1并且满足下面的公式时,hangcheck-timer将reboot系统system hang time &gt; (hangcheck_tick + hangcheck_margin),所有的hangcheck-timer的参数的缺省值必须在加载内核模块的时候被显式的覆盖,不同的oracle版本可以按照下面来设置:</P>
<P>9i: 假如"oracle misscount"的缺省设置是220秒,则hangcheck_tick=30 hangcheck_margin=180 hangcheck_reboot=1</P>
<P>10g/11g: 假如"CSS misscount"的设置是30或者60秒,则hangcheck_tick=1 hangcheck_margin=10 hangcheck_reboot=1</P>
<P>不过对于目前大多数的环境,我问了几个朋友的rac这几个参数的设置一般为</P>
<P>misscount=220</P>
<P>hangcheck_tick=30</P>
<P>hangcheck_margin=180</P>
<P>注意:你必须设置集群的misscount值大于hangcheck_tick + hangcheck_margin之和</P>
<P><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'">CSS 服务有2种心跳机制: 一种是通过私有网络的Network Heartbeat,另一种是通过Voting Disk的Disk Heartbeat.</SPAN></SPAN></P>
<P><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'">这2种心跳都有最大延时,对于Disk Heartbeat, 这个延时叫作IOT (I/O Timeout);对于Network Heartbeat, 这个延时叫MC(Misscount)。 这2个参数都以秒为单位,缺省时IOT大于MC,在默认情况下,这2个参数是Oracle 自动判定的,并且不建议调整。可以通过如下命令来查看参数值:</SPAN></P>
<P style="TEXT-ALIGN: justify; MARGIN-TOP: 0pt; TEXT-INDENT: 21pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt" class=p0 align=right><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"><FONT color=#0000f0>$crsctl get css disktimeout</FONT></SPAN></P>
<P style="TEXT-ALIGN: justify; MARGIN-TOP: 0pt; TEXT-INDENT: 21pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt" class=p0 align=right><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"><FONT color=#0000f0>$crsctl get css misscount</FONT></SPAN></P></SPAN>
<P>2. hangcheck-timer.ko模块安装:</P>
<P>hangcheck-timer被默认安装在linux版本 2.4.9-e.12 及之上版本中,可以用如下命令核查hangcheck-timer是否安装。</P>
<P># find /lib -name "hangcheck-timer.ko"</P>
<P>/lib/modules/2.6.18-164.el5/kernel/drivers/char/hangcheck-timer.ko</P>
<P>有以上输出,代表已经安装了</P>
<P>modprobe命令将在模块路径/lib/modules/'uname -r'/中搜寻所有的模块和文件。</P>
<P>3. 配置hangcheck-timer:</P>
<P>修改配置文件/etc/modprobe.conf ,我的这个文件的内容如下:</P>
<P># more /etc/modprobe.conf</P>
<P>alias eth0 pcnet32</P>
<P>alias eth1 pcnet32</P>
<P>alias scsi_hostadapter mptbase</P>
<P>alias scsi_hostadapter1 mptscsi</P>
<P>alias scsi_hostadapter2 mptspi</P>
<P>alias scsi_hostadapter3 mptsas</P>
<P>alias scsi_hostadapter4 mptscsih</P>
<P>alias scsi_hostadapter5 ata_piix</P>
<P>options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180</P>
<P>4. 加载hangcheck-timer模块:</P>
<P>这个模块是在oracle需要时自动调用的,可以不需要用modprobe或insmod命令来放在启动文件加载。但是一般的条件下,我们还是把这个命令放在系统引导文件中。</P>
<P>为了使得在系统启动的时候就自动加载,可以把上面的命令添加到/etc/rc.d/rc.local或者/etc/init.d/boot.local或者/etc/rc.local中,这个根据不同的发行版来决定。</P>
<P>例如:</P>
<P># echo "/sbin/modprobe hangcheck-timer" &gt;&gt; /etc/rc.local</P>
<P>说明:</P>
<P>在oracle linux、红帽linux4/5或者SUSE linux9/10中,hangcheck-timer模块使用modprobe命令替换insmod命令(因为modprobe更灵巧些)来进行加载:</P>
<P># modprobe hangcheck-timer hangcheck_tick=1 hangcheck_margin=10 hangcheck_reboot=1</P>
<P>5. 查证hangcheck-timer的参数是否正确的方法:</P>
<P># /sbin/lsmod |grep hangcheck</P>
<P>hangcheck_timer 7897 0 </P>
<P>hangcheck-timer的启动信息都会记录在系统日志里“ /var/log/messages”</P>
<P>重启时会记录"Hangcheck: hangcheck is restarting the machine"信息到/var/log/messages</P>
<P>如果你看到/var/log/messages中有"Hangcheck: hangcheck value past margin!"消息,表示系</P>
<P>统需要重启但是没有重启,因为hangcheck-reboot参数没有设置为1。</P>
<P># grep hangcheck /var/log/messages |tail -2</P>
<P>Sep 21 11:03:20 rac2 kernel: Hangcheck: starting hangcheck timer 0.9.0 (tick is 30 seconds, margin is 180 seconds).</P>
<P>Sep 21 11:03:20 rac2 kernel: Hangcheck: Using get_cycles().</P>
<P>文档参考:</P>
<P>http://zhang41082.itpub.net/post/7167/467614</P>
<P><A href="http://www.rampant-books.com/art_hunter_rac_oracle%20linux_hangcheck_kernel_module.htm" target=_blank>http://www.rampant-books.com/art_hunter_rac_oracle%20linux_hangcheck_kernel_module.htm</A></P>
<P>&nbsp;</P>
<P>后记:</P>
<P><FONT color=#0000f0>ORACLE10g RAC 10.2.0.1.0版本,OS内核版本为:2.6.18-164.el5 时,设置hangcheck-timer的三个参数为如下值比较合适:<BR>&nbsp;<BR>&nbsp;modprobe hangcheck-timer hangcheck_tick=10 hangcheck_margin=40 hangcheck_reboot=1<BR>因为,CRS默认的misscount值为60s,一定要保证misscount&gt;(hangcheck_tick+hangcheck_margin),且hangcheck_tick,&nbsp;hangcheck_margin的值不能过大。否则,两节点便会不断地重启。</FONT></P>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV><A href="http://www.51.la/?5549688" target=_blank><IMG style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: medium none; BORDER-RIGHT: medium none" alt=我要啦免费统计 src="http://img.users.51.la/5549688.asp"></A>
页: [1]
查看完整版本: ORACLE RAC 之I/O分离--hangcheck-timer模块配置