このごろ、夜間にフレッツの混み具合がひどくなっています。大容量転送をしなければ支障が出るレベルではありませんが、遅延もひどく、ntp の delay が通常の20ms弱から60ms超へとひどく遅延しています。

夜間になるとひどく遅延が大きくなり、時刻合わせに影響が出る。
夜間になるとひどく遅延が大きくなり、時刻合わせにミリ秒レベルの影響が出る。

このグラフは時刻合わせ(ntp)のモニターなのですが、時刻サーバまでの通信時間(緑)が毎晩大きくなり、時間のジッタ(不確定さ)(橙)も15~20msまで悪化しています。こんなに時刻が揺らいでしまっては、この時間帯は時刻サーバを無視したほうがマシです。

そこで、ネットワーク経由以外の時刻合わせを使う事にしました。GPS信号を受信し、シリアルポートのキャリア検出か、パラレルポートのACKに標準時パルスを入力してやれば、ネットワークの混雑でも悪化しない、正確な stratum 0 の ntpd サーバを作る事ができます。

と言うわけで工作。

GPSモジュールをUSBとパラレルポートに接続する回路の製作
GPSモジュールをUSBとパラレルポートに接続する回路の製作

黒いボックスがオールインワンのGPSモジュールです。こいつに電源を繋いで、データ入出力をUSBでサーバに取りこみます。ユニバーサル基板は高校生の時のストックを切って使いました。

GPS の制御・受信情報は、シリアル-USB 変換をして USB ポートから /dev/ttyUSB0 (Windows だと COM3)として入力します。同時に、USBから 5V-DC の電源をとります。電源電圧が、USBは5V、GPSモジュールは3.3Vと異なるので、レギュレータで変圧します。消費電力が小さいのでヒートシンクはいらないでしょう。定石通り、手持ちのキャパシタ(電解+セラミック)を適当にいれます。

パラレルポートへのパルス信号は、アメリカの標準時計。日本の時計と秒刻みのズレは無いものの、何かちょっと悔しいですね。このパルスで正確に割込を入れるため、カーネルレベルで強い割込のかかるパラレルポートの ACK# ピンを使いました(IRQ4)。このケーブルは脱着式にしたかったので、ノイズに強く高周波を通す Ethernet (cat.5e) ケーブルを転用。PoE 対応なので DC から100MHzまで結構何でも通しちゃう優れものの万能ケーブルで、しかも安価で手に入りやすい。

パルス出力は 2.8V と中途半端ですが、パラレルポートの TTL には High に判別されるのでTTL変換は使いません。タイミングが命なのにバッファを入れたくないかなと(でももっとタイミングがシビアなメモリはバッファが入ってますね)。LED直挿しなのはお許しを。

これが正確に1秒を刻みます。パラレルポートの ACK# はカーネルに強い割込をかけられるので、このパルスのタイミングを高精度(およそ数十ナノ秒)に取りこむことができます。USBでは無理な、レガシーデバイスが活躍する場面です。

あとは、この回路での遅延などを計測・調整すれば、最上位 stratum 0 の ntpd サーバのできあがりです。

この標準時を使い始めたあと、先ほどのネットワーク経由の時刻合わせを見てみると…

夜間に遅延がひどいntpd

遅延(緑)が大きくなるときは、上りより下りの遅延の方が悪化がひどく、ジッタ(橙)だけでなくオフセット(青)も大きく(10~20ミリ秒)ずれていることがわかりました。これはかなりひどいですね。簡易な GPS-NTPD でも、stratum 0 で 100ns、ネット越しの stratum 1 で、10ms の精度が安定して確保できます。

安定しているときのオフセットが 0 になるように、ローカルの PPS Delay を調整して追い込んでいけば、100ns 以下の精度が出ます。

サーバに手を入れたくない場合は、Raspberry Pi 等を使って、単独 ntpd サーバを作る事もできます。拠点間で時刻を正確に合わせたい場合や、マイナンバー関連で局所ネットワークがインターネットから切り離しているパソコンの時刻合わせなどに使えると思います。時刻の合わない端末がある方はご相談下さい。


Comments are closed