在suse linux 10上部署WAS应用和搭建ORACLE RAC集群时,经常会碰到因系统时间不准而导致WAS不正常和RAC节点宕机问题,解决系统时间跑偏的问题,大家会很自然的想到NTP和CRONTAB。下面针对这个问题来具体说说suse linux 10系统时间跑偏问题。

一、现象
        经过观察,你会发现在安装系统后第一次设置正确系统时间后,没设置定时校准的情况下,它的系统时间一小时会偏差有4-6分钟左右,一天下来通常会偏差50分钟左右。这在生产环境下肯定会出问题。

二、NTP设置
        如果你能直接连接到外部时间源或一个内部的时间源服务器,你可以在其中的一台suse linux 10上设置NTP服务器,让其他suse linux 10定时同步这台NTP服务器就行。
#vi  /etc/ntp.conf

## Radio and modem clocks by convention have addresses in the
## form 127.127.t.u, where t is the clock type and u is a unit
## number in the range 0-3.
##
## Most of these clocks require support in the form of a
## serial port or special bus peripheral. The particular 
## device is normally specified by adding a soft link
## /dev/device-u to the particular hardware device involved,
## where u correspond to the unit number above.
##
## Generic DCF77 clock on serial port (Conrad DCF77)
## Address:     127.127.8.u
## Serial Port: /dev/refclock-u
## 
## (create soft link /dev/refclock-0 to the particular ttyS?)
##
# server 127.127.8.0 mode 5 prefer

##
## Undisciplined Local Clock. This is a fake driver intended for backup
## and when no outside source of synchronized time is available.
##
server 127.127.1.0              # local clock (LCL)
fudge  127.127.1.0 stratum 10   # LCL is unsynchronized
##
## Outside source of synchronized time
##
## server xx.xx.xx.xx           # IP address of server

server  10.7.0.81     #手工设置时间源服务器

##
## Miscellaneous stuff
##

driftfile /var/lib/ntp/drift/ntp.drift # path for drift file

logfile   /var/log/ntp          # alternate log file
# logconfig =syncstatus + sysevents
# logconfig =all

# statsdir /tmp/                # directory for statistics files
# filegen peerstats  file peerstats  type day enable
# filegen loopstats  file loopstats  type day enable
# filegen clockstats file clockstats type day enable

#
# Authentication stuff
#
# keys /etc/ntp.keys            # path for keys file
# trustedkey 1 2 3 4 5 6 14 15  # define trusted keys
# requestkey 15                 # key (7) for accessing server variables
# controlkey 15                 # key (6) for accessing server variables

然后你可以使用:

#hwclock  -r                #查看硬件时间

#hwclock --systohc     #把硬件时间赋给系统时间

在其他suse linux 10上设置CRONTAB定时校准
#crontab -e   加上下面一句   (或者用#crontab -u  root  -e)
*/15 * * * *  /usr/sbin/ntpdate 10.7.0.81;/sbin/hwclock -w
意思是每15分钟同步一次并将时间写入硬件时钟

三、直接设置CRONTAB

     如果有时间源服务器且suse linux 10服务器都能正常PING通时间源服务器,你可以在所有的suse linux 10服务器上直接设置CRONTAB来定时同步时间源服务器。
具体方法同上
#crontab -e   加上下面一句
*/15 * * * *  /usr/sbin/ntpdate 10.7.0.81;/sbin/hwclock -w
意思是每15分钟同步一次并将时间写入硬件时钟
如果你想看到每天具体的输出结果,可以加一个输出日志ntprizhi.txt来分析
*/15 * * * *  /usr/sbin/ntpdate 10.7.0.81>>/tmp/ntprizhi.txt;/sbin/hwclock -w
当然也可以查看系统下的日志,如果你是root用户,直接查看
/var/mail/root就可以了,形式如下
Subject: Cron /usr/sbin/ntpdate 10.7.0.81;/sbin/hwclock -w
X-Cron-Env:
X-Cron-Env:
X-Cron-Env:
X-Cron-Env:
X-Cron-Env:
Message-Id: <[email protected]>
Date: Tue, 26 Nov 2012 18:30:01 +0800 (CST)

26 Nov 18:29:59 ntpdate[6917]: step time server 10.7.0.81 offset -1.361968 sec

四、系统内核参数修改
        即便设置了每15分钟同步,有时你发现仍然会出现时间跑偏的问题。这时你可以缩短同步的时间,比如设置成每5分钟甚至每1分钟同步一次,但如果需要同步的suse linux 10服务器
比较多的情况下对时间源就会造成压力。这时你需要考虑让suse linux 10服务器自己把时间跑准,那么方法是修改系统内核参数。
我们先看一下修改前的系统内核参数
# cat /boot/grub/menu.lst
# Modified by YaST2. Last modification on Thu Nov  3 08:00:47 UTC 2011
default 0
timeout 8
##YaST - generic_mbr
gfxmenu (hd0,1)/boot/message
##YaST - activate

###Don't change this comment - YaST2 identifier: Original name: linux###
title SUSE Linux Enterprise Server 10 SP2
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.16.60-0.21-smp root=/dev/hda2    resume=/dev/hda1 splash=silent showopts  hda=noprobe hdb=noprobe 
    initrd /boot/initrd-2.6.16.60-0.21-smp

###Don't change this comment - YaST2 identifier: Original name: floppy###
title Floppy
    rootnoverify (hd0)
    chainloader (fd0)+1

###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- SUSE Linux Enterprise Server 10 SP2
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.16.60-0.21-smp root=/dev/hda2 showopts ide=nodma apm=off acpi=off noresume edd=off 3 hda=noprobe hdb=noprobe 
    initrd /boot/initrd-2.6.16.60-0.21-smp
You have new mail in /var/mail/root

修改后的文件,注意红色语句部分

# cat /boot/grub/menu.lst
# Modified by YaST2. Last modification on Thu Nov  3 08:00:47 UTC 2011
default 0
timeout 8
##YaST - generic_mbr
gfxmenu (hd0,1)/boot/message
##YaST - activate

###Don't change this comment - YaST2 identifier: Original name: linux###
title SUSE Linux Enterprise Server 10 SP2
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.16.60-0.21-smp root=/dev/hda2    resume=/dev/hda1 splash=silent showopts  hda=noprobe hdb=noprobe clock=pmtmr
    initrd /boot/initrd-2.6.16.60-0.21-smp

###Don't change this comment - YaST2 identifier: Original name: floppy###
title Floppy
    rootnoverify (hd0)
    chainloader (fd0)+1

###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- SUSE Linux Enterprise Server 10 SP2
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.16.60-0.21-smp root=/dev/hda2 showopts ide=nodma apm=off acpi=off noresume edd=off 3 hda=noprobe hdb=noprobe clock=pmtmr
    initrd /boot/initrd-2.6.16.60-0.21-smp
You have new mail in /var/mail/root
 

注意红色的语句其后面加上了蓝色部分clock=pmtmr

当该参数设置后,可以在合适时间重启服务器让参数生效,经过测试和观察,系统时间不再跑偏.
 

时间加快的原理探究:
相对于SLES9的2.4内核,SLES10中的2.6内核改变了时钟嘀嗒的中断数量,从100个/每秒到1000个/每秒。在双处理器的2.6内核,甚至可以达到每秒3000个。 由于LINUX内核产生中断的能力差别,一些时间嘀嗒可能会被忽略。这会导致许多额外的嘀嗒来校正被忽略的嘀嗒,从而带来时间加快的副作用。当然LINUX本身会有算法来校正和解决系统中的这个问题。