Genaue Zeit für U4-Compute Engine-Instanzen konfigurieren

Auf dieser Seite wird beschrieben, wie Sie die genaue Zeit für eine U4-Compute Engine-Instanz konfigurieren und das Monitoring so einrichten, dass Sie die Genauigkeit der Zeitsynchronisierung sehen können.

Funktionsweise

Google Cloud Die Ultra Low Latency (ULL) Solution verwendet das Zeitsynchronisationsprotokoll Firefly, um eine Synchronisation im Nanosekundenbereich zu ermöglichen. Firefly führt automatisch die folgenden Schritte aus:

  • Führt eine interne Synchronisierung durch, um die Uhren der physischen Netzwerkschnittstellen (NIC) aller U4-Instanz-Hostserver miteinander zu synchronisieren.
  • Führt eine externe Synchronisierung durch, um die physischen NIC-Uhren aller U4-Instanz-Hostserver mit der koordinierten Weltzeit (UTC) zu synchronisieren.

Da die physischen NIC-Uhren von Hostservern, auf denen U4-Instanzen ausgeführt werden, automatisch von Firefly synchronisiert werden, können Sie die genaue Zeit für Ihre Instanz konfigurieren, indem Sie die Systemuhr der Instanz mit der physischen NIC-Uhr des Hostservers synchronisieren.

Weitere Informationen zu Firefly finden Sie im Google Cloud Blogpost Understanding the Firefly clock synchronization protocol.

Hinweis

Bevor Sie die genaue Zeit für U4-Compute Engine-Instanzen konfigurieren, müssen Sie die folgenden Anforderungen erfüllen.

U4-Instanz erstellen

Erstellen Sie eine U4-Compute Engine-Instanz, falls Sie dies noch nicht getan haben. Sehen Sie sich das Verfahren an, das Ihrem Anwendungsfall entspricht:

Achten Sie darauf, dass keine anderen Dienste zur Uhrensynchronisierung ausgeführt werden.

In den Verfahren auf dieser Seite wird chrony als empfohlener Client für die Zeitsynchronisierung verwendet. Bevor Sie beginnen, prüfen Sie, ob auf Ihrer Instanz andere Zeitsynchronisierungsdienste wie ntpd, systemd-timesyncd oder phc2sys ausgeführt werden. Unerwartete Interaktionen mit diesen Diensten können Fehler in Ihrer chrony-Konfiguration verursachen.

In chrony Version 4.7 und höher können Sie das chronyd-Warnungslog für andere Uhrensynchronisierungsdienste mit dem folgenden Befehl prüfen:

journalctl -u chronyd

Wenn ein anderer Dienst zur Synchronisierung der Uhrzeit ausgeführt wird, enthält die Ausgabe eine Warnmeldung wie die folgende: System clock interference detected (another NTP client?).

Namen von Netzwerkschnittstellen abrufen

Rufen Sie die Namen der virtuellen Netzwerkschnittstellen (vNICs) Ihrer Instanz ab, die vom Gastbetriebssystem zugewiesen wurden. Während Google Cloud Namen wie nic0 und nic1 verwendet, ist das Namensformat des Gastbetriebssystems anders, z. B. enp22s0f0 und ens8f0.

Führen Sie den folgenden Befehl aus, um vNIC-Namen in der richtigen Reihenfolge aufzulisten:

find /sys/class/net -type l -not -lname '*virtual*' -printf '%l %f\n' | sort | awk '{print $2}'

Konfigurieren, dass chrony erst geladen wird, wenn die Netzwerktreiber stabil sind

In einigen Fällen lädt systemd möglicherweise chrony, bevor die Netzwerkschnittstellentreiber initialisiert wurden. Dies kann dazu führen, dass chrony nicht gestartet wird, weil das PTP-Hardwareuhr-Gerät (PHC) nicht initialisiert werden kann.

Um das oben genannte Problem zu vermeiden, überschreiben Sie die systemd-Gerätedatei von chrony, damit gewartet wird, bis PHC-Geräte bereit sind. Gehen Sie dazu so vor: Wenn Sie DPDK auf einer U4C-Instanz verwenden, wählen Sie den Tab DPDK-Konfiguration aus.

Standardkonfiguration

  1. Führen Sie den Bearbeitungsbefehl aus:

    systemctl edit chronyd
    
  2. Fügen Sie die Überschreibung hinzu, die Ihrem Instanztyp entspricht:

    • Für U4P- und U4C-Instanzen:

      [Unit]
      After=dev-ptp0.device dev-ptp1.device dev-ptp2.device
      Requires=dev-ptp0.device dev-ptp1.device dev-ptp2.device
      
    • Für U4S-Instanzen:

      [Unit]
      After=dev-ptp0.device
      Requires=dev-ptp0.device
      
  3. Starten Sie den Dienst neu. Der zuvor ausgeführte Befehl systemctl edit hat den Daemon automatisch neu geladen. Wir empfehlen jedoch, den folgenden Befehl auszuführen, um sicherzustellen, dass chrony nach Ihren Änderungen ausgeführt wird.

    systemctl restart chronyd
    

DPDK-Konfiguration

  1. Wenn Sie DPDK auf einer U4C-Instanz verwenden, rufen Sie die Indexnummer des PHC-Geräts ab, das mit nic0 verknüpft ist.

    Da DPDK die ULL-Netzwerkschnittstellen (nic1 und nic2) an den Userspace bindet, ist nic0 die einzige Schnittstelle, die ein PTP-Gerät für den Kernel verfügbar macht.

    Führen Sie den folgenden Befehl aus und notieren Sie sich den Wert von PTP Hardware Clock:NUMBER für einen späteren Schritt.

    ethtool -T NIC0
    

    Ersetzen Sie NIC0 durch den Namen der nic0-Schnittstelle, z. B. enp22s0f0.

  2. Führen Sie den Bearbeitungsbefehl aus:

    systemctl edit chronyd
    
  3. Fügen Sie die folgende Überschreibung hinzu:

    [Unit]
    After=dev-ptpNUMBER.device
    Requires=dev-ptpNUMBER.device
    

    Ersetzen Sie NUMBER durch die Indexnummer des PHC-Geräts, die Sie in Schritt 1 abgerufen haben.

  4. Starten Sie den Dienst neu. Der zuvor ausgeführte Befehl systemctl edit hat den Daemon automatisch neu geladen. Wir empfehlen jedoch, den folgenden Befehl auszuführen, um sicherzustellen, dass chrony nach Ihren Änderungen ausgeführt wird.

    systemctl restart chronyd
    

chrony für die Verwendung der mit Firefly synchronisierten physischen NIC-Uhr konfigurieren

In diesem Abschnitt wird beschrieben, wie Sie chrony konfigurieren, um die Systemuhr Ihrer Instanz mit der physischen NIC-Uhr auf dem Hostserver Ihrer Instanz zu synchronisieren, die bereits von Firefly synchronisiert wird.

Die virtuellen Netzwerkschnittstellen (vNICs) Ihrer U4-Instanz, wie im Gastbetriebssystem dargestellt (z. B. enp22s0f0), werden den physischen NICs auf dem Hostserver der Instanz zugeordnet. Eine bestimmte vNIC kann über das entsprechende PTP-Hardwareuhr-Gerät (PHC) auf die physische NIC-Uhr zugreifen:

  • PHC-Gerätenamen in Linux haben das folgende Format: /dev/ptpNUMBER, wobei NUMBER vom Linux-Kernel entsprechend der Initialisierungsreihenfolge des Geräts bestimmt wird. Beispiele für PHC-Gerätenamen: /dev/ptp0, /dev/ptp1, /dev/ptp2.

  • Wenn Sie eine physische NIC-Uhr als Quelle für die Synchronisierung angeben möchten, muss die chrony-Konfiguration das entsprechende PHC-Gerät verwenden oder auflösen.

In den folgenden Abschnitten finden Sie Beispiele für die Konfiguration von chrony gemäß den oben genannten Anforderungen. Sehen Sie sich den Abschnitt an, der Ihrem Instanztyp und Ihrer chrony-Version entspricht:

chrony 4.7 und höher auf U4P- und U4C-Instanzen konfigurieren

chrony Version 4.7 und höher unterstützt die Angabe eines vNIC-Namens als Taktquelle und löst ihn automatisch in das entsprechende PTP-Hardwareuhrgerät (PHC) auf, das die physische NIC-Uhr darstellt.

Standardkonfiguration

So konfigurieren Sie chrony Version 4.7 und höher auf einer U4P- oder U4C-Instanz:

  1. Fügen Sie der chrony-Konfigurationsdatei /etc/chrony.conf Folgendes hinzu. Die Datei darf nur die folgende Konfiguration enthalten. Achten Sie darauf, dass Sie alle vorhandenen Inhalte der Datei entfernen oder überschreiben.

    # Record the rate at which the system clock gains/loses time.
    driftfile /var/lib/chrony/drift
    
    # Allow the system clock to be stepped in the first three updates
    # if its offset is larger than 1 micro-second.
    makestep 0.0000001 3
    
    # Specify directory for log files.
    logdir /var/log/chrony
    
    # Select which information is logged.
    log measurements statistics tracking refclocks
    
    # U4 Compute Engine instance clocks are 200ppb accurate
    maxclockerror 0.2
    
    # Configure all clocks for tracking, but select only one of them as source.
    refclock PHC NIC0:nocrossts poll -1 noselect
    refclock PHC NIC1:nocrossts poll -1
    refclock PHC NIC2:nocrossts poll -1 noselect
    
    # The following lines opportunistically enable Precision Time Measurement (PTM) based clock synchronization.
    # Note that PTM can potentially result in a (constant) clock skew of up to 700 nanoseconds
    # which is not accounted for in chrony's accuracy metrics.
    refclock PHC NIC0 poll -1 noselect
    refclock PHC NIC1 poll -1 noselect
    refclock PHC NIC2 poll -1 noselect

    Ersetzen Sie NIC0, NIC1 und NIC2 durch die entsprechenden Namen, die Sie zuvor erhalten haben. Bei Bedarf finden Sie weitere Informationen unter Namen von Netzwerkschnittstellen abrufen.

  2. Starten Sie chrony mit dem folgenden Befehl neu, um die Konfiguration anzuwenden:

    systemctl restart chronyd
    

chrony protokolliert Statistiken zur Uhrensynchronisierung in /var/log/chrony/tracking.log. Als Zeitquelle wird die PTP-Hardwareuhr von NIC1 verwendet.

DPDK-Konfiguration

So konfigurieren Sie chrony Version 4.7 und höher auf einer U4C-Instanz, die DPDK verwendet:

  1. Fügen Sie der chrony-Konfigurationsdatei /etc/chrony.conf Folgendes hinzu. Die Datei darf nur die folgende Konfiguration enthalten. Achten Sie darauf, dass Sie alle bereits vorhandenen Inhalte der Datei entfernen oder überschreiben.

    # Record the rate at which the system clock gains/loses time.
    driftfile /var/lib/chrony/drift
    
    # Allow the system clock to be stepped in the first three updates
    # if its offset is larger than 1 micro-second.
    makestep 0.0000001 3
    
    # Specify directory for log files.
    logdir /var/log/chrony
    
    # Select which information is logged.
    log measurements statistics tracking refclocks
    
    # U4 Compute Engine instance clocks are 200ppb accurate
    maxclockerror 0.2
    
    # Configure the nic0 interface clock for tracking and select it as the source.
    refclock PHC NIC0:nocrossts poll -1
    
    # The following lines opportunistically enable Precision Time Measurement (PTM) based clock synchronization.
    # Note that PTM can potentially result in a (constant) clock skew of up to 700 nanoseconds
    # which is not accounted for in chrony's accuracy metrics.
    refclock PHC NIC0 poll -1 noselect

    Ersetzen Sie NIC0 durch den entsprechenden Namen, den Sie zuvor erhalten haben. Bei Bedarf finden Sie weitere Informationen unter Namen von Netzwerkschnittstellen abrufen.

  2. Starten Sie chrony mit dem folgenden Befehl neu, um die Konfiguration anzuwenden:

    systemctl restart chronyd
    

chrony protokolliert Statistiken zur Uhrensynchronisierung in /var/log/chrony/tracking.log. Als Zeitquelle wird die PTP-Hardwareuhr von NIC0 verwendet.

chrony 4.6.1 und früher auf U4P- und U4C-Instanzen konfigurieren

Für chrony-Versionen 4.6.1 und früher müssen Sie den Gerätenamen der PTP-Hardwareuhr (PHC) manuell in Ihrer Konfigurationsdatei angeben.

Standardkonfiguration

So konfigurieren Sie chrony-Versionen 4.6.1 und früher auf einer U4P- oder U4C-Instanz:

  1. Rufen Sie die Indexnummer des PHC-Geräts ab, das einer vNIC zugeordnet ist. Im folgenden Beispiel wird die erste vNIC verwendet.

    ethtool -T NIC0
    

    Ersetzen Sie NIC0 durch den entsprechenden Namen, den Sie zuvor erhalten haben, z. B. enp22s0f0. Weitere Informationen finden Sie unter Namen von Netzwerkschnittstellen abrufen.

    1. Prüfen Sie die Ausgabe auf PTP Hardware Clock:NUMBER.

      In diesem Beispiel wird PTP Hardware Clock: 1 ausgegeben, was /dev/ptp1 entspricht.

      Time stamping parameters for enp22s0f0:
      Capabilities:
            hardware-receive
            software-receive
            software-system-clock
            hardware-raw-clock
      PTP Hardware Clock: 1
      Hardware Transmit Timestamp Modes:
            off
      Hardware Receive Filter Modes:
            none
            all
      
  2. Fügen Sie der chrony-Konfigurationsdatei /etc/chrony.conf Folgendes hinzu. Die Datei darf nur die folgende Konfiguration enthalten. Achten Sie darauf, dass Sie alle vorhandenen Inhalte der Datei entfernen oder überschreiben.

    Die ethtool-Ausgabe im vorherigen Schritt hat gezeigt, dass enp22s0f0 /dev/ptp1 verwendet. Im folgenden Beispiel wird die Systemuhr mit der entsprechenden physischen NIC-Uhr für enp22s0f0 synchronisiert. Dazu wird Folgendes angegeben: refclock PHC /dev/ptp1:nocrossts poll -1.

    # Record the rate at which the system clock gains/loses time.
    driftfile /var/lib/chrony/drift
    
    # Allow the system clock to be stepped in the first three updates
    # if its offset is larger than 1 micro-second.
    makestep 0.0000001 3
    
    # Enable kernel synchronization of the real-time clock (RTC).
    rtcsync
    
    # Save NTS keys and cookies.
    ntsdumpdir /var/lib/chrony
    
    # Specify directory for log files.
    logdir /var/log/chrony
    
    # Select which information is logged.
    log measurements statistics tracking refclocks
    
    # U4 Compute Engine instance clocks are 200ppb accurate
    maxclockerror 0.2
    
    # Configure all clocks for tracking, but select only one of them as source.
    refclock PHC /dev/ptp0:nocrossts poll -1 noselect
    refclock PHC /dev/ptp1:nocrossts poll -1
    refclock PHC /dev/ptp2:nocrossts poll -1 noselect
    
    # The following lines opportunistically enable Precision Time Measurement (PTM) based clock synchronization.
    # Note that PTM can potentially result in a (constant) clock skew of up to 700 nanoseconds
    # which is not accounted for in chrony's accuracy metrics.
    refclock PHC /dev/ptp0 poll -1 noselect
    refclock PHC /dev/ptp1 poll -1 noselect
    refclock PHC /dev/ptp2 poll -1 noselect
  3. Führen Sie den folgenden Befehl aus, um die Konfiguration anzuwenden und chrony neu zu starten:

    systemctl restart chronyd
    

chrony protokolliert Statistiken zur Uhrensynchronisierung in /var/log/chrony/tracking.log und verwendet dabei die ausgewählte PTP-Hardwareuhr als Zeitquelle.

DPDK-Konfiguration

So konfigurieren Sie chrony-Versionen 4.6.1 und früher auf einer U4C-Instanz, die DPDK verwendet:

  1. Rufen Sie die Indexnummer des PHC-Geräts ab, das mit Ihrer vNIC nic0 verknüpft ist.

    ethtool -T NIC0
    

    Ersetzen Sie NIC0 durch den entsprechenden Namen, den Sie zuvor erhalten haben, z. B. enp22s0f0. Weitere Informationen finden Sie unter Namen von Netzwerkschnittstellen abrufen.

    1. Prüfen Sie die Ausgabe für PTP Hardware Clock:NUMBER.

      In diesem Beispiel wird PTP Hardware Clock: 0 ausgegeben, was /dev/ptp0 entspricht.

      Time stamping parameters for enp22s0f0:
      Capabilities:
            hardware-receive
            software-receive
            software-system-clock
            hardware-raw-clock
      PTP Hardware Clock: 0
      Hardware Transmit Timestamp Modes:
            off
      Hardware Receive Filter Modes:
            none
            all
      
  2. Fügen Sie der chrony-Konfigurationsdatei /etc/chrony.conf Folgendes hinzu. Die Datei darf nur die folgende Konfiguration enthalten. Achten Sie darauf, dass Sie alle bereits vorhandenen Inhalte der Datei entfernen oder überschreiben.

    Die ethtool-Ausgabe im vorherigen Schritt hat gezeigt, dass enp22s0f0 /dev/ptp0 verwendet. Im folgenden Beispiel wird die Systemuhr mit der entsprechenden physischen NIC-Uhr für enp22s0f0 synchronisiert. Dazu wird Folgendes angegeben: refclock PHC /dev/ptp0:nocrossts poll -1.

    # Record the rate at which the system clock gains/loses time.
    driftfile /var/lib/chrony/drift
    
    # Allow the system clock to be stepped in the first three updates
    # if its offset is larger than 1 micro-second.
    makestep 0.0000001 3
    
    # Enable kernel synchronization of the real-time clock (RTC).
    rtcsync
    
    # Save NTS keys and cookies.
    ntsdumpdir /var/lib/chrony
    
    # Specify directory for log files.
    logdir /var/log/chrony
    
    # Select which information is logged.
    log measurements statistics tracking refclocks
    
    # U4 Compute Engine instance clocks are 200ppb accurate
    maxclockerror 0.2
    
    # Configure the nic0 interface clock for tracking and select it as the source.
    # If nic0 uses a PHC index other than 0 (such as /dev/ptp1), replace /dev/ptp0.
    refclock PHC /dev/ptp0:nocrossts poll -1
    
    # The following lines opportunistically enable Precision Time Measurement (PTM) based clock synchronization.
    # Note that PTM can potentially result in a (constant) clock skew of up to 700 nanoseconds
    # which is not accounted for in chrony's accuracy metrics.
    refclock PHC /dev/ptp0 poll -1 noselect
  3. Führen Sie den folgenden Befehl aus, um die Konfiguration anzuwenden und chrony neu zu starten:

    systemctl restart chronyd
    

chrony protokolliert Statistiken zur Uhrensynchronisierung in /var/log/chrony/tracking.log und verwendet dabei die ausgewählte PTP-Hardwareuhr als Zeitquelle.

chrony 4.7 und höher auf U4S-Instanzen konfigurieren

Wir empfehlen, für U4S-Instanzen chrony-Versionen ab 4.7 zu verwenden. Die Verwendung früherer Versionen kann zu häufigen Fehlern führen, da das Compute Engine-Gerät zur Uhrensynchronisierung für VM-Instanzen (ptp_kvm) Änderungen an den Indexnummern von PTP-Hardwareuhrgeräten (PHC) verursachen kann.

Diese Beispielkonfiguration für U4S-Instanzen ähnelt der für U4P- und U4C-Instanzen, weist jedoch die folgenden Unterschiede auf:

  • Dieses Beispiel enthält eine einzelne vNIC. Eine U4S-Instanz kann mehrere vNICs haben, aber alle vNICs werden von derselben physischen NIC unterstützt und greifen auf dieselbe physische NIC-Uhr zu.
  • Genaue Zeitmessung (Precision Time Measurement, PTM) ist nicht verfügbar.

So konfigurieren Sie chrony-Versionen 4.7 und höher auf einer U4S-Instanz:

  1. Fügen Sie der chrony-Konfigurationsdatei /etc/chrony.conf Folgendes hinzu. Die Datei darf nur die folgende Konfiguration enthalten. Achten Sie darauf, dass Sie alle bereits vorhandenen Inhalte der Datei entfernen oder überschreiben.

    # Record the rate at which the system clock gains/loses time.
    driftfile /var/lib/chrony/drift
    
    # Allow the system clock to be stepped in the first three updates
    # if its offset is larger than 1 micro-second.
    makestep 0.0000001 3
    
    # Specify directory for log files.
    logdir /var/log/chrony
    
    # Select which information is logged.
    log measurements statistics tracking refclocks
    
    # U4 Compute Engine instance clocks are 200ppb accurate
    maxclockerror 0.2
    
    # Configure all clocks for tracking, but select only one of them as source.
    refclock PHC NIC0:nocrossts poll -1

    Ersetzen Sie NIC0 durch den entsprechenden Namen, den Sie zuvor erhalten haben, z. B. enp22s0f0. Weitere Informationen finden Sie unter Namen von Netzwerkschnittstellen abrufen.

  2. Starten Sie chrony mit dem folgenden Befehl neu, um die Konfiguration anzuwenden:

    systemctl restart chronyd
    

    chrony protokolliert Statistiken zur Uhrensynchronisierung in /var/log/chrony/tracking.log und verwendet die PTP-Hardwareuhr von NIC0 als Zeitquelle.

chrony-Konfiguration prüfen

Führen Sie den folgenden Befehl aus, um zu prüfen, ob chrony richtig konfiguriert ist:

chronyc sourcestats

Eine erfolgreiche Konfiguration führt zu einer Ausgabe, die in etwa so aussieht:

Name/IP Address             NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
PHC0                        5   3     2     -0.002      0.014     +9ns     2ns
PHC1                        5   3     2     -0.003      0.007     -0ns     1ns
PHC2                        5   3     2     -0.004      0.016    +33ns     2ns
PHC3                        5   5     2     +0.002      0.078   +135ns    10ns
PHC4                        5   3     2     -0.005      0.077   +130ns     9ns
PHC5                        5   5     2     -0.006      0.131   +123ns    16ns

Wenn der Befehl eine unerwartete Ausgabe zurückgibt, lesen Sie den Abschnitt Fehlerbehebung.

chrony-Konfiguration ändern

Wenn Sie ändern möchten, mit welcher physischen NIC die Systemuhr Ihrer Instanz synchronisiert werden soll, können Sie Ihre Konfiguration so aktualisieren:

  1. Entfernen Sie noselect aus der Zeile mit dem vNIC-Namen, für den Sie die entsprechende physische NIC-Uhr verwenden möchten.
  2. Fügen Sie noselect der Zeile hinzu, die den vNIC-Namen enthält, für den Sie die entsprechende physische NIC-Uhr nicht mehr verwenden möchten.
  3. Wenden Sie die neue Konfiguration an, indem Sie chronyd neu starten: systemctl restart chronyd.

Zeitsynchronisierung überwachen

In diesem Abschnitt werden die Messwerte beschrieben, die für die Zeitsynchronisierung verfügbar sind, und wie Sie sie verwenden, um die Genauigkeit der Zeitsynchronisierung zu überwachen.

Verfügbare Messwerte für die Zeitsynchronisierung

Sie können die folgenden Messwerte verwenden, um die Zeitsynchronisierung zu überwachen:

Messung Verfügbarer Messwert und Beschreibung
Instanzsystemuhr zur physischen NIC-Uhr logging.googleapis.com/user/phc-clock-max-error

Dieser Messwert gibt an, wie genau die Systemuhr der Instanz mit der Uhr der physischen NIC auf dem Hostserver synchronisiert ist.

Sie müssen diesen Messwert konfigurieren, indem Sie ihn über den Ops-Agent erfassen und einen logbasierten Messwert erstellen, wie unter Benutzerdefinierten Messwert für die Systemuhr der Instanz konfigurieren beschrieben. Dadurch wird auch ein benutzerdefiniertes Dashboard erstellt. Außerdem können Sie diesen Messwert in den Verfahren verwenden, die unter Cloud Monitoring-Messwerte verwenden beschrieben sind.

Physische NIC-Uhr zu UTC compute.googleapis.com/instance/time/firefly_utc_traceable_uncertainty

Dieser Messwert stellt die maximale Fehlergrenze der physischen NIC-Uhr im Vergleich zur tatsächlichen UTC-Zeit dar. Sie wird automatisch an Cloud Monitoring gemeldet.

Sie können diesen Messwert aufrufen, Benachrichtigungsrichtlinien definieren und benutzerdefinierte Dashboards erstellen, wie unter Cloud Monitoring-Messwerte verwenden beschrieben. Dieser Messwert ist auch im Dashboard enthalten, das vom Script in Benutzerdefinierten Messwert für die Systemuhr der Instanz konfigurieren erstellt wurde.

Allgemeiner Zustand der physischen NIC-Uhr compute.googleapis.com/instance/time/firefly_nic_sync_healthy

Dieser boolesche Messwert gibt den allgemeinen Zustand der physischen NIC-Uhr an, einschließlich der Synchronisierung von NIC zu NIC und von NIC zu UTC. Sie wird automatisch an Cloud Monitoring gemeldet.

Sie können diesen Messwert aufrufen, Benachrichtigungsrichtlinien definieren und benutzerdefinierte Dashboards erstellen, wie unter Cloud Monitoring-Messwerte verwenden beschrieben.

Informationen zur Aufbewahrungsdauer von Messwertdaten in Cloud Monitoring finden Sie unter Datenaufbewahrung in Kontingente und Limits für Cloud Monitoring. Informationen zum Exportieren von Messwerten für die Langzeitanalyse finden Sie in der Dokumentation zum Cloud Architecture Center unter Cloud Monitoring-Messwerte exportieren.

Benutzerdefinierten Messwert für die Systemuhr der Instanz konfigurieren

In diesem Abschnitt finden Sie eine Beispielkonfiguration für das Monitoring, die Folgendes bewirkt:

  • Konfiguriert den Ops-Agent so, dass das Log von chrony für die Synchronisierungsgenauigkeit aus Ihrer Instanz erfasst wird.
  • Konfiguriert Cloud Monitoring so, dass das entsprechende Log von allen Instanzen in Ihrem Projekt als logbasierter Messwert aufgenommen wird.

Google Cloud Ops-Agent auf Ihrer Instanz konfigurieren

So konfigurieren Sie den Ops-Agent zum Erfassen des für die Überwachung erforderlichen Messwerts:

  1. Installieren Sie den Ops-Agent auf Ihrer Instanz, falls noch nicht geschehen.

  2. Fügen Sie der Datei /etc/google-cloud-ops-agent/config.yaml die folgende Konfiguration hinzu:

    logging:
      receivers:
        chrony_tracking_receiver:
          type: files
          include_paths:
            - /var/log/chrony/tracking.log
      processors:
        chrony_tracking_processor:
          type: parse_regex
          regex: "^.*PHC.*  (?<max_error>[-\d\.eE]+)$"
      service:
        pipelines:
          chrony_tracking_pipeline:
            receivers: [chrony_tracking_receiver]
            processors: [chrony_tracking_processor]
  3. Starten Sie den Ops-Agent mit dem folgenden Befehl neu:

    systemctl restart google-cloud-ops-agent
    

Logbasierten Messwert und Dashboard in Ihrem Projekt konfigurieren

Führen Sie das folgende Setupscript für Logging und Dashboard aus, um die Zeitabgleichsüberwachung für die Instanzen in Ihrem Projekt zu konfigurieren. Mit diesem Skript können Sie die folgenden Aufgaben ausführen:

  • Es legt die entsprechenden Berechtigungen für das Dienstkonto fest, das mit dem Projekt Ihrer Instanz verknüpft ist. Das Script geht davon aus, dass das für die Instanzen verwendete Dienstkonto das Standarddienstkonto für das Projekt ist. Ersetzen Sie SERVICE_ACCOUNT_EMAIL bei Bedarf durch einen anderen Wert.
  • Es wird ein logbasierter Messwert erstellt, der die Genauigkeit der Zeitsynchronisierung zwischen der Systemuhr der Instanz und der physischen NIC-Uhr auf dem Hostserver der Instanz misst.
  • Es wird ein Dashboard erstellt, das die Genauigkeit der einzelnen und kombinierten Zeitsynchronisierung für Ihre Instanzen basierend auf dem benutzerdefinierten logbasierten Messwert und den verfügbaren Firefly-Messwerten anzeigt.

Führen Sie das folgende Script aus, um die vorherigen Aufgaben auszuführen. Nachdem das Script ausgeführt wurde, können Sie im erstellten Dashboard die Daten zur Taktgenauigkeit für die Instanzen Ihres Projekts ansehen.

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: setup_logging.sh <project_id>" >&2
    exit 1
fi

PROJECT_ID="$1"
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID  --format="value(projectNumber)")
SERVICE_ACCOUNT_EMAIL=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com

# Grant permissions:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --role="roles/compute.instanceAdmin"

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --role="roles/monitoring.metricWriter"

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --role="roles/logging.logWriter"

# Configure log-based metric
METRIC_CONF='
{
  "name": "phc-clock-max-error",
  "description": "Maximum error of the VM clock from the host clock exposed by ptp_kvm",
  "filter": "logName=~\".*/logs/chrony_tracking_receiver\"",
  "metricDescriptor": {
    "metricKind": "DELTA",
    "valueType": "DISTRIBUTION",
    "unit": "s",
    "labels": [ { "key": "instance_id", "valueType": "STRING",
          "description": "Instance ID for the source instance" } ]
  },
  "valueExtractor": "REGEXP_EXTRACT(jsonPayload.max_error, \"(.*)\")",
  "bucketOptions": {
    "explicitBuckets": {
      "bounds": [
        0.0, 1.0E-6, 5.0E-6, 1.0E-5, 1.0E-4, 0.001, 0.01, 0.1, 1.0
      ]
    }
  },
  "labelExtractors": {
    "instance_id": "REGEXP_EXTRACT(resource.labels.instance_id, \"(.*)\")"
  }
}
'
echo "$METRIC_CONF" > /tmp/clock-error-metric.json
gcloud logging metrics create --project=${PROJECT_ID} phc-clock-max-error --config-from-file=/tmp/clock-error-metric.json

# Create a dashboard plotting the clock accuracy

DASHBOARD_CONF='
{
  "displayName": "Clock Accuracy",
  "dashboardFilters": [],
  "description": "",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 19,
        "width": 48,
        "widget": {
          "title": "Combined Accuracy With Threshold",
          "id": "",
          "xyChart": {
            "chartOptions": {
              "displayHorizontal": false,
              "mode": "COLOR",
              "showLegend": false
            },
            "dataSets": [
              {
                "breakdowns": [],
                "dimensions": [],
                "legendTemplate": "",
                "measures": [],
                "plotType": "LINE",
                "sort": [],
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "outputFullDuration": false,
                  "prometheusQuery": "(\n  histogram_quantile(\n    1, \n    sum by (le, instance_id) (\n      increase({\"__name__\"=\"logging.googleapis.com/user/phc-clock-max-error_bucket\", monitored_resource=\"gce_instance\"}[${__interval}])\n    )\n  ) * 1e9\n) \n+ on(instance_id) \nmax by (instance_id) (\n  max_over_time({\"__name__\"=\"compute.googleapis.com/instance/time/firefly_utc_traceable_uncertainty\", monitored_resource=\"gce_instance\"}[${__interval}])\n)",
                  "unitOverride": "ns"
                }
              }
            ],
            "thresholds": [
              {
                "color": "COLOR_UNSPECIFIED",
                "direction": "DIRECTION_UNSPECIFIED",
                "label": "",
                "targetAxis": "Y1",
                "value": 30000
              }
            ],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        }
      },
      {
        "yPos": 19,
        "height": 16,
        "width": 24,
        "widget": {
          "title": "NIC-UTC sync accuracy",
          "id": "",
          "xyChart": {
            "chartOptions": {
              "displayHorizontal": false,
              "mode": "COLOR",
              "showLegend": false
            },
            "dataSets": [
              {
                "breakdowns": [],
                "dimensions": [],
                "legendTemplate": "",
                "measures": [],
                "minAlignmentPeriod": "60s",
                "plotType": "LINE",
                "sort": [],
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "outputFullDuration": false,
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "crossSeriesReducer": "REDUCE_SUM",
                      "groupByFields": [
                        "metric.label.\"instance_name\"",
                        "metric.label.\"nic_id\"",
                        "resource.label.\"instance_id\""
                      ],
                      "perSeriesAligner": "ALIGN_MEAN"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/time/firefly_utc_traceable_uncertainty\" resource.type=\"gce_instance\""
                  },
                  "unitOverride": ""
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        }
      },
      {
        "yPos": 19,
        "xPos": 24,
        "height": 16,
        "width": 24,
        "widget": {
          "title": "VM-NIC sync Accuracy",
          "id": "",
          "xyChart": {
            "chartOptions": {
              "displayHorizontal": false,
              "mode": "COLOR",
              "showLegend": false
            },
            "dataSets": [
              {
                "breakdowns": [],
                "dimensions": [],
                "legendTemplate": "",
                "measures": [],
                "minAlignmentPeriod": "60s",
                "plotType": "LINE",
                "sort": [],
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "outputFullDuration": false,
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "crossSeriesReducer": "REDUCE_PERCENTILE_99",
                      "groupByFields": [
                        "metric.label.\"instance_id\""
                      ],
                      "perSeriesAligner": "ALIGN_DELTA"
                    },
                    "filter": "metric.type=\"logging.googleapis.com/user/phc-clock-max-error\""
                  },
                  "unitOverride": ""
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        }
      }
    ]
  }
}
'

echo "$DASHBOARD_CONF" > /tmp/metrics-dashboard.json

gcloud monitoring dashboards create --project=${PROJECT_ID} --config-from-file=/tmp/metrics-dashboard.json

Cloud Monitoring-Messwerte verwenden

In den folgenden Abschnitten wird beschrieben, wie Sie Cloud Monitoring-Messwerte verwenden. In den folgenden Abschnitten finden Sie Informationen zu den einzelnen verfügbaren Messwerten für die Zeitsynchronisierung.

Zusätzlich zur Google Cloud Console können Sie über die Monitoring API benutzerdefinierte Dashboards erstellen, Benachrichtigungen einrichten und Messwerte abrufen.

Messwerte in Monitoring ansehen

In diesem Abschnitt wird beschrieben, wie Sie Messwerte in Monitoring ansehen.

Console

So rufen Sie mit dem Metrics Explorer die Messwerte für eine überwachte Ressource auf:

  1. Rufen Sie in der Google Cloud Console das auf der Seite des Metrics Explorer auf:

    Zu Metrics Explorer

    Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Monitoring ist.

  2. Wählen Sie in der Symbolleiste der Google Cloud Console Ihr Projekt von Google Cloud aus. Wählen Sie für App Hub-Konfigurationen das App Hub-Hostprojekt oder das Verwaltungsprojekt des für Apps aktivierten Ordners aus.
  3. Maximieren Sie im Element Messwert das Menü Messwert auswählen, geben Sie VM instance in die Filterleiste ein und wählen Sie dann über die Untermenüs einen bestimmten Ressourcentyp und Messwert aus:
    1. Wählen Sie im Menü Aktive Ressourcen die Option VM-Instanz aus.
    2. Einen Messwert wählen Sie in den Menüs Aktive Messwertkategorien und Aktive Messwerte aus. Eine Liste der verfügbaren Messwerte finden Sie unter Verfügbare Messwerte für die Zeitsynchronisierung.
    3. Klicken Sie auf Übernehmen.
  4. Verwenden Sie das Element Filter, um Filter hinzuzufügen, mit denen Zeitreihen aus den Abfrageergebnissen entfernt werden.

  5. Konfigurieren Sie, wie die Daten angezeigt werden. Standardmäßig werden die Messwerte aus allen Instanzen und physischen NICs aggregiert. So rufen Sie Messwerte pro NIC und pro Instanz auf: Wählen Sie im Element Aggregation die Option Nicht aggregiert aus.

    Weitere Informationen zum Konfigurieren eines Diagramms finden Sie unter Messwerte bei Verwendung von Metrics Explorer auswählen.

Benachrichtigungsrichtlinien definieren

In diesem Abschnitt wird beschrieben, wie Sie Benachrichtigungsrichtlinien definieren.

Wenn Sie konfigurieren, wie Monitoring eine Bedingung auswertet, wenn keine Daten mehr eingehen, empfehlen wir die Option Fehlende Datenpunkte werden als Werte behandelt, die gegen die Richtlinienbedingung verstoßen, da so auch unbemerkte Datenverluste erfasst werden. Diese Einstellung führt jedoch zu falsch positiven Benachrichtigungen, wenn eine Instanz gelöscht wird.

Console

Sie können Benachrichtigungsrichtlinien erstellen, um Messwerte zu beobachten und sich informieren zu lassen, wenn diese gegen eine Bedingung verstoßen.

  1. Rufen Sie in der Google Cloud Console die Seite  Benachrichtigungen auf:

    Zu Benachrichtigungen

    Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Monitoring ist.

  2. Wenn Sie keine Benachrichtigungskanäle erstellt haben und Benachrichtigungen erhalten möchten, klicken Sie auf Benachrichtigungskanäle bearbeiten und fügen Sie Benachrichtigungskanäle hinzu. Kehren Sie nach dem Hinzufügen der Kanäle zur Seite Benachrichtigungen zurück.
  3. Klicken Sie auf der Seite Benachrichtigungen auf Richtlinie erstellen.
  4. Maximieren Sie zum Auswählen des Messwerts das Menü Messwert auswählen und gehen Sie dann so vor:
    1. Um das Menü auf relevante Einträge zu beschränken, geben Sie in die Filterleiste VM Instance ein. Wenn nach dem Filtern des Menüs keine Ergebnisse angezeigt werden, deaktivieren Sie die Option Nur aktive Ressourcen und Messwerte anzeigen.
    2. Wählen Sie als Ressourcentyp VM-Instanz aus.
    3. Wählen Sie als Messwertkategorie Instanz aus.
    4. Wählen Sie als Messwert einen Messwert aus der Liste unter Verfügbare Messwerte für die Zeitsynchronisierung aus.
    5. Klicken Sie auf Anwenden.
  5. Klicken Sie auf Weiter.
  6. Die Einstellungen auf der Seite Benachrichtigungstrigger konfigurieren bestimmen, wann die Benachrichtigung ausgelöst wird. Wählen Sie einen Bedingungstyp aus, und geben Sie ggf. einen Schwellenwert an. Weitere Informationen finden Sie unter Benachrichtigungsrichtlinien mit Messwertschwellen erstellen.
  7. Klicken Sie auf Weiter.
  8. Optional: Klicken Sie auf Benachrichtigungskanäle, um Benachrichtigungen zu Ihrer Benachrichtigungsrichtlinie hinzuzufügen. Wählen Sie im Dialogfeld einen oder mehrere Benachrichtigungskanäle aus dem Menü aus, und klicken Sie dann auf OK.
  9. Optional: Aktualisieren Sie die Dauer bis zur automatischen Schließung von Benachrichtigungen. Dieses Feld bestimmt, wann Monitoring Benachrichtigungen ohne Messwertdaten schließt.
  10. Optional: Klicken Sie auf Dokumentation, und geben Sie alle Informationen an, die in einer Benachrichtigung angezeigt werden sollen.
  11. Klicken Sie auf Benachrichtigungsname, und geben Sie einen Namen für die Benachrichtigungsrichtlinie ein.
  12. Klicken Sie auf Richtlinie erstellen.
Weitere Informationen finden Sie unter Benachrichtigungen.

Benutzerdefinierte Monitoring-Dashboards erstellen

In diesem Abschnitt wird beschrieben, wie Sie benutzerdefinierte Dashboards erstellen. Ein konkretes Beispiel mit einer PromQL-Abfrage finden Sie unter Beispiel: Benutzerdefiniertes Dashboard erstellen, in dem Genauigkeitsmesswerte kombiniert werden.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite Dashboards :

    Zu Dashboards

    Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Monitoring ist.

  2. Klicken Sie auf Dashboard erstellen
  3. Optional: Aktualisieren Sie den Dashboard-Titel mit einem aussagekräftigen Namen für Ihr Dashboard.
  4. Klicken Sie für jedes Widget, das Sie dem Dashboard hinzufügen möchten, auf Widget hinzufügen, füllen Sie das Dialogfeld aus und wählen Sie dann Übernehmen aus.

    Weitere Informationen zum Hinzufügen von Widgets finden Sie auf den folgenden Seiten:

Beispiel: Benutzerdefiniertes Dashboard erstellen, in dem Genauigkeitsmesswerte kombiniert werden

Mit Monitoring können Sie benutzerdefinierte Dashboards erstellen. In Dashboards können alle verfügbaren Messwerte für die Zeitsynchronisierung verwendet werden.

Dieser Abschnitt enthält eine PromQL-Beispielabfrage, die Sie in ein benutzerdefiniertes Monitoring-Dashboard einfügen können. Weitere Informationen zu PromQL finden Sie unter PromQL für Cloud Monitoring.

Die Abfrage in diesem Abschnitt generiert einen Messwert für die Gesamtgenauigkeit, indem Folgendes kombiniert wird:

  • Der Messwert, der die Genauigkeit der Systemuhr der Instanz im Vergleich zur Uhr der physischen Netzwerkkarte (phc-clock-max-error) misst.
  • Der Messwert, mit dem die Genauigkeit der physischen NIC-Uhr im Vergleich zu UTC gemessen wird (firefly_utc_traceable_uncertainty)

Console

  1. Folgen Sie der Anleitung, um auf den Code-Editor für PromQL zuzugreifen.

  2. Geben Sie die folgende Abfrage in das Textfeld ein:

    (
      histogram_quantile(
       1,
       sum by (le, instance_id) (
         increase({"__name__"="logging.googleapis.com/user/phc-clock-max-error_bucket", monitored_resource="gce_instance"}[${__interval}])
       )
      ) * 1e9
    )
    + on(instance_id)
    max by (instance_id) (
     max_over_time({"__name__"="compute.googleapis.com/instance/time/firefly_utc_traceable_uncertainty", monitored_resource="gce_instance"}[${__interval}])
    )
    
  3. Klicken Sie auf Abfrage ausführen.

Weitere Informationen zur Verwendung des Editors und zum Speichern von Diagrammen finden Sie unter Code-Editor für PromQL verwenden.

Fehlerbehebung

Wenn Sie die chrony-Konfiguration prüfen, erhalten Sie möglicherweise eine unerwartete Ausgabe, z. B. die folgende Ausgabe, die darauf hinweist, dass chrony nicht gestartet werden konnte:

506 Cannot talk to daemon

Prüfen Sie zur Fehlerbehebung die journald-Logs auf chrony:

journalctl -u chronyd.service

Die folgende Beispielausgabe zeigt einen Fehler, der auftritt, wenn Sie eine Konfiguration anwenden, die für chrony 4.7 und höher vorgesehen ist, während auf Ihrer Instanz eine frühere Version von chrony installiert ist.

Feb 19 06:19:42 host-name systemd[1]: Starting chronyd.service - NTP client/server...
Feb 19 06:19:42 host-name chronyd[35160]: chronyd version 4.6.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG)
Feb 19 06:19:42 host-name chronyd[35160]: Setting filter length for PHC0 to 1
Feb 19 06:19:42 host-name chronyd[35160]: Could not open eth0 : No such file or directory
Feb 19 06:19:42 host-name chronyd[35160]: Fatal error : Could not open PHC
Feb 19 06:19:42 host-name chronyd[35157]: Could not open PHC
Feb 19 06:19:42 host-name systemd[1]: chronyd.service: Control process exited, code=exited, status=1/FAILURE
Feb 19 06:19:42 host-name systemd[1]: chronyd.service: Failed with result 'exit-code'.
Feb 19 06:19:42 host-name systemd[1]: Failed to start chronyd.service - NTP client/server.

Bekannte Probleme

Bei der Konfiguration der genauen Zeit für U4-Instanzen können die folgenden bekannten Probleme auftreten:

  • Genauigkeitsmesswerte werden nur für Netzwerkschnittstellen gemeldet, bei denen während der Lebensdauer der Instanz Traffic ungleich null beobachtet wurde. Um dieses Problem zu umgehen, können Sie nic0 als Taktquelle für die Synchronisierung verwenden, um die Telemetrie zu gewährleisten. Alternativ können Sie dafür sorgen, dass auf allen Netzwerkschnittstellen Traffic vorhanden ist.