Compute Engine VM の正確な時刻を構成する

多くのソフトウェア システムは、イベントの順序を正確に扱うために、安定して一貫したシステム クロックに依存しています。システムログのタイムスタンプを使って、時刻同期を保ったり、問題発生時にデバッグしたりするためです。Compute Engine の仮想マシン(VM)インスタンスは、システム クロックとの同期を維持するためにネットワーク タイム プロトコル(NTP)を使用するように事前に構成されています。NTP は、時間同期のためのハードウェアとソフトウェアのセットです。正確な時刻同期や、その同期精度をモニタリングすることが目的の達成に重要である場合、VM のクロックをホスト側のクロックと同期させるために、chronyptp_kvm を使用して NTP の代わりに「正確な時刻」を構成できます。この構成は、サポートされている設定で 1 ミリ秒以内の精度を実現するように設計されています。

サポートされているマシンタイプ

正確な時刻は次のマシンタイプでサポートされています。

サポートされているオペレーティング システム

正確な時刻は次のオペレーティング システム(OS)でサポートされています。

OS バージョン 画像
CentOS Stream 9 centos-stream-9
Container-Optimized OS COS 105 LTS、COS 109 LTS、COS 113 LTS、COS 117 LTS cos-105-lts、cos-109-lts、cos-113-lts、cos-117-lts
Debian 11(Bullseye)、12(Bookworm) debian-11、debian-12
Fedora Cloud 39 fedora-cloud-39
RHEL 8、9 rhel-8-4-sap-ha、rhel-8-6-sap-ha、rhel-8-8-sap-ha、rhel-8-10-sap-ha、rhel-9、rhel-9-0-sap-ha、rhel-9-2-sap-ha、rhel-9-4-sap-ha
Rocky Linux 8、9 rocky-linux-8、rocky-linux-8-optimized-gcp、rocky-linux-9-optimized-gcp、rocky-linux-9-optimized-gcp
SLES 15 sles-15、sles-15-sp2-byos、sles-15-sp2-sap、sles-15-sp3-byos、sles-15-sp3-sap、sles-15-sp4-byos、sles-15-sp4-sap、sles-15-sp5-byos、sles-15-sp5-sap
Ubuntu 22.04 LTS(Jammy Jellyfish)、24.04 LTS(Noble Numbat) ubuntu-2204-lts、ubuntu-2404-lts-amd64
Ubuntu Pro 2004 ubuntu-pro-2004-lts、ubuntu-pro-2004-lts-amd64

サポートされているゾーン

正確な時刻は次のゾーンでサポートされています。

ゾーン 場所
europe-west1-b サンギスラン(ベルギー、ヨーロッパ)
europe-west1-c サンギスラン(ベルギー、ヨーロッパ)
europe-west2-b ロンドン(イギリス、ヨーロッパ)
europe-west3-a フランクフルト(ドイツ、ヨーロッパ)
us-central1-a アイオワ州カウンシル ブラフス(北米)
us-central1-b アイオワ州カウンシル ブラフス(北米)
us-central1-c アイオワ州カウンシル ブラフス(北米)
us-central1-f アイオワ州カウンシル ブラフス(北米)
us-east1-b サウスカロライナ州モンクスコーナー(北米)
us-east1-c サウスカロライナ州モンクスコーナー(北米)
us-east4-c バージニア州アッシュバーン(北米)
us-east5-a オハイオ州コロンバス(北米)
us-south1-a テキサス州ダラス(北米)
us-west1-b オレゴン州ダラス(北米)
us-west2-a カリフォルニア州ロサンゼルス(北米)
us-west3-a ユタ州ソルトレイクシティ(北米)

正確な時刻同期を構成する

プロジェクト内の VM に対して正確な時刻同期を構成するには、各 VM ごとに次のタスクを完了します。

  • ptp-kvm をタイムソースとして使用するように chrony を構成する。
  • データの収集と分析用に Google Cloud Ops エージェントを構成する。

両方のタスクを完了すると、プロジェクト内の VM に正確な時刻同期が設定されます。

VM を作成し、両方のタスクを完了して正確な時刻同期を構成するサンプル スクリプトについては、GitHub の VM 作成スクリプトをご覧ください。

ptp-kvm を使用するように chrony を構成する

ptp-kvm をタイムソースとして使用するように chrony を構成するには、各 Google Cloud プロジェクトの VM 内で次のスクリプトを実行します。

#!/bin/bash

# Install chrony as needed
if ! command -v chronyc &>/dev/null; then
    # Detect the package manager and install chrony
    if command -v apt &>/dev/null; then
        # Debian, Ubuntu, and derivatives
        echo "Detected apt. Installing chrony..."
        apt-get update
        apt-get install -y chrony
    elif command -v dnf &>/dev/null; then
        # Fedora, RHEL 8+, CentOS 8+
        echo "Detected dnf. Installing chrony..."
        dnf install -y chrony
    elif command -v yum &>/dev/null; then
        # RHEL 7, CentOS 7
        echo "Detected yum. Installing chrony..."
        yum install -y chrony
    elif command -v zypper &>/dev/null; then
        # openSUSE, SLES
        echo "Detected zypper. Installing chrony..."
        zypper install -y chrony
    else
        echo "Please install chrony manually."
        exit 1
    fi
fi

# Different distros place chrony config in
# different locations, detect this.
if [ -f "/etc/chrony/chrony.conf" ]; then
    CHRONY_CONF="/etc/chrony/chrony.conf"
else
    CHRONY_CONF="/etc/chrony.conf"
fi

# Load PTP-KVM clock for high-accuracy clock synchronization
# PTP-KVM allows the VM to read a cross time-stamp of a platform
# provided clock and the VM CPU Clock (CycleCounter), providing
# resiliency from network and virtualization variability when
# synchronizing the realtime/wall clock
/sbin/modprobe ptp_kvm
echo "ptp_kvm" >/etc/modules-load.d/ptp_kvm.conf

# NTP servers might indicate the wrong time due to chrony
# greatly reducing the polling frequency, resulting in
# overall negative impact to the clock synchronization
# achieved, especially after live migration events.
#
# We disable NTP servers to prevent these issues.
#
# Customers interested in monitoring the clock accuracy compared to NTP sources
# should run a second instance of chrony in a no-change mode to do so.

# Disable NTP servers:
sed -i '/^server /d' $CHRONY_CONF
sed -i '/^pool /d' $CHRONY_CONF
sed -i '/^include /d' $CHRONY_CONF

#Disable DHCP based NTP config:
sed -i 's/^NETCONFIG_NTP_POLICY="auto"/NETCONFIG_NTP_POLICY=""/' /etc/sysconfig/network/config
truncate -s 0 /var/run/netconfig/chrony.servers
echo PEERNTP=no | sudo tee -a /etc/sysconfig/network
service NetworkManager restart
systemctl disable systemd-timesyncd.service
timedatectl set-ntp false

# Configure PTP-KVM based HW refclock, with leap second smearing
# Google's clocks are doing leap second smearing, and therefor chrony shouldn't attempt to adjust
# the time received from PTP-KVM to adjust for leap seconds.
sed "s/^leapsectz/#leapsectz/" -i $CHRONY_CONF
echo "refclock PHC /dev/ptp_kvm poll -1" >>$CHRONY_CONF
# For extra debugging logging, uncomment the following line
#echo "log measurements statistics tracking" >> $CHRONY_CONF
# Enable chrony's clock accuracy tracking log,
# for monitoring and auditing.
echo "log tracking" >>$CHRONY_CONF

# Restart chrony (Ubuntu named it differently)
systemctl restart chronyd
systemctl restart chrony

VM に Google Cloud Ops エージェントを構成する

データの収集と分析用に Google Cloud Ops エージェントを構成するには、各 Google Cloud プロジェクトの VM 内で次のスクリプトを実行します。

#!/bin/bash

# From https://cloud.google.com/stackdriver/docs/solutions/agents/ops-agent/installation#install-latest-version
curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
bash add-google-cloud-ops-agent-repo.sh --also-install

OPS_AGENT_CONF="
logging:
    receivers:
        chrony_tracking_receiver:
            type: files
            include_paths:
                - /var/log/chrony/tracking.log
    processors:
        chrony_tracking_processor:
            type: parse_regex
            regex: \"^.*PHC0.*  (?<max_error>[-\d\.eE]+)$\"
    service:
        pipelines:
            chrony_tracking_pipeline:
                receivers: [chrony_tracking_receiver]
                processors: [chrony_tracking_processor]
"

OPS_AGENT_CONF_PATH="/etc/google-cloud-ops-agent/config.yaml"
echo "$OPS_AGENT_CONF" >"$OPS_AGENT_CONF_PATH"
systemctl restart google-cloud-ops-agent

時刻同期のモニタリングを構成する

Google Cloudプロジェクトの VM に対して時刻同期モニタリングを構成するには、Google Cloud プロジェクトに対するロギングとダッシュボードのセットアップ スクリプトを実行します。このスクリプトは、 Google Cloud プロジェクトに対する次のタスクを完了するのに役立ちます。

  • VM の Google Cloud プロジェクトに関連付けられたサービス アカウントに適切な権限を設定する。
  • VM とそのホストサーバー上のクロック間の精度を確保するために chrony が使用するログベースの指標を作成する。
  • 次の指標を組み合わせて、VM クロックの UTC へのトレーサビリティを測定するダッシュボードを作成する。
    • VM ホストのクロックの UTC に対する精度。これはGoogle Cloud 指標 instance/clock_accuracy/ptp_kvm/nanosecond_accuracy として使用できます。
    • VM のクロックのホストクロックに対する精度を測定する chrony 指標。

上記のタスクを行うには、次のスクリプトを実行します。

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: time-sync-logging-dashboard.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

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"

cp clock-error-metric.json /tmp/clock-error-metric.json
sed -i "s/PROJECT_ID/${PROJECT_ID}/" /tmp/clock-error-metric.json

gcloud logging metrics create --project "${PROJECT_ID}" phc-clock-max-error-gce --config-from-file=/tmp/clock-error-metric.json
gcloud monitoring dashboards create --project "${PROJECT_ID}" --config-from-file=metric-dashboard.json

スクリプトの実行が完了したら、作成されたダッシュボードを使用して、プロジェクトの VM のクロック精度データを表示します。

次のステップ