用户工具

站点工具


jaysnote:htpdate

htpdate

标签 :GAC-350 htpdate

GAC-350 放弃ntpdate采用htpdate,通过/etc/default/htpdate配置为deamon模式,并且尝试从多个门户网站同步时间。但是测试反馈从开机无网络到网络恢复的时候同步时间未及时恢复,需要等待一段时间。

HTP_SERVERS="baidu.com youku.com taobao.com"
HTP_OPTIONS="-D -d -s -t"

初步怀疑第一次未正常获取到时间后,默认轮询周期过大,导致未及时同步,在man htpdate找到轮询周期的描述,从这里看这里默认的轮询周期在30分钟至32小时。

-m -M  These options specify the minimum (-m) and maximum (-M) polling intervals for HTP requests, in seconds. The default range is between 30 minutes and 32 hours. Htpdate calcu‐
              lates the optimal polling frequency between minimum and maximum values. Only applicable when running in daemon mode.

code review

https://salsa.debian.org/debian/htpdate

sudo apt-get source htpdate            #htpdate-1.1.0

仔细走读了代码,发现这里的最小时间和最大时间有很多规则,理顺完整原理后再详细介绍这里的规则。

  • htpdate 区分deamon 模式,在deamon模式会周期同步时间,否则只同步一次;
  • 从服务器http文件头多次获取时间,如果存在多个服务器,多次获取;
  • 计算多个服务器获取时间平均值,并且计算本地误差然后更改时间;

而对于轮询时间和异常处理,如下规则:

  • 多个服务器,某一个服务器获取时间失败,休眠,时间设置最小时间除以/服务器数量;

    //htpdate.c Line.726
    /* Sleep for a while, unless we detected a time offset */
    if ( daemonize && !offsetdetect )
    sleep( sleeptime / numservers );
  • 成功获取时间(任一服务器),如果存在误差,立即同步,休眠30分钟(固定时间)最小延时值设置为最小时间;

    //htpdate.c Line.796
    /* Decrease polling interval to minimum */
    sleeptime = minsleep;
    
    /* Sleep for 30 minutes after a time adjust or set */
    sleep( DEFAULT_MIN_SLEEP );
  • 多个服务器获取时间均失败,最小时间睡眠;

    //htpdate.c Line.750
    if ( goodtimes ) {
    } else {
      printlog( 1, "No server suitable for synchronization found" );
      /* Sleep for minsleep to avoid flooding */
      if ( daemonize )
          sleep( minsleep );
  • 获取成功,但是不存在时间误差;睡眠时间*2,直到最大时间;

    //htpdate.c Line.750
    /* Increase polling interval */
    if ( sleeptime < maxsleep )
      sleeptime <<= 1;

综上,如果未通过-m 或者 -M 默认最小轮询时间为30(DEFAULT_MIN_SLEEP)分钟,开机无网络,如果在半个小时内恢复网络,最多等待10分钟(最小时间30/服务器数量3),如果在30分钟后恢复网络,最多等待30分钟(默认最小时间);

如果同步时间,30分钟后再次又存在误差,如果误差在于秒级别,调整时间,如果误差大于秒级别调整时间会失败,参考[通过date -s 修改时间未及时同步](#Troubleshooting/通过date -s 修改时间未及时同步)。

同步时间后不存在误差,时间按照-m传递时间默认(30分钟)递增,直到-M传递的最大值,默认32小时;

modify

如果只是修改开机网络恢复未及时同步的情景,直接尝试修改/etc/default/htpdate,增加-m 和-M 设置最小和最下时间即可。

HTP_OPTIONS="-D -d -s -t -m 60 -M 65"

查看日志

sudo  cat /var/log/syslog |grep htpdate

提示:需要通过-d启用debug模式;

Troubleshooting

通过date -s 修改时间未及时同步

注意:如果上一次成功同步时间,则默认需要等待30分钟(DEFAULT_MIN_SLEEP)

$sudo  cat /var/log/syslog |grep htpdate
Nov  5 20:18:33 mxj-zbcs-310 htpdate: Adjusting 252461173.667 seconds

如果成功设置(-s)一次时间后,修改时间模式设置为调整模式(-a),该模式下主要是调整小误差延时,出现在过大时间会直接设置失败。

//htpdate.c Line.311
case 1:                     /* Adjust time smoothly */
    timeofday.tv_sec  = (long)timedelta;
    timeofday.tv_usec = (long)((timedelta - timeofday.tv_sec) * 1000000);

    printlog( 0, "Adjusting %.3f seconds", timedelta );

    /* Become root */
    if ( seteuid(0) ) {
        printlog( 1, "seteuid()" );
        exit(1);
    } else {
        return( adjtime(&timeofday, NULL) );       
    }

PS: 最新版本1.2.0-2现象一致,说明htpdate deamon 模式为考虑此问题,如果要解决此问题可能只有在非deamon模式,每次通过-s模式设置时间;

sudo htpdate -s -t  baidu.com youku.com taobao.com
jaysnote/htpdate.txt · 最后更改: 2021/06/22 23:14 (外部编辑)