在 VM 上設定 NTP

許多依賴於謹慎排序事件的軟體系統都依賴於穩定、一致的系統時鐘。這些系統通常會使用含有時間戳記的系統記錄,確保時間同步,並在發生問題時進行偵錯。為協助系統時鐘保持同步,Compute Engine 執行個體已預先設定為使用網路時間通訊協定 (NTP),這是時間同步硬體和軟體的組合解決方案。

在罕見的閏秒情況下,NTP 也很有幫助。閏秒是指為因應地球自轉變化,對世界標準時間 (UTC) 進行的一秒調整。由於地球的自轉速度會因應氣候和地質事件而出現不規律的變化,因此閏秒不會以規律間隔發生。先前實施的閏秒對網路上的各種服務和應用程式造成明顯影響。NTP 伺服器可確保所有伺服器在閏秒事件期間回報相同的時間。

本文說明如何在運算執行個體上設定 NTP 伺服器,包括如何正確處理閏秒。

Google NTP 伺服器與閏秒抹除

Unix 作業系統中的閏秒一般透過重複一天中的最後一秒來實作。這可能會導致預期時間戳記只會增加的軟體發生問題。為解決這個問題,Google 的時間伺服器會每 24 小時 (閏秒事件之前及之後的 12 秒)「抹除」額外的一秒,這樣電腦就不會突然看到額外的秒數成為重複的時間戳記。 Google Cloud這樣可以降低依賴一致時間戳記之系統的風險。建議您將所有運算執行個體設定為使用 Google 內部 NTP 服務。

為您的執行個體設定 NTP

Google Cloud 無法預測外部 NTP 服務 (例如 pool.ntp.org) 如何處理閏秒。強烈建議您不要在運算執行個體中使用外部 NTP 來源。如果同時使用 Google 的 NTP 服務和外部服務,可能會導致系統時間發生無法預測的變化。最好只使用單一外部 NTP 來源,不要混用多個來源。不過,pool.ntp.org等外部 NTP 服務通常會使用步進方式處理閏秒。因此,執行個體可能會出現重複的時間戳記。

最安全的方法是將運算執行個體設定為使用單一 NTP 伺服器,也就是 Google 提供的內部 NTP 伺服器。如要進一步瞭解 Google 提供的內部 NTP 伺服器,請參閱 Google Public NTP 常見問題

如要確保正確設定運算執行個體,請按照以下說明操作。

Linux (chrony)

根據預設,大多數新版 Linux 都會使用 chrony 管理 NTP 設定和時間同步。如要確保 chrony 只使用內部 NTP 服務,請檢查 chrony 設定並移除外部 NTP 伺服器。

  1. 使用 ssh 連線至運算執行個體。

    控制台

    如要使用控制台透過 SSH 連線至運算執行個體,請按照下列步驟操作:

    1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

      前往 VM 執行個體

    2. 按一下要設定的執行個體旁邊的「SSH」按鈕。

      「SSH」按鈕。

    gcloud

    如要使用 Google Cloud CLI 透過 SSH 連線至運算執行個體,請執行下列指令:

    gcloud compute instances ssh INSTANCE_NAME
    

    INSTANCE_NAME 替換為要連線的執行個體名稱。

  2. 在執行個體上執行 chronyc sources,檢查 NTP 設定的目前狀態:

    $ chronyc sources
    

    輸出看起來類似以下內容:

     210 Number of sources = 2
     MS Name/IP address         Stratum Poll Reach LastRx Last sample
     ===============================================================================
     ^* metadata.google.internal      2   6   377     4    -14us[  -28us] +/-  257us
     ^- 38.229.53.9                   2   6    37     4   -283us[ -297us] +/-   28ms
    

    如果看見單一記錄指向 metadata.googlemetadata.google.internal,則不需要進行任何變更。如果看見混合出現的多個來源,包括 metadata.googlepool.ntp.org 之類的公共來源,請更新來源以移除任何外部 NTP 伺服器。

    在範例輸出內容中,有兩個記錄,一個指向 metadata.google.internal,另一個指向外部位址。由於有多個來源,因此您需要更新 NTP 伺服器,移除 38.229.53.9 位址,如後續步驟所述。

  3. 設定 NTP 伺服器,移除外部 NTP 伺服器。

    如要從清單中移除額外的 NTP 伺服器,請使用慣用的文字編輯器編輯 /etc/chrony/chrony.conf 檔案。找出並移除所有開頭為 server external_source_ip_or_name 的行。

    編輯 /etc/chrony/chrony.conf 檔案之後,重新啟動 chrony 服務。重新啟動的指令可能因 Linux 發行版而不同,如下列範例所示:

    sudo service chrony restart
    
    sudo systemctl restart chrony
    
  4. 再次執行 chronyc sources 指令,驗證設定:

    $ chronyc sources
    

    輸出內容應如下所示:

     210 Number of sources = 1
     MS Name/IP address         Stratum Poll Reach LastRx Last sample
     ===============================================================================
     ^* metadata.google.internal      2   7   377    98  -1343ns[-1588ns] +/-  396us
    

Linux (ntpd)

大多數舊版 Linux 發行版會使用 ntpd 管理 NTP 設定和時間同步。如要確保 ntpd 只使用內部 NTP 服務,請檢查 ntpd 設定並移除外部 NTP 伺服器。

  1. 使用 ssh 連線至運算執行個體。

    控制台

    如要使用控制台透過 SSH 連線至運算執行個體,請按照下列步驟操作:

    1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

      前往 VM 執行個體

    2. 按一下要設定的執行個體旁邊的「SSH」按鈕。

      「SSH」按鈕。

    gcloud

    如要使用 Google Cloud CLI 透過 SSH 連線至運算執行個體,請執行下列指令:

    gcloud compute instances ssh INSTANCE_NAME
    

    INSTANCE_NAME 替換為要連線的執行個體名稱。

  2. 在您的執行個體上,執行 ntpq -p 以檢查 NTP 設定的目前狀態:

    $ ntpq -p
    

    輸出內容如下所示:

    remote           refid           st t when poll reach   delay   offset  jitter
    
    ==============================================================================
    *metadata.google 255.28.23.83     2 u   27   64    1    0.634   -2.537   2.285
    *217.162.232.173 130.149.17.8     2 u  191 1024  176   79.245    3.589  27.454
    

    如果看見單一記錄指向 metadata.googlemetadata.google.internal,則不需要進行任何變更。如果您看見混合出現的多個來源,包括 metadata.googlepool.ntp.org 之類的公共來源,則必須更新來源以移除任何外部 NTP 伺服器。

    在範例輸出內容中,有兩個記錄,一個指向 metadata.google,另一個指向外部位址。由於有多個來源,因此您需要更新 NTP 伺服器,移除 *217.162.232.173 位址,如後續步驟所述。

  3. 設定您的 NTP 伺服器,移除外部來源。

    如要設定 NTP 伺服器,請用您常用的文字編輯器編輯 /etc/ntp.conf 檔案。找到設定的 servers 區段,移除所有非 Google NTP 來源,例如:

    vim /etc/ntp.conf
    
    # You do need to talk to an NTP server or two (or three).
    #server ntp.your-provider.example
    ...
    server metadata.google.internal iburst
    

    編輯 /etc/ntp.conf 檔案之後,重新啟動 NTP 服務。重新啟動的指令可能因 Linux 發行版而不同:

    sudo service ntp reload
    
  4. 再次執行 ntpq -p 指令,驗證設定:

    ntpq -p
    
    remote           refid           st t when poll reach   delay   offset  jitter
    ==============================================================================
    *metadata.google 255.28.23.83     2 u   27   64    1    0.634   -2.537   2.285
    

Windows

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 找到要連線的 Windows 執行個體,然後按一下旁邊的「RDP」RDP按鈕。

    「SSH」按鈕。

  3. 登入之後,在 Powershell 圖示上按一下滑鼠右鍵,選取「以系統管理員身分執行」

    PowerShell 圖示。

  4. 當命令提示字元載入時,執行下列指令來查看目前的 NTP 設定:

    w32tm /query /configuration
    
    [Configuration]
    ...
    Type: NTP (Local)
    NtpServer: metadata.google.internal,
    ...
    

    如果看見單一記錄指向 metadata.googlemetadata.google.internal,則不需要進行任何變更。如果您看見混合出現的多個來源,包括 metadata.google 與公開來源,則需要移除外部伺服器。按照 Windows 指南設定您的 NTP 伺服器。

  5. 為確保 Windows VM 上的軟體相容性最廣泛,Google 建議您使用 gVNIC 驅動程式,確保 metadata.google 的 NTP 準確度達到毫秒以下。

    如果必須搭配 Windows VM 使用 VirtIO,為了透過 NTP 伺服器取得毫秒以下的準確度,Google 建議您不要使用 Windows Time Service (停止並取消註冊 w32tm)。

    1. 停止 Windows Time Service:

      net stop w32time
      
    2. 從登錄檔中移除 Windows Time Service:

      w32tm /unregister
      
    3. 停止 Windows Time Service 並從登錄檔中移除後,請安裝 Meinberg NTP 用戶端

      按照 Meinberg 文件中的設定指示操作。

    4. 將 Meinberg NTP 用戶端的 NTP 伺服器設定為 metadata.google.internal

      完成 NTP 設定後,請等待 5 到 15 分鐘,讓 VM 中的系統時鐘與 NTP 伺服器同步。

      如要瞭解我們不建議使用 w32tm 的原因,請參閱已知問題說明文件

搭配使用跳躍塗抹與 Google Cloud外部系統

Google NTP 伺服器的閏秒抹除功能是一種便利的方法,可消除在時間敏感系統上重播一秒時涉及的風險。其他 NTP 服務可能為大多數軟體系統提供可接受的解決方法。不過,請務必不要混用 Google 閏秒抹除 NTP 服務與公開 NTP 步進式服務。

如要將 Google Cloud 之外的裝置與抹除的時間同步,請使用 Google 公開 NTP。 Google Cloud Google 公開 NTP 會使用與 Compute Engine VM 相同的閏秒抹除方法。

後續步驟