这里会显示出您选择的修订版和当前版本之间的差别。
jaysnote:htpdate [2018/11/09 15:43] jaylee 创建 |
jaysnote:htpdate [2021/06/22 23:14] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | < | ||
- | # htpdate | ||
- | |||
- | 标签 :GAC-350 | ||
- | |||
- | GAC-350 放弃ntpdate采用htpdate,通过`/ | ||
- | |||
- | ```bash | ||
- | HTP_SERVERS=" | ||
- | HTP_OPTIONS=" | ||
- | ``` | ||
- | |||
- | 初步怀疑第一次未正常获取到时间后,默认轮询周期过大,导致未及时同步,在`man htpdate`找到轮询周期的描述,从这里看这里默认的轮询周期在30分钟至32小时。 | ||
- | |||
- | ```bash | ||
- | -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:// | ||
- | |||
- | ```bash | ||
- | sudo apt-get source htpdate | ||
- | ``` | ||
- | |||
- | 仔细走读了代码,发现这里的最小时间和最大时间有很多规则,理顺完整原理后再详细介绍这里的规则。 | ||
- | |||
- | * htpdate 区分deamon 模式,在deamon模式会周期同步时间,否则只同步一次; | ||
- | * 从服务器http文件头多次获取时间,如果存在多个服务器,多次获取; | ||
- | * 计算多个服务器获取时间平均值,并且计算本地误差然后更改时间; | ||
- | |||
- | 而对于轮询时间和异常处理,如下规则: | ||
- | |||
- | * 多个服务器,某一个服务器获取时间失败,休眠,时间设置最小时间除以/ | ||
- | |||
- | ```c | ||
- | //htpdate.c Line.726 | ||
- | /* Sleep for a while, unless we detected a time offset */ | ||
- | if ( daemonize && !offsetdetect ) | ||
- | sleep( sleeptime / numservers ); | ||
- | ``` | ||
- | |||
- | * 成功获取时间(任一服务器),如果存在误差,立即同步,休眠30分钟(固定时间)最小延时值设置为最小时间; | ||
- | |||
- | ```c | ||
- | //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 ); | ||
- | ``` | ||
- | |||
- | * 多个服务器获取时间均失败,最小时间睡眠; | ||
- | |||
- | ```c | ||
- | //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,直到最大时间; | ||
- | |||
- | ```c | ||
- | //htpdate.c Line.750 | ||
- | /* Increase polling interval */ | ||
- | if ( sleeptime < maxsleep ) | ||
- | sleeptime <<= 1; | ||
- | ``` | ||
- | |||
- | 综上,如果未通过-m 或者 -M 默认最小轮询时间为30(DEFAULT_MIN_SLEEP)分钟,开机无网络,如果在半个小时内恢复网络,最多等待10分钟(最小时间30/ | ||
- | |||
- | 如果同步时间,30分钟后再次又存在误差,如果误差在于秒级别,调整时间,如果误差大于秒级别调整时间会失败,参考[通过date -s 修改时间未及时同步](# | ||
- | |||
- | 同步时间后不存在误差,时间按照-m传递时间默认(30分钟)递增,直到-M传递的最大值,默认32小时; | ||
- | |||
- | ## modify | ||
- | |||
- | 如果只是修改开机网络恢复未及时同步的情景,直接尝试修改`/ | ||
- | |||
- | ``` | ||
- | HTP_OPTIONS=" | ||
- | ``` | ||
- | |||
- | 查看日志 | ||
- | |||
- | ```bash | ||
- | sudo cat / | ||
- | ``` | ||
- | |||
- | > **提示**:需要通过`-d`启用debug模式; | ||
- | |||
- | |||
- | |||
- | ## Troubleshooting | ||
- | |||
- | ### 通过date -s 修改时间未及时同步 | ||
- | |||
- | > **注意**:如果上一次成功同步时间,则默认需要等待30分钟(DEFAULT_MIN_SLEEP) | ||
- | |||
- | ```bash | ||
- | $sudo cat / | ||
- | Nov 5 20:18:33 mxj-zbcs-310 htpdate: Adjusting 252461173.667 seconds | ||
- | ``` | ||
- | |||
- | 如果成功设置(`-s`)一次时间后,修改时间模式设置为调整模式(`-a`),该模式下主要是调整小误差延时,出现在过大时间会直接设置失败。 | ||
- | |||
- | ```c | ||
- | //htpdate.c Line.311 | ||
- | case 1: /* Adjust time smoothly */ | ||
- | timeofday.tv_sec | ||
- | timeofday.tv_usec = (long)((timedelta - timeofday.tv_sec) * 1000000); | ||
- | |||
- | printlog( 0, " | ||
- | |||
- | /* Become root */ | ||
- | if ( seteuid(0) ) { | ||
- | printlog( 1, " | ||
- | exit(1); | ||
- | } else { | ||
- | return( adjtime(& | ||
- | } | ||
- | ``` | ||
- | |||
- | > **PS**: 最新版本1.2.0-2现象一致,说明htpdate deamon 模式为考虑此问题,如果要解决此问题可能只有在非deamon模式,每次通过`-s`模式设置时间; | ||
- | |||
- | ```bash | ||
- | sudo htpdate -s -t baidu.com youku.com taobao.com | ||
- | ``` | ||
- | |||
- | |||
- | |||
- | </ |