GPSのPPSを用いた、Stratum 1のNTPサーバ。
CPUがだいぶ古かったので、新しくしたら、何故かjitterが(当然offsetも)大幅に悪化。
こんなはずでは…。
環境
- OS
- Arch Linux
- kernel 4.8〜4.9 (調査中にupdateしちゃった)
- GPS/PPS/ntpd周辺 (旧環境・新環境共通)
- GPSは、Garmin GPS 18x LVC Firmware version 4.00
- PPSは、RS-232CのDCDに接続
- RS-232Cは、USB-シリアル変換経由ではなく、マザーボード上のもの (Novoton?)
- ntpdは、timepps.hを/usr/includeにコピーしてリビルドし、PPS対応に
-
/etc/ntp.conf
での時刻源は、Generic NMEA - PPSは、
# ldattach PPS /dev/ttyS0
で、/dev/pps1
を作成 (/dev/pps0
はNICがPTP向けに使用)
- 旧環境
- Pentium Dual-Core E2200
- Intel DG965SS
- jitterは平均1usec未満
- offsetは数usec (環境温度に影響される)
- 新環境
- Core i7-3770
- ASUS B75M-PLUS
- jitterが数百usecというところからスタート
自分の環境で効いた、改善ネタ
ntpdのniceオプション
ntpdの起動オプションに-N
を追加する。ntpdのソースを見ると、SCHED_FIFO
が設定される模様。設定したら、top
でもPR
がrt
と表示された。
これは効果があった(記憶では)。ざっくり、数百usec->数usec(記憶では)。
OSのアップデート等と混ぜてしまったり、旧環境との比較の記録等がなく、正確な比較はできていないが…。
ntpdが優先されて困りそうなものもないし、設定してしまう。
-N
オプションの追加方法
Arch Linuxのsystemdの場合。
-
/usr/lib/systemd/system/ntpd.service
のExecStart
に、-N
を追加 # systemctl daemon-reload
# systemctl restart ntpd.service
C state
これに気づくのが大変だった。
ArchWikiの周波数スケーリングの記事を見ながら、cpupower
に次いで、ふとi7z
を実行したところ、99%、C6 stateに居る。
C6からの割り込み応答時間は、ぱっと探したところではわからなかったが、C7からで110usecという記事を発見。C6からでも10数usecはかかりそうな予感。古いCPUには無いstateと考えると、辻褄も合う。
完全省電力Offはいまいちなので、復帰が一瞬と思われる、C1までを使うように設定する。
なお、BIOS設定は無視されるとの情報もある。
Raspberry Piなら、CPUが違うので、関係ないね。
GRUBでの設定方法
Arch Linuxで実験。ArchWikiのカーネルパラメータ参照。
-
/etc/default/grub
のGRUB_CMDLINE_LINUX_DEFAULT
に、intel_idle.max_cstate=1
を追記 # grub-mkconfig -o /boot/grub/grub.cfg
- 再起動
intel_idle.max_cstate=1
の効果を、図で
ちなみに、UPSのloadに変化は見られなかった。
その他、ググった改善ネタ
ASYNC_LOW_LATENCY
シリアルポートには、low latencyに設定するフラグがある。ただ、カーネルのソースをASYNC_LOW_LATENCY
で検索すると、USB-シリアル変換などでは効果がありそうに見えたが、16550Aドライバでの扱いは、よくわからなかった。
おまじない程度に、やっておくかな。
# setserial /dev/ttyS0 low_latency
linuxppsの例では、udevのrulesの中で、setserial
している。
PPS Kernel Discipline
PPSを、Kernel Disciplineで使う。詳細はこちら。
Raspberry Piで成功してる方もいるようだが、やってみたところ、msオーダー(?)に悪化。
dmesg
でhardpps
と表示はされたものの、自分のやり方が根本的に間違っている気がする。
ppsctl
のオプションを変えたりしたが、結果はあまり変わらなかった…。
試した内容 (間違っている気がする)
- kernelのconfigで、
CONFIG_NO_HZ=y
をやめ、CONFIG_HZ_PERIODIC=y
を選択。 - kernelを再コンパイル後、再起動。
-
こちらからpps-toolsの
ppsctl
を用意 # ppsctl -b -f -a /dev/pps1
-
/etc/ntp.conf
のfudge 127.127.20.0
のflag3
を1
に # systemctl restart ntpd.service
CPU governor
CPUクロックを高クロックで固定する。
# cpupower frequency-set -g performance
で設定できそうだが、ぶんまわしたくないので、未確認。
宿題
- 一瞬、J3455でもやってみたが、
-N
だけでも、offsetは10usec前後、jitterは1usecくらいだったんだよなぁ(記憶では)。C stateはどこに居たんだろ。Atom系のC sataeは議論があったようだが、詳細未確認。 - Kernel Disciplineは、理解未達。
- Raspberry Piでも試したいが、まずPCでやっているのは、PTP対応NICが使えるから。
一言
ArchWikiが発想の源となった。感謝。