在運算執行個體上設定 NTP

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

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

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

Google NTP 伺服器和閏秒抹除簡介

Unix 作業系統通常會重複當天的最後一秒,藉此實作閏秒。這可能會導致軟體發生問題,因為軟體預期時間戳記只會增加。為解決這個問題,時間伺服器會在閏秒事件前後各 12 小時,將多出的 1 秒「抹除」 Google Cloud,讓電腦不會一次看到多出的 1 秒,而將其視為重複的時間戳記。這可降低系統中時間戳記不一致的風險。建議您將所有運算執行個體設定為使用 Google 內部 NTP 服務。

建議不要使用外部 NTP 服務

Google Cloud 無法預測外部 NTP 服務 (例如 pool.ntp.org) 如何處理閏秒。強烈建議您不要在運算執行個體中使用外部 NTP 來源。如果同時使用 Google 的 NTP 服務和外部服務,系統時間可能會發生無法預測的變更。建議您只使用單一外部 NTP 來源,而非混合使用,但外部 NTP 服務 (例如 pool.ntp.org) 通常會使用步進法來處理閏秒。因此,執行個體可能會看到重複的時間戳記。

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

搭配使用閏秒調整與 Google Cloud外部系統

Google NTP 伺服器的閏秒抹除功能可輕鬆管理時間敏感系統重播一秒所涉及的風險。其他 NTP 服務可能為大多數軟體系統提供可接受的解決方法。不過,請務必不要將 Google 閏秒調整 NTP 服務與公開 NTP 步進服務混用。

如要將裝置同步到與 Google Cloud 抹除時間不同的時間,可以為這些裝置使用 Google Public NTP。Google 公用 NTP 採用與 Compute Engine 執行個體相同的閏秒抹除技術。

為您的執行個體設定 NTP

為確保運算執行個體設定正確,請按照下列指示操作:

Linux (chrony)

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

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

    控制台

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

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

      前往 VM 執行個體

    2. 找到要設定的執行個體,然後按一下該執行個體的「SSH」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.google 或 metadata.google.internal,則不需要進行任何變更。如果看到多個來源,且其中混有 metadata.google 和公開來源 (例如 pool.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)

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

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

    控制台

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

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

      前往 VM 執行個體

    2. 找到要設定的執行個體,然後按一下該執行個體的「SSH」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.google 或 metadata.google.internal,則不需要進行任何變更。如果看到多個來源,且混合了 metadata.google 和 pool.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.google 或 metadata.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 服務:

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

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

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

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

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

後續步驟