VMの時刻同期についてまとめてみた

## はじめに
職場でVMの時刻同期について調査する機会があり、個人的に調べてみたのでまとめました。
初歩的なことばかりかと思いますがご容赦ください。

## 時刻同期について

時刻同期はコンピュータやネットワーク機器が正確な時刻を維持するための仕組みで、NTP（Network Time Protocol） が広く使用されています。
以下のように階層構造で行われています。

- Stratum 0（基準時計）
    - 正確な時刻を提供する装置（GPS衛生や原子時計など）
- Stratum 1（NTPサーバ）
    - Stratum 0 の時刻を取得して他のNTPサーバやクライアントに提供する
- Stratum 2（NTPサーバ）
    - 上位のNTPサーバーから時刻を取得してクライアントに提供する
- Stratum 3（クライアント）
    - NTPサーバーと同期してネットワーク内の時刻を統一する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4102347/d577231a-0fdb-41e3-aa72-f8714e1c1338.png)

時刻同期の流れは以下の通りです。
1. クライアントがNTPサーバに時刻情報を問い合わせます
1. NTPサーバが現在の時刻を返します
1. クライアントが、NTPサーバから受信した時刻と自身の時刻の差を比較して補正します

## 時刻同期されていないとどうなるか？
時刻同期されていない場合、以下のような問題が発生する可能性があります。

- ログの混乱
    - システムログのタイムスタンプが正しく記録されず問題の原因を特定しづらくなる
- 認証エラー
    - SSL/TLS の証明書や Kerberos 認証など、時刻に依存するセキュリティ機能が正しく動作せず、アクセス拒否される
- データの整合性問題
    - 分散システムやDBの同期処理に影響を与え、データの破損や重複が発生する
- ジョブスケジュールのずれ
    - cron などで設定された定期ジョブが想定通りのタイミングで動作しなくなる
- ネットワーク接続の問題
    - NTP の時間ズレによって、ネットワーク機器やサービスが接続を拒否することがあるため、通信トラブルの原因となる

## 許容されるズレ
時刻同期の許容範囲はシステムの用途や環境によって異なりますが、一般的な目安として以下のような基準があるようです。

- クリティカルなシステム（金融や証券など）
→　数マイクロ秒以内
- クラウドサービスなど
→　数ミリ秒以内の同期が推奨
- NW機器/通信システム
→　数十マイクロ秒～数ミリ秒


## 時刻同期のコマンド
OSによって異なりますが、時刻同期関連で使うコマンドはざっくり以下の通りです。

### Windowsの場合
- 現在時刻の表示
```
> date
2025年6月8日 21:18:07
```

- 時刻同期の状態を確認
```
> w32tm /query /status
閏インジケーター: 3 (同期未実行)
階層: 0 (未指定)
精度: -23 (ティックごとに 119.209ns)
ルート遅延: 0.0181905s
ルート分散: 11.2199796s
参照 ID: 0x00000000 (未指定)
最終正常同期時刻: 2025/06/08 20:06:05
ソース: time.windows.com,0x9
ポーリング間隔: 10 (1024s)
```

- 時刻同期を実行
```
> w32tm /resync
再同期コマンドをローカル コンピューターに送信しています
コマンドは正しく完了しました。
```

上記のコマンドが実行できない場合はWindows Timeサービスが起動していない可能性があるので、以下のコマンドでサービスを起動させます。
```sc start w32time```

### Linuxの場合
- 現在時刻の表示
```
$ date
Sun Jun  8 12:18:37 PM UTC 2025
```

- 時刻同期の状態を確認
→　`System clock synchronized`が`yes`のため時刻同期できている
```
$ timedatectl
               Local time: Thu 2025-06-05 13:58:38 UTC
           Universal time: Thu 2025-06-05 13:58:38 UTC
                 RTC time: Thu 2025-06-05 13:58:38
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```

- 時刻同期の状態を確認（chronycを利用している場合）
→　Stratum 1や2のNTPサーバーと同期しており、`RMS offset`から総合的なズレも小さいため問題ないと判断できる
```
$ chronyc tracking
Reference ID    : C200057B (any.time.nl)
Stratum         : 3
Ref time (UTC)  : Sun Jun 08 12:24:52 2025
System time     : 0.000000048 seconds fast of NTP time
Last offset     : -0.000158991 seconds
RMS offset      : 0.000158991 seconds
Frequency       : 13.325 ppm fast
Residual freq   : +0.000 ppm
Skew            : 20.952 ppm
Root delay      : 0.014651475 seconds
Root dispersion : 0.001517186 seconds
Update interval : 64.7 seconds
Leap status     : Normal
```

- 同期しているNTPサーバーの一覧を表示（chronycを利用している場合）
→　`*`がついているものが時刻同期先
```
$ chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^- prod-ntp-4.ntp1.ps5.cano>     2   6    37    39  +1390us[+1390us] +/-  132ms
^- prod-ntp-3.ntp1.ps5.cano>     2   6    17   108  +7851us[+7823us] +/-  128ms
^- alphyn.canonical.com          2   6    37    43  +1757us[+1597us] +/-  117ms
^- prod-ntp-5.ntp1.ps5.cano>     2   6    37    42  +7643us[+7643us] +/-  126ms
^* any.time.nl                   2   6    37    42  -6790ns[ -166us] +/- 7455us
^- y.ns.gin.ntt.net              2   6    37    43   -148us[ -308us] +/-   97ms
^- time.cloudflare.com           3   6    37    43    +56us[ -104us] +/-   64ms
^- 103.131.151.30                3   6    37    42   +858us[ +699us] +/-   44ms
```