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 wie Sie die Überwachung konfigurieren, damit Sie die Genauigkeit der Zeitsynchronisierung sehen können.

Funktionsweise

Google Cloud Die Ultra Low Latency (ULL) Solution verwendet das Firefly-Protokoll zur Taktzeit-Synchronisierung, um eine Synchronisierung auf Nanosekundenebene zu ermöglichen. Firefly führt automatisch folgende Schritte aus:

  • Führt eine interne Synchronisierung durch, um die Uhren der physischen Netzwerkschnittstellen (NICs) 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

Falls noch nicht geschehen, erstellen Sie eine U4 Compute Engine-Instanz. Sehen Sie sich die Vorgehensweise an, die Ihrem Anwendungsfall entspricht:

Sicherstellen, dass keine anderen Dienste zur Uhrzeitsynchronisierung ausgeführt werden

In den Verfahren auf dieser Seite wird chrony als empfohlener Client für die Uhrzeitsynchronisierung 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 nach anderen Diensten zur Uhrzeitsynchronisierung durchsuchen, indem Sie den folgenden Befehl ausführen:

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?).

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

In einigen Fällen lädt systemd möglicherweise chrony, bevor die Initialisierung der Treiber der Netzwerkschnittstelle abgeschlossen ist. Dies kann dazu führen, dass chrony nicht gestartet werden kann, da das PTP-Hardwareuhrgerät (PHC) nicht initialisiert werden kann.

Um das oben genannte Problem zu vermeiden, überschreiben Sie die systemd-Unit-Datei von chrony, um zu warten, bis PHC-Geräte bereit sind:

  1. Führen Sie den Bearbeitungsbefehl aus:

    systemctl edit chronyd
    
  2. Fügen Sie den Override hinzu, der 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 systemctl edit-Befehl, den Sie zuvor ausgeführt haben, hat den Daemon automatisch neu geladen. Wir empfehlen Ihnen jedoch, den folgenden Befehl auszuführen, um sicherzustellen, dass chrony nach den Änderungen ausgeführt wird.

    systemctl restart chronyd
    

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}'

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 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 darauf verweisen.

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

In chrony-Version 4.7 und höher kann ein vNIC-Name als Taktquelle angegeben werden. Er wird automatisch in das entsprechende PTP-Hardwaretaktgerät (PHC) aufgelöst, das den physischen NIC-Takt darstellt.

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

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

    # 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. Führen Sie den folgenden Befehl aus, um die Konfiguration anzuwenden und chrony neu zu starten:

    systemctl restart chronyd
    

    chrony protokolliert Statistiken zur Taktsynchronisierung in /var/log/chrony/tracking.log und verwendet dabei die PTP-Hardwareuhr von NIC1 als Zeitquelle.

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.

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. Bei Bedarf finden Sie weitere Informationen 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 Konfigurationsdatei chrony, /etc/chrony.conf, Folgendes hinzu. Die Datei darf nur die folgende Konfiguration enthalten. Entfernen oder überschreiben Sie alle vorhandenen Inhalte der Datei.

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

    # 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 Taktsynchronisierung in /var/log/chrony/tracking.log und verwendet dabei die PTP-Hardwareuhr von enp22s0f0 als Zeitquelle.

chrony 4.7 und höher auf U4S-Instanzen konfigurieren

Wir empfehlen, für U4S-Instanzen chrony-Versionen 4.7 und höher zu verwenden. Die Verwendung älterer Versionen kann zu häufigen Fehlern führen, da das Compute Engine-Gerät zur Zeitsynchronisierung 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 aber 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 Konfigurationsdatei chrony, /etc/chrony.conf, Folgendes hinzu. Die Datei darf nur die folgende Konfiguration enthalten. Entfernen oder überschreiben Sie alle vorhandenen Inhalte der Datei.

    # 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. Bei Bedarf finden Sie weitere Informationen unter Namen von Netzwerkschnittstellen abrufen.

  2. Führen Sie den folgenden Befehl aus, um die Konfiguration anzuwenden und chrony neu zu starten:

    systemctl restart chronyd
    

    chrony protokolliert Statistiken zur Taktsynchronisierung in /var/log/chrony/tracking.log und verwendet dabei 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, die den Namen der virtuellen NIC enthält, für die Sie die entsprechende physische NIC-Uhr verwenden möchten.
  2. Fügen Sie noselect der Zeile hinzu, die den Namen der virtuellen NIC enthält, für die Sie die Verwendung der entsprechenden physischen NIC-Uhr beenden 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 können, 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
Systemuhr der Instanz mit der Uhr der physischen NIC synchronisieren logging.googleapis.com/user/phc-clock-max-error

Dieser Messwert gibt die Genauigkeit der Synchronisierung der Systemuhr der Instanz mit der Uhr der physischen NIC auf dem Hostserver an.

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 unter Cloud Monitoring-Messwerte verwenden beschriebenen Verfahren verwenden.

Physische NIC-Uhr auf UTC umstellen 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 unter Benutzerdefinierten Messwert für die Systemuhr der Instanz konfigurieren erstellt wird.

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 zwischen NICs und zwischen NIC und 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, um das entsprechende Log von allen Instanzen in Ihrem Projekt als logbasierten Messwert aufzunehmen.

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 werden die entsprechenden Berechtigungen für das Dienstkonto festgelegt, 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.
  • Er erstellt einen logbasierten Messwert, 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, auf dem die individuelle und kombinierte Zeitabgleichsgenauigkeit für Ihre Instanzen basierend auf dem benutzerdefinierten logbasierten Messwert und den verfügbaren Firefly-Messwerten angezeigt wird.

Führen Sie das folgende Script aus, um die oben genannten 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 die Option 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 ein Beispiel für eine PromQL-Abfrage, die Sie in ein benutzerdefiniertes Monitoring-Dashboard einfügen können. Weitere Informationen zu PromQL finden Sie unter PromQL für Cloud Monitoring.

Mit der Abfrage in diesem Abschnitt wird ein Messwert für die Gesamtgenauigkeit generiert, indem die folgenden Elemente kombiniert werden:

  • Der Messwert, der die Genauigkeit der Systemuhr der Instanz im Vergleich zur physischen NIC-Uhr misst (phc-clock-max-error).
  • 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

Beim Überprüfen der chrony-Konfiguration erhalten Sie möglicherweise eine unerwartete Ausgabe, z. B. die folgende Ausgabe, die angibt, dass chrony nicht gestartet werden konnte:

506 Cannot talk to daemon

Zur Fehlerbehebung können Sie die journald-Logs für chrony prüfen:

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.