如何确保 hv_utils 正在更新 Azure 中的系统时钟

如何确保 hv_utils 正在更新 Azure 中的系统时钟

我们在 Azure 中运行 Ubuntu 16.04 VM,并注意到时钟偏移了约 20 秒。系统使用通用 Ubuntu 映像(由我们的 IT 部门管理,不确定是否进行了任何更改/修改),并且无法访问 Internet 或任何公共 NTP 池。此外,我们的 Azure 区域中没有 NTP 服务器,但我看到它正在尝试达到 ntp.ubuntu.com 的默认配置:

$ cat /etc/systemd/timesyncd.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=ntp.ubuntu.com

$ sudo systemctl status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
           └─disable-with-time-daemon.conf
   Active: active (running) since Tue 2017-12-05 15:59:12 UTC; 1 weeks 6 days ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 957 (systemd-timesyn)
   Status: "Idle."
    Tasks: 2
   Memory: 560.0K
      CPU: 17.173s
   CGroup: /system.slice/systemd-timesyncd.service
           └─957 /lib/systemd/systemd-timesyncd

Dec 18 23:52:54 VMNAME systemd-timesyncd[957]: Timed out waiting for reply from 91.189.91.157:123 (ntp.ubuntu.com).
Dec 18 23:53:04 VMNAME systemd-timesyncd[957]: Timed out waiting for reply from 91.189.89.199:123 (ntp.ubuntu.com).

据我了解,最近的 Ubuntu 镜像本身支持 Hyper-V 内置的时间同步。事实上,我可以看到工具类内核模块已加载,但我在系统日志中没有看到有关它的任何消息

$ lsmod | grep hv
hv_balloon             24576  0
hv_storvsc             20480  2
hv_netvsc              40960  0
scsi_transport_fc      61440  1 hv_storvsc
hv_utils               24576  2
hv_vmbus               73728  7 hv_balloon,hyperv_keyboard,hv_netvsc,hid_hyperv,hv_utils,hyperv_fb,hv_storvsc

$ dmesg
[    2.706739] clocksource: hyperv_clocksource_tsc_page: mask: 0xffffffffffffffff max_cycles: 0x24e6a1710, max_idle_ns: 440795202120 ns
[    2.709052] Floppy drive(s): fd0 is 1.44M
[    2.735624] FDC 0 is an 82078.
[    2.737857] clocksource: Switched to clocksource hyperv_clocksource_tsc_page
[    2.748059] hv_vmbus: Hyper-V Host Build:14393-10.0-0-0.230; Vmbus version:4.0
[    2.757269] hv_vmbus: Unknown GUID: f8e65716-3cb3-4a06-9a60-1889c5cccab5
[    2.761412] hv_vmbus: Unknown GUID: 3375baf4-9e15-4b30-b765-67acb10d607b
[    2.766081] hv_vmbus: Unknown GUID: 276aacf4-ac15-426c-98dd-7521ad3f01fe
[    2.775497] hv_vmbus: registering driver hyperv_fb
[    2.779440] hyperv_fb: Screen resolution: 1152x864, Color depth: 32
[    2.786286] Console: switching to colour frame buffer device 144x54
[    2.807248] hv_vmbus: registering driver hyperv_keyboard
[    2.812765] hv_utils: Registering HyperV Utility Driver
[    2.815236] hv_vmbus: registering driver hv_util
[    2.819533] hidraw: raw HID events driver (C) Jiri Kosina
[    2.825316] AVX2 version of gcm_enc/dec engaged.
[    2.827788] AES CTR mode by8 optimization enabled
[    2.831632] hv_vmbus: registering driver hid_hyperv
[    2.834734] input: Microsoft Vmbus HID-compliant Mouse as /devices/0006:045E:0621.0001/input/input4
[    2.839602] hid 0006:045E:0621.0001: input: <UNKNOWN> HID v0.01 Mouse [Microsoft Vmbus HID-compliant Mouse] on
[    2.845660] hv_vmbus: registering driver hv_storvsc
[    2.849843] scsi host2: storvsc_host_t
[    2.853512] scsi 2:0:0:0: Direct-Access     Msft     Virtual Disk     1.0  PQ: 0 ANSI: 5
[    2.857949] hv_vmbus: registering driver hv_netvsc

我还需要做什么才能启用 Hyper-V 实用程序驱动程序计时/同步吗?

答案1

因此,看起来最近有一个已知问题Hyper-V hv_util 时间源。此外,当我们重新启动虚拟机时,20 秒的时间漂移​​消失了,因此很可能是硬件时钟正在运行,但在更新系统时钟时遇到了问题。

我们的虚拟机使用的是内核 4.4.0-47,而上述问题已在 4.4.0-87.110 中得到修补。运行sudo apt-get update && sudo apt-get upgrade并重新启动虚拟机后,我们现在拥有内核 4.4.0-104。我将继续监控漂移,但仍然好奇是否有任何方法可以确认 hv_utils 正在更新系统时钟。

更新: 到目前为止,这似乎已经解决了问题。以前,我们看到每 24 秒大约有 1ms 的漂移(每 24 小时漂移超过 3.5s),而在更新内核后,我们看到增量保持在 200ms 以下。

$ sudo apt-get install iputils-clockdiff
$ clockdiff TESTNTPSERVER
.
host=VMNAME rtt=750(187)ms/0ms delta=-182ms/-182ms Tue Dec 19 03:46:43 2017

更新:在接下来的 24 小时内,我们看到它继续从 -200 毫秒漂移到 +2904 毫秒。上面的补丁似乎是为了修复内核时间调整与用户空间 ntpd/systemd-timesyncd 进程之间的争用,该争用导致服务器不断漂移。在我们的案例中,systemd-timesyncd 从未成功更新时钟,因为它无法访问默认 ntp 服务器(错误journalctl -u systemd-timesyncd消息和空/var/lib/systemd/clock文件证实了这一点)。所以我们看到的是 4.4.0-87.110 内核中的新行为,其中现在,hyper-v 时钟不再进行内核时间调整,而是作为 PTP 硬件时钟 (PHC) 公开. 使用 phc_ctl 我们可以在虚拟机上看到这个时钟(注意这也会启用 ptp4l 服务):

$ clockdiff TESTNTPSERVER
............
host=VMNAME rtt=33(93)ms/0ms delta=2904ms/2904ms Tue Dec 19 20:59:48 2017

$ ls -la /var/lib/systemd/clock
-rw-r--r-- 1 systemd-timesync systemd-timesync 0 Feb 11  2016 /var/lib/systemd/clock

$ sudo apt-get install linuxptp
$ sudo systemctl disable ptp4l
$ sudo phc_ctl /dev/ptp0 get;echo "              date: clock time is $(date +%s.%N) or $(date)"
phc_ctl[65577.406]: clock time is 1513721576.691973400 or Tue Dec 19 22:12:56 2017
              date: clock time is 1513721574.065892000 or Tue Dec 19 22:12:54 UTC 2017

因此,如果我们想在 4.4.0-87.110 或更新的内核上使用内置的 Hyper-V 时间同步,我们需要使用支持 PTP 硬件时钟的时间同步过程。

相关内容