目次

参考:金融取引システム・高頻度取引(HFT)に必要なネットワーク

LinuxでPTPを使い、正確な時刻にする(ハードウェアタイムスタンプ)



LinuxでPTPを利用する方法

最近は、linuxptp(ptp4l)が一般的に使われています。
RedHatの最近のマニュアルでも詳しく書かれています。

パッケージ名デーモン名 説明
linuxptp ptp4l ハードウェアタイムスタンプ対応
ptpd, ptpd2 ptpd, ptpd2 ハードウェアタイムスタンプ非対応


PTPを利用するための知識

ハードウェアタイムスタンプ

ハードウェアタイムスタンプは、一部の NIC(Network Interface Controller)でサポートされている機能です。
送受信されるパケットの正確なタイムスタンプを提供します。
ハードウェアのタイムスタンプを有効にしていると、パケットがリンク層または物理層に出入りする際に、NIC 独自のクロックを使用してタイムスタンプを生成します。

ハードウェアタイムスタンプのサポートしているNICか確認

~]# ethtool -T eth0

Timestamping parameters for eth0:
Capabilities:
        hardware-transmit     (SOF_TIMESTAMPING_TX_HARDWARE)
        software-transmit     (SOF_TIMESTAMPING_TX_SOFTWARE)
        hardware-receive      (SOF_TIMESTAMPING_RX_HARDWARE)
        software-receive      (SOF_TIMESTAMPING_RX_SOFTWARE)
        software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
        hardware-raw-clock    (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
        off                   (HWTSTAMP_TX_OFF)
        on                    (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
        none                  (HWTSTAMP_FILTER_NONE)
        all                   (HWTSTAMP_FILTER_ALL)
        ptpv1-l4-sync         (HWTSTAMP_FILTER_PTP_V1_L4_SYNC)
        ptpv1-l4-delay-req    (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ)
        ptpv2-l4-sync         (HWTSTAMP_FILTER_PTP_V2_L4_SYNC)
        ptpv2-l4-delay-req    (HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ)
        ptpv2-l2-sync         (HWTSTAMP_FILTER_PTP_V2_L2_SYNC)
        ptpv2-l2-delay-req    (HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ)
        ptpv2-event           (HWTSTAMP_FILTER_PTP_V2_EVENT)
        ptpv2-sync            (HWTSTAMP_FILTER_PTP_V2_SYNC)
        ptpv2-delay-req       (HWTSTAMP_FILTER_PTP_V2_DELAY_REQ)

ハードウェアタイムスタンプのサポートするNIC

ソフトウェアタイムスタンプのサポートするNIC




ptp4l(PTP for Linux)

ptp4lインストール

~]# yum install linuxptp

ptp4l と phc2sysがインストールされます

ptp4l NIC 上の PTP ハードウェアクロック (PHC) をマスターと同期します。
ハードウェアタイムスタンプでは PTP ハードウェアクロックのマスタークロックとの同期に使用され、
ソフトウェアタイムスタンプではシステムクロックのマスタークロックとの同期に使用されます。
phc2sys システムクロックを NIC 上の PTP ハードウェアクロック (PHC) と同期するために使用されます。

システムクロックの時間を設定するサービス
システムクロックの時間を設定するサービスは、1つを利用します。

ptp4lの手動設定

NIC 上の PTP クロックがマスターに同期されます。

~]# ptp4l -i eth3 -m
~]# ptp4l -i eth3 -m -S   <- -Sで、ソフトウェアタイムスタンプを有効
~]# ptp4l -i eth1 -m -S -s    <-  -s スレーブモード

※Grandmaster(グランドマスタークロック)が時刻の配信を行い、
  「**スレーブ**」が時刻を受け取る側。
出力例

https://www.belbel.or.jp/opensuse-manuals_ja/cha-tuning-ptp.html#tuning-ptp-phc2sys

# ptp4l -m -i eth0
selected eth0 as PTP clock
port 1: INITIALIZING to LISTENING on INITIALIZE
port 0: INITIALIZING to LISTENING on INITIALIZE
port 1: new foreign master 00a152.fffe.0b334d-1
selected best master clock 00a152.fffe.0b334d
port 1: LISTENING to UNCALIBRATED on RS_SLAVE
master offset -25937 s0 freq +0 path delay       12340
master offset -27887 s0 freq +0 path delay       14232
master offset -38802 s0 freq +0 path delay       13847
master offset -36205 s1 freq +0 path delay       10623
master offset  -6975 s2 freq -30575 path delay   10286
port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
master offset  -4284 s2 freq -30135 path delay    9892
master offset マスターとの時刻差 (ナノ秒単位)
freq クロックの周波数調整値 (単位は ppb で、 10 億あたりの値)
path delay マスターから送信された同期メッセージの見積もり遅延時間 (単位はナノ秒)

1,000,000ナノ秒(ns) = 1,000マイクロ秒(µs) = 1ミリ秒(ms)
1,000ナノ秒(ns) = 1マイクロ秒(µs) = 0.001ミリ秒(ms)

Port 0 はローカルの PTP 管理向けに Unix ドメインソケットを使用する意味です。
Port 1 は eth0 インターフェイスの意味です。

INITIALIZING , LISTENING , UNCALIBRATED , SLAVE の表示は、
それぞれ INITIALIZE , RS_SLAVE , MASTER_CLOCK_SELECTED のイベントに対するポート状態の変更例です。
ポートの状態が UNCALIBRATED から SLAVE に変化すると、コンピュータは PTP のマスタークロックと同期が成功していることを表わします。


ptp4l をサービス設定

/usr/lib/systemd/system/ptp4l.serviceで設定する場合

[Unit]
Description=Precision Time Protocol (PTP) service

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/ptp4l
ExecStart=/usr/sbin/ptp4l -i eth1 -m
ExecStop=/bin/pkill -f ptp4l

[Install]
WantedBy=multi-user.target


ハードウエアタイムスタンプ機能を利用した従属クロック

/etc/sysconfig/ptp4l

OPTIONS="-f /etc/ptp4l.conf -i ethX"

/etc/ptp4l.conf

変更なし


ソフトウエアタイムスタンプ機能を利用した従属クロック

/etc/sysconfig/ptp4l
「-S」で、ソフトウエアタイムスタンプ

OPTIONS="-f /etc/ptp4l.conf -i ethX -S"

/etc/ptp4l.conf

変更なし


ptp4lのログ出力を減らす

ptp4lは、システムログ(/var/log/messages)に出力しますが、出力するタイミングを変更することができます。
/etc/ptp4l.conf

summary_interval 2   <- 4 (= 2^2) 秒ごとにメッセージを出力
summary_interval 3   <- 8 (= 2^3) 秒ごとにメッセージを出力
summary_interval 4   <- 8 (= 2^4) 秒ごとにメッセージを出力
summary_interval 5   <- 8 (= 2^5) 秒ごとにメッセージを出力
summary_interval 6   <- 64 (= 2^6) 秒ごとにメッセージを出力  ★このくらいでいいかな。
summary_interval 10   <- 1024 (= 2^10) 秒ごとにメッセージを出力

ptp4lのシステムログ(/var/log/messages)に出力例

ptp4l[359.224]: master offset       3304 s0 freq      +0 path delay      9202
ptp4l[360.224]: master offset       3708 s1 freq  -28492 path delay      9202
ptp4l[361.224]: master offset      -3145 s2 freq  -32637 path delay      9202
ptp4l[361.224]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[362.223]: master offset       -145 s2 freq  -30580 path delay      9202
ptp4l[363.223]: master offset       1043 s2 freq  -28436 path delay      8972


pp4l サービスの起動

~]# systemctl start ptp4l  <- 起動
~]# systemctl enable ptp4l <- OS起動時にptp4lサービスを起動させる


pp4l の同期確認

PTP 管理クライアントである pmc を使うと、以下のように ptp4l から追加情報を取得することができます。
※pcmコマンドは、ptp4lサービスの起動が必要が必要

~]# pmc -u -b 0 'GET CURRENT_DATA_SET'
sending: GET CURRENT_DATA_SET
    90e2ba.fffe.20c7f8-0 seq 0 RESPONSE MANAGMENT CURRENT_DATA_SET
        stepsRemoved    1
        offsetFromMaster -142.0
        meanPathDelay   9310.0
stepsRemoved グランドマスタークロックへの通信パスの数です。
offsetFromMaster
master_offset
マスターから最後に測定されたオフセットをナノ秒で表します。
meanPathDelay マスターから送信された同期メッセージの遅延予測をナノ秒で表します。
~]# pmc -u -b 0 'GET TIME_STATUS_NP'
sending: GET TIME_STATUS_NP
    90e2ba.fffe.20c7f8-0 seq 0 RESPONSE MANAGMENT TIME_STATUS_NP
        master_offset       310
        ingress_time        1361545089345029441
        cumulativeScaledRateOffset  +1.000000000
        scaledLastGmPhaseChange  0
        gmTimeBaseIndicator    0
        lastGmPhaseChange     0x0000'0000000000000000.0000
        gmPresent         true
        gmIdentity         00a069.fffe.0b552d




phc2sysによるシステムクロックの同期

phc2sys を使用することで、システムクロックをネットワークカードに搭載された PTP ハードウエアクロック (PHC) に同期させることができます。
システムクロックは スレーブ 、ネットワークカード側は マスター として動作することになります。

phc2sysで同期する場合、chronyなどは無効にする必要があります。

phc2sysの手動実行

phc2sys -s eth0 -w

phc2sysサービス

/etc/sysconfig/phc2sys
OPTIONS="-a -r"    <- デフォルトのまま
-a オプション  phc2sys は ptp4l アプリケーションから同期されているクロックを読み取ります。
これは、PTP ポートの状態の変更に従い、NIC ハードウェアクロック間の同期を適宜調整します

OPTIONS="-a -r -u 10"    <- messagesへ10秒ごとに出力(デフォルトでは1秒間隔)

OPTIONS="-s eth0 -w"
-s オプションを指定して、システムクロックを特定のインターフェースの PTP ハードウェアクロックに同期します。

-w オプションは、実行中の ptp4l アプリケーションが PTP クロックを同期するまで待機し、
   ptp4l から、TAI から UTC のオフセットを取得します。
systemctl disable chronyd
systemctl stop chronyd

systemctl start phc2sys
systemctl enable phc2sys



phc2sysのシステムログ(/var/log/messages)への出力例

phc2sys[628.628]: phc offset     66341 s0 freq      +0 delay   2729
phc2sys[629.628]: phc offset     64668 s1 freq  -37690 delay   2726
phc2sys[646.630]: phc offset      -333 s2 freq  -37426 delay   2747
phc2sys[646.630]: phc offset       194 s2 freq  -36999 delay   2749




メモ

phc2sysではなく、chronyでハードウェアタイムスタンプを利用する例

phc2sysではなく、chronyでもシステム同期ができます。

/etc/chrony.conf

hwtimestamp eth0
hwtimestamp eth1

もしくは

hwtimestamp *

1 秒のポーリング間隔を使用してローカルの NTP サーバーを指定

server ntp.local minpoll 0 maxpoll 0


正確なファイルのタイムスタンプを表示(ls --full-time)

[user1@server log]$ cd /etc
[user1@server etc]$ ls --full-time
合計 1696
-rw-r--r--.  1 root root     5090 2016-02-17 00:08:39.000000000 +0900 DIR_COLORS
-rw-r--r--.  1 root root     5725 2016-02-17 00:08:39.000000000 +0900 DIR_COLORS.256color
-rw-r--r--.  1 root root     4669 2016-02-17 00:08:39.000000000 +0900 DIR_COLORS.lightbgcolor
-rw-r--r--.  1 root root       94 2015-04-29 23:30:23.000000000 +0900 GREP_COLORS
-rw-r--r--   1 root root      842 2014-06-10 07:39:58.000000000 +0900 GeoIP.conf
-rw-r--r--   1 root root      858 2014-06-10 07:39:58.000000000 +0900 GeoIP.conf.default
drwxr-xr-x.  7 root root     4096 2015-12-24 14:03:25.977000000 +0900 NetworkManager
drwxr-xr-x.  5 root root       54 2019-05-06 21:51:45.166047275 +0900 X11
drwxr-xr-x.  3 root root       97 2015-12-24 14:03:21.634000000 +0900 abrt
-rw-r--r--.  1 root root       16 2015-12-24 14:05:52.501000000 +0900 adjtime
-rw-r--r--.  1 root root     1518 2013-06-07 23:31:32.000000000 +0900 aliases
-rw-r--r--.  1 root root    12288 2015-12-24 14:12:21.701000000 +0900 aliases.db
drwxr-xr-x.  2 root root     4096 2016-02-17 13:42:36.459000000 +0900 alternatives
(略)





参考