U4 Compute Engine インスタンスの正確な時刻を構成する
このページでは、U4 Compute Engine インスタンスの正確な時刻を構成する方法と、時刻同期の精度を確認できるようにモニタリングを構成する方法について説明します。
仕組み
Google Cloud 超低レイテンシ(ULL)ソリューションは、Firefly クロック同期プロトコルを使用して、ナノ秒レベルの同期を実現します。Firefly は自動的に次の処理を行います。
- 内部同期を実行して、すべての U4 インスタンス ホストサーバーの物理ネットワーク インターフェース(NIC)クロックを相互に同期します。
- 外部同期を実行して、すべての U4 インスタンス ホストサーバーの物理 NIC クロックを協定世界時(UTC)に同期します。
U4 インスタンスを実行するホストサーバーの物理 NIC クロックは Firefly によって自動的に同期されるため、インスタンスのシステム クロックをホストサーバーの物理 NIC クロックと同期することで、インスタンスの正確な時刻を構成できます。
Firefly の詳細については、 Google Cloud ブログ投稿「Understanding the Firefly clock synchronization protocol」をご覧ください。
始める前に
U4 Compute Engine インスタンスの正確な時刻を構成する前に、次の要件を満たす必要があります。
U4 インスタンスを作成する
まだ作成していない場合は、U4 Compute Engine インスタンスを作成します。ユースケースに対応する手順をご覧ください。
- U4P インスタンスまたは U4C インスタンスを作成するには、ULL Compute Engine インスタンスを作成するをご覧ください。
- U4S インスタンスを作成するには、補助ワークロード用の非 ULL Compute Engine インスタンスを作成するをご覧ください。
他の時刻同期サービスが実行されていないことを確認する
このページの手順では、推奨されるクロック同期クライアントとして chrony を使用します。開始する前に、インスタンスで ntpd、systemd-timesyncd、phc2sys などの他のクロック同期サービスが実行されていないことを確認してください。これらのサービスとの予期しないやり取りにより、chrony 構成でエラーが発生することがあります。
chrony バージョン 4.7 以降では、次のコマンドを実行して、他のクロック同期サービスの chronyd 警告ログを確認できます。
journalctl -u chronyd
別の時刻同期サービスが実行されている場合、出力には System clock interference detected (another NTP client?) などの警告メッセージが含まれます。
ネットワーク インターフェース名を取得する
ゲスト OS によって割り当てられたインスタンスの仮想ネットワーク インターフェース(vNIC)の名前を取得します。 Google Cloud では nic0 や nic1 などの名前が使用されますが、ゲスト OS の命名形式は enp22s0f0 や ens8f0 など、異なります。
vNIC 名を順番に一覧表示するには、次のコマンドを実行します。
find /sys/class/net -type l -not -lname '*virtual*' -printf '%l %f\n' | sort | awk '{print $2}'
ネットワーク ドライバが安定した後にのみ読み込まれるように chrony を構成する
場合によっては、systemd がネットワーク インターフェース ドライバの初期化が完了する前に chrony を読み込むことがあります。この場合、PTP ハードウェア クロック(PHC)デバイスを初期化できないため、chrony の起動に失敗する可能性があります。
上記の問題を回避するには、次の手順で chrony の systemd ユニットファイルをオーバーライドして、PHC デバイスの準備が整うまで待機します。U4C インスタンスで DPDK を使用している場合は、[DPDK 構成] タブを選択します。
標準構成
edit コマンドを実行します。
systemctl edit chronyd
インスタンス タイプに対応するオーバーライドを追加します。
U4P インスタンスと U4C インスタンスの場合:
[Unit] After=dev-ptp0.device dev-ptp1.device dev-ptp2.device Requires=dev-ptp0.device dev-ptp1.device dev-ptp2.device
U4S インスタンスの場合:
[Unit] After=dev-ptp0.device Requires=dev-ptp0.device
サービスを再起動します。以前に実行した
systemctl editコマンドはデーモンを自動的に再読み込みしましたが、次のコマンドを実行して、変更後にchronyが実行されていることを確認することをおすすめします。systemctl restart chronyd
DPDK 構成
U4C インスタンスで DPDK を使用している場合は、
nic0に関連付けられている PHC デバイスのインデックス番号を取得します。DPDK は ULL ネットワーク インターフェース(
nic1とnic2)をユーザー空間にバインドするため、nic0は PTP デバイスをカーネルに公開する唯一のインターフェースです。次のコマンドを実行し、後のステップで使用するために
PTP Hardware Clock:NUMBERの値を記録します。ethtool -T NIC0
NIC0は、nic0インターフェースの名前(enp22s0f0など)に置き換えます。edit コマンドを実行します。
systemctl edit chronyd
次のオーバーライドを追加します。
[Unit] After=dev-ptpNUMBER.device Requires=dev-ptpNUMBER.device
NUMBERは、ステップ 1 で取得した PHC デバイスのインデックス番号に置き換えます。サービスを再起動します。前に実行した
systemctl editコマンドでデーモンが自動的に再読み込みされますが、変更後にchronyが実行されていることを確認するために、次のコマンドを実行することをおすすめします。systemctl restart chronyd
Firefly 同期物理 NIC クロックを使用するように chrony を構成する
このセクションでは、インスタンスのシステムクロックを、Firefly によってすでに同期されているインスタンスのホストサーバーの物理 NIC クロックに同期するように chrony を構成する方法について説明します。
ゲスト OS(enp22s0f0 など)に表示される U4 インスタンスの仮想ネットワーク インターフェース(vNIC)は、インスタンスのホストサーバー上の物理 NIC にマッピングされます。特定の vNIC は、対応する PTP ハードウェア クロック(PHC)デバイスを使用して、物理 NIC クロックにアクセスできます。
Linux の PHC デバイス名の形式は
/dev/ptpNUMBERです。ここで、NUMBERは、デバイスの初期化順序に従って Linux カーネルによって決定されます。たとえば、PHC デバイス名/dev/ptp0、/dev/ptp1、/dev/ptp2を参照してください。物理 NIC クロックを同期のソースとして指定するには、
chrony構成で対応する PHC デバイスを使用するか、解決する必要があります。
以降の各セクションでは、前述の要件に従って chrony を構成する方法の例を示します。インスタンス タイプと chrony バージョンに対応するセクションをご覧ください。
- U4P インスタンスと U4C インスタンスで
chrony4.7 以降を構成する - U4P インスタンスと U4C インスタンスで
chrony4.6.1 以前を構成する - U4S インスタンスで
chrony4.7 以降を構成する
U4P インスタンスと U4C インスタンスで chrony 4.7 以降を構成する
chrony バージョン 4.7 以降では、vNIC 名をクロックソースとして指定し、物理 NIC クロックを表す対応する PTP ハードウェア クロック(PHC)デバイスに自動的に解決できます。
標準構成
U4P または U4C インスタンスで chrony バージョン 4.7 以降を構成するには、次の操作を行います。
chrony構成ファイル/etc/chrony.confに次の内容を追加します。このファイルには、次の構成のみが含まれている必要があります。ファイルの既存のコンテンツを削除または上書きしてください。# 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
NIC0、NIC1、NIC2は、前に取得した対応する名前に置き換えます。必要に応じて、ネットワーク インターフェース名を取得するをご覧ください。構成を適用するには、次のコマンドを実行して
chronyを再起動します。systemctl restart chronyd
chrony は、NIC1 の PTP ハードウェア クロックをタイムソースとして使用して、クロック同期統計情報を /var/log/chrony/tracking.log に記録します。
DPDK 構成
DPDK を使用する U4C インスタンスで chrony バージョン 4.7 以降を構成するには、次の操作を行います。
chrony構成ファイル/etc/chrony.confに次の内容を追加します。このファイルには、次の構成のみが含まれている必要があります。ファイルに既存のコンテンツがある場合は、削除または上書きしてください。# 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
NIC0は、先ほど取得した対応する名前に置き換えます。必要に応じて、ネットワーク インターフェース名を取得するをご覧ください。構成を適用するには、次のコマンドを実行して
chronyを再起動します。systemctl restart chronyd
chrony は、NIC0 の PTP ハードウェア クロックをタイムソースとして使用して、クロック同期統計情報を /var/log/chrony/tracking.log に記録します。
U4P インスタンスと U4C インスタンスで chrony 4.6.1 以前を構成する
chrony バージョン 4.6.1 以前では、構成ファイルで PTP ハードウェア クロック(PHC)デバイス名を手動で指定する必要があります。
標準構成
U4P インスタンスまたは U4C インスタンスで chrony バージョン 4.6.1 以前を構成するには、次の操作を行います。
vNIC に関連付けられた PHC デバイスのインデックス番号を取得します。次の例では、最初の vNIC を使用しています。
ethtool -T NIC0
NIC0は、以前に取得した対応する名前(enp22s0f0など)に置き換えます。必要に応じて、ネットワーク インターフェース名を取得するをご覧ください。PTP Hardware Clock:NUMBERの出力を確認します。この出力例は、
/dev/ptp1に対応するPTP Hardware Clock: 1を示しています。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
chrony構成ファイル/etc/chrony.confに次の内容を追加します。このファイルには、次の構成のみが含まれている必要があります。ファイルの既存のコンテンツを削除または上書きしてください。前の手順の
ethtool出力は、enp22s0f0が/dev/ptp1を使用していることを示しています。次の例では、refclock PHC /dev/ptp1:nocrossts poll -1を指定して、システム クロックをenp22s0f0の対応する物理 NIC クロックに同期します。# 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
構成を適用するには、次のコマンドを実行して
chronyを再起動します。systemctl restart chronyd
chrony は、選択した PTP ハードウェア クロックをタイムソースとして使用して、クロック同期の統計情報を /var/log/chrony/tracking.log に記録します。
DPDK の構成
DPDK を使用する U4C インスタンスで chrony バージョン 4.6.1 以前を構成する手順は次のとおりです。
nic0vNIC に関連付けられた PHC デバイスのインデックス番号を取得します。ethtool -T NIC0
NIC0は、以前に取得した対応する名前(enp22s0f0など)に置き換えます。必要に応じて、ネットワーク インターフェース名を取得するをご覧ください。PTP Hardware Clock:NUMBERの出力を確認するこの出力例は、
/dev/ptp0に対応するPTP Hardware Clock: 0を示しています。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
chrony構成ファイル/etc/chrony.confに次の内容を追加します。このファイルには、次の構成のみが含まれている必要があります。ファイルの既存のコンテンツを削除または上書きしてください。前の手順の
ethtool出力は、enp22s0f0が/dev/ptp0を使用していることを示しています。次の例では、refclock PHC /dev/ptp0:nocrossts poll -1を指定して、システム クロックをenp22s0f0の対応する物理 NIC クロックに同期します。# 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
構成を適用するには、次のコマンドを実行して
chronyを再起動します。systemctl restart chronyd
chrony は、選択した PTP ハードウェア クロックをタイムソースとして使用して、クロック同期の統計情報を /var/log/chrony/tracking.log に記録します。
U4S インスタンスで chrony 4.7 以降を構成する
U4S インスタンスには chrony バージョン 4.7 以降を使用することをおすすめします。以前のバージョンを使用すると、仮想マシン(VM)インスタンスの Compute Engine クロック同期デバイス(ptp_kvm)によって PTP ハードウェア クロック(PHC)デバイスのインデックス番号が変更される可能性があるため、エラーが頻繁に発生する可能性があります。
U4S インスタンスのこの構成例は、U4P インスタンスと U4C インスタンスで使用される構成と似ていますが、次の違いがあります。
- この例には、1 つの vNIC が含まれています。U4S インスタンスには複数の vNIC を設定できますが、すべての vNIC は同じ物理 NIC に基づいており、同じ物理 NIC クロックにアクセスします。
- Precision Time Measurement(PTM)は利用できません。
U4S インスタンスで chrony バージョン 4.7 以降を構成する手順は次のとおりです。
chrony構成ファイル/etc/chrony.confに次の内容を追加します。このファイルには、次の構成のみが含まれている必要があります。ファイルの既存のコンテンツを削除または上書きしてください。# 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
NIC0は、以前に取得した対応する名前(enp22s0f0など)に置き換えます。必要に応じて、ネットワーク インターフェース名を取得するをご覧ください。構成を適用するには、次のコマンドを実行して
chronyを再起動します。systemctl restart chronyd
chronyは、NIC0の PTP ハードウェア クロックをタイムソースとして使用して、クロック同期統計情報を/var/log/chrony/tracking.logに記録します。
chrony の構成を確認する
chrony が正しく構成されていることを確認するには、次のコマンドを実行します。
chronyc sourcestats
構成が成功すると、次のような出力が表示されます。
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
コマンドから予期しない出力が返された場合は、トラブルシューティングをご覧ください。
chrony 構成を変更する
インスタンスのシステム クロックを同期する物理 NIC を変更する場合は、次のように構成を更新します。
- 対応する物理 NIC クロックを使用する vNIC 名を含む行から
noselectを削除します。 - 対応する物理 NIC クロックの使用を停止する vNIC 名を含む行に
noselectを追加します。 chronydを再起動して新しい構成を適用します。systemctl restart chronyd
時刻同期をモニタリングする
このセクションでは、時刻同期に使用できる指標と、それらを使用して時刻同期の精度をモニタリングする方法について説明します。
時刻同期に使用できる指標
次の指標を使用して、時刻同期をモニタリングできます。
| 測定 | 使用可能な指標と説明 |
|---|---|
| インスタンスのシステム クロックから物理 NIC のクロック |
logging.googleapis.com/user/phc-clock-max-error
この指標は、インスタンス システムクロックのホストサーバーの物理 NIC クロックに対する同期の精度を測定します。 この指標は、インスタンスのシステム クロックのカスタム指標を構成するの説明に沿って、Ops エージェントから収集し、ログベースの指標を作成して構成する必要があります。この指標は、カスタム ダッシュボードも作成します。また、Cloud Monitoring の指標を使用するで説明されている手順で、この指標を使用することもできます。 |
| 物理 NIC クロックから UTC |
compute.googleapis.com/instance/time/firefly_utc_traceable_uncertainty
この指標は、実際の UTC 時刻と比較した物理 NIC クロックの最大誤差範囲を表します。これは自動的に Cloud Monitoring に報告されます。 この指標を表示し、アラート ポリシーを定義して、Cloud Monitoring の指標を使用するの説明に沿ってカスタム ダッシュボードを作成します。この指標は、インスタンスのシステム クロックのカスタム指標を構成するのスクリプトで作成されたダッシュボードにも含まれています。 |
| 物理 NIC クロックの一般的なヘルス ステータス |
compute.googleapis.com/instance/time/firefly_nic_sync_healthy
このブール値指標は、NIC 間同期と NIC から UTC への同期の両方を含む、物理 NIC クロックの一般的な健全性ステータスを示します。これは Cloud Monitoring に自動的に報告されます。 この指標を表示し、アラート ポリシーを定義して、Cloud Monitoring の指標を使用するの説明に沿ってカスタム ダッシュボードを作成します。 |
Cloud Monitoring が指標データを保持する期間については、Cloud Monitoring の割り当てと上限のデータの保持をご覧ください。長期的な分析のために指標をエクスポートする方法については、Cloud アーキテクチャ センターのドキュメントの Cloud Monitoring 指標のエクスポートをご覧ください。
インスタンスのシステム クロックのカスタム指標を構成する
このセクションでは、次の処理を行うモニタリング構成の例を示します。
- インスタンスから同期精度の
chronyのログを収集するように Ops エージェントを構成します。 - プロジェクト内のすべてのインスタンスから対応するログをログベースの指標として取り込むように Cloud Monitoring を構成します。
インスタンスで Google Cloud Ops エージェントを構成する
モニタリングに必要な指標を収集するように Ops エージェントを構成する手順は次のとおりです。
まだインストールしていない場合は、インスタンスに Ops エージェントをインストールします。
/etc/google-cloud-ops-agent/config.yamlファイルに次の構成を追加します。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]
次のコマンドを実行して、Ops エージェントを再起動します。
systemctl restart google-cloud-ops-agent
プロジェクトでログベースの指標とダッシュボードを構成する
プロジェクトのインスタンスに対して時刻同期モニタリングを構成するには、次のロギングとダッシュボードのセットアップ スクリプトを実行します。このスクリプトは、次のタスクを行うのに役立ちます。
- インスタンスのプロジェクトに関連付けられたサービス アカウントに適切な権限を設定する。このスクリプトは、インスタンスに使用されるサービス アカウントがプロジェクトのデフォルトのサービス アカウントであることを前提としています。必要に応じて、
SERVICE_ACCOUNT_EMAILを別の値に置き換えます。 - インスタンスのシステム クロックとインスタンスのホストサーバー上の物理 NIC クロック間の時刻同期の精度を測定するログベースの指標を作成する。
- カスタム ログベースの指標と使用可能な Firefly 指標に基づいて、インスタンスの個々の時刻同期精度と結合された時刻同期精度を表示するダッシュボードが作成されます。
上記のタスクを行うには、次のスクリプトを実行します。スクリプトの実行が完了したら、作成されたダッシュボードを使用して、プロジェクトのインスタンスのクロック精度データを表示します。
#!/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 の指標を使用する
以降のセクションでは、Cloud Monitoring 指標の使用方法について説明します。以下のセクションでは、時刻同期に使用できる指標をそれぞれ使用できます。
Google Cloud コンソールに加えて、カスタム ダッシュボードを作成して、アラートをセットアップし、Monitoring API を使用して指標をクエリできます。
Monitoring で指標を表示する
このセクションでは、Monitoring で指標を表示する方法について説明します。
コンソール
Metrics Explorer を使用してモニタリング対象リソースの指標を表示するには、次の操作を行います。
-
Google Cloud コンソールで leaderboard [Metrics explorer] のページに移動します。
検索バーを使用してこのページを検索する場合は、小見出しが [Monitoring] である結果を選択します。
- Google Cloud コンソールのツールバーで、 Google Cloud プロジェクトを選択します。App Hub の構成には、App Hub ホスト プロジェクトまたはアプリ対応フォルダの管理プロジェクトを選択します。
- [指標] 要素の [指標を選択] メニューを開いてフィルタバーに「
VM instance」と入力し、サブメニューを使用して特定のリソースタイプと指標を選択します。- [有効なリソース] メニューで、[VM インスタンス] を選択します。
- 指標を選択するには、[有効な指標カテゴリ] メニューと [有効な指標] メニューを使用します。 使用可能な指標のリストについては、時刻同期に使用可能な指標をご覧ください。
- [適用] をクリックします。
クエリ結果から時系列を削除するフィルタを追加するには、[フィルタ] 要素を使用します。
- データの表示方法を構成します。デフォルトでは、すべてのインスタンスと物理 NIC の指標が集計されて表示されます。NIC ごと、インスタンスごとの指標を表示するには、[集計] 要素で [未集計] を選択します。
グラフの構成の詳細については、Metrics Explorer 使用時の指標の選択をご覧ください。
アラート ポリシーを定義する
このセクションでは、アラート ポリシーを定義する方法について説明します。
データの到着が停止した場合に Monitoring が条件を評価する方法を構成する場合は、欠落データポイントが、ポリシーに違反する値として扱われるオプションをおすすめします。このオプションは、サイレント データ損失の検出に役立ちます。ただし、この設定では、インスタンスが削除されたときに誤検出アラートが発生します。
コンソール
アラート ポリシーを作成して指標の値をモニタリングすると、指標が条件に違反した場合に通知できます。
-
Google Cloud コンソールで、notifications [アラート] ページに移動します。
検索バーを使用してこのページを検索する場合は、小見出しが [Monitoring] の結果を選択します。
- 通知チャンネルを作成せずに通知を受け取る場合は、[EDIT NOTIFICATION CHANNELS] をクリックして、通知チャンネルを追加します。チャンネルを追加したら、[アラート] ページに戻ります。
- [アラート] ページで、[CREATE POLICY] をクリックします。
- 指標を選択するには、[指標を選択] メニューを開き、次の操作を行います。
- メニューを関連するエントリに限定するには、フィルタバーに「
VM Instance」と入力します。結果が表示されない場合は、[Show only active resources & metrics] をオフに切り替えます。 - [リソースタイプ] に [VM インスタンス] を選択します。
- [指標カテゴリ] で、[インスタンス] を選択します。
- [指標] で、時刻同期に使用可能な指標のリストから指標を選択します。
- [適用] を選択します。
- メニューを関連するエントリに限定するには、フィルタバーに「
- [次へ] をクリックします。
- [Configure alert trigger] ページの設定によって、アラートがトリガーされるタイミングが決まります。条件タイプを選択し、必要に応じてしきい値を指定します。詳細については、指標しきい値のアラート ポリシーを作成するをご覧ください。
- [次へ] をクリックします。
- (省略可)アラート ポリシーに通知を追加するには、[通知チャネル] をクリックします。ダイアログで、メニューから 1 つ以上の通知チャネルを選択し、[OK] をクリックします。
- (省略可)アラートの自動クローズ期間を更新します。このフィールドは、指標データがない場合に Monitoring がアラートを閉じるタイミングを決定します。
- (省略可)[Documentation] をクリックして、通知メッセージに追加する情報を入力します。
- [アラート名] をクリックして、アラート ポリシーの名前を入力します。
- [ポリシーを作成] をクリックします。
カスタム Monitoring ダッシュボードを作成する
このセクションでは、カスタム ダッシュボードを作成する方法について説明します。PromQL クエリを使用する具体的な例については、例: 精度指標を組み合わせたカスタム ダッシュボードを作成するをご覧ください。
コンソール
-
Google Cloud コンソールで [ ダッシュボード] ページに移動します。
検索バーを使用してこのページを検索する場合は、小見出しが [Monitoring] となっている結果を選択します。
- [ダッシュボードを作成] をクリックします。
- 省略可: ダッシュボードのタイトルを、わかりやすいダッシュボード名に更新します。
ダッシュボードに追加するウィジェットごとに、[ウィジェットを追加] をクリックし、ダイアログの項目を入力してから [適用] を選択します。
ウィジェットを追加する詳細については、以下のページをご覧ください。
例: 精度指標を組み合わせたカスタム ダッシュボードを作成する
Monitoring では、カスタム ダッシュボードを作成できます。ダッシュボードでは、時刻同期に使用可能な任意の指標を使用できます。
このセクションでは、Monitoring カスタム ダッシュボードに貼り付けることができる PromQL クエリの例を示します。PromQL の詳細については、Cloud Monitoring の PromQL をご覧ください。
このセクションのクエリは、次のものを組み合わせて、合計精度指標を生成します。
- インスタンスのシステム クロックの物理 NIC クロックに対する精度を測定する指標(
phc-clock-max-error) 物理 NIC クロックの UTC に対する精度を測定する指標(
firefly_utc_traceable_uncertainty)
コンソール
PromQL のコードエディタにアクセスする手順に沿って操作します。
テキスト フィールドに次のクエリを入力します。
( 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}]) )[クエリを実行] をクリックします。
エディタの使用方法とグラフの保存方法については、PromQL のコードエディタを使用するをご覧ください。
トラブルシューティング
chrony 構成を確認するときに、予期しない出力が表示されることがあります。たとえば、次の出力は chrony の起動に失敗したことを示しています。
506 Cannot talk to daemon
トラブルシューティングに役立てるため、chrony の journald ログを確認します。
journalctl -u chronyd.service
次の出力例は、インスタンスに以前のバージョンの chrony がインストールされているときに、chrony 4.7 以降用の構成を適用すると発生するエラーを示しています。
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.
既知の問題
U4 インスタンスの正確な時間を構成するときに、次の既知の問題が発生することがあります。
-
精度指標は、インスタンスの存続期間中にゼロ以外のトラフィックが観測されたネットワーク インターフェースに対してのみ報告されます。この問題を回避するには、
nic0を同期のクロックソースとして使用して、テレメトリーを確保します。または、すべてのネットワーク インターフェースでトラフィックがあることを確認します。